我需要通过单击 URL 将 sql server 中 xml 列的内容返回给客户端。xml 具有打开正确应用程序的处理指令(在本例中为 Infopath)。
对于所有可用的各种 xmlreader 编写器和流,我有点困惑。我想我想将 SQL ExecuteXmlReader 的内容发送到 Response.OutputStream - 但我不确定如何将它们组合在一起。
谢谢是提前
我需要通过单击 URL 将 sql server 中 xml 列的内容返回给客户端。xml 具有打开正确应用程序的处理指令(在本例中为 Infopath)。
对于所有可用的各种 xmlreader 编写器和流,我有点困惑。我想我想将 SQL ExecuteXmlReader 的内容发送到 Response.OutputStream - 但我不确定如何将它们组合在一起。
谢谢是提前
我建议从数据库中获取 XML 作为文本,然后动态创建一个页面并将标头中的 MIME 类型设置为“application/xml”。这应该告诉浏览器 DTRT(假设它配置正确)。
如果您不使用 Web 应用程序,那么您可能需要考虑使用 RE 来解析文本并确定要启动的应用程序,然后将 XML 提供给它(使用临时文件或通过某种类型的输入重定向)。
由于您没有说明除了 XML 和 SQL Server 还使用了哪些技术,因此很难具体说明。
为什么不使用标准 SQL 查询数据库以获取 XML 列的内容,然后在页面中获取该内容并将该字符串流式传输回用户?
就像是:
string xmlContents = string.Empty;
using(SqlConnection _con = new SqlConnection("server=(local);database=Northwind;Integrated Security=SSPI;")
{
string queryStatement = "SELECT XmlColumn FROM dbo.MyTable WHERE id = @ID";
using(SqlCommand _cmd = new SqlCommand(queryStatement, _con)
{
_cmd.Parameters.AddWithValue("@ID", 5555);
_con.Open();
xmlContents = _cmd.ExecuteScalar().ToString(); // returns an object
_con.Close();
}
}
然后只需将 XML 流式传输回用户,例如使用 Response.Write(xmlContents) - 大致符合这些要求(不包括错误处理 - 我将把它留给你处理:-))。
这有帮助吗?
马克
SQL 2005 及更高版本支持该FOR XML
语句。看这里
例如:
SELECT * FROM MyTable FOR XML RAW;
还有其他关键字用于将 XML 标记名称调整为与数据库列不同。
然后查看 ExecuteXmlReader 文档,了解您在 C# 中使用的任何 Command 类。
我通过简单地使用带有 xml 作为文本的 Response.Write 来实现它,但我仍然不确定我是否真的应该使用 XmlReaders 和流。这是我所做的:
SqlCommand cmd = conn.CreateCommand();
cmd.CommandType = CommandType.Text;
cmd.CommandText = "select Name, InfopathDoc from document where id = @id";
cmd.Parameters.AddWithValue("@id", docId);
using (SqlDataReader dr = cmd.ExecuteReader())
{
if (dr.Read())
{
Response.ContentType = "application/xml";
Response.AppendHeader("Content-disposition", "attachment; filename=" + dr["Name"]);
Response.Write(dr["InfopathDoc"]);
}