在这个阶段我觉得很愚蠢,因为这似乎不是我应该与之抗争的任务,但是经过短暂的睡眠和 1000 个想法在我脑海中闪过,我认为我现在是锅里的青蛙,有了隧道——视觉病毒使解决方案蒙上阴影。开始:
我在 PL/SQL 中有一个查询,它使用 DBMS_XMLGEN.getxml 从几个表中将数据选择为 XML 格式(1 行,1 列是 CLOB 类型)。这完美地工作。
我的问题是将此 XML 输出返回到 C#,并询问用户他想在他的个人电脑上将此输出保存为 output.xml 文件的位置。
我将 ASP.net 与 JQuery (AJAX) 一起使用,因此在单击链接时发布到 .aspx 页面并使用返回的数据(在此实例中来自查询的 xml)进行保存。将 OLEDB 命令与 OLEDB 数据读取器一起使用似乎不是正确的方法......
这样做的最佳方法是什么?我在.net 中的序列化工作不多,但我认为这是最好的方法(根据我所做的研究)?有没有人举例说明如何在我的情况下做到这一点?
我的想法基本上是在内存中创建这个输出/文件,询问用户他想将它保存在哪里,将它保存为 .xml 文件并清除内存。
更新:好的,我设法创建了一个 XMLDocument,它很容易接受来自我的查询的 xml 输出。我怎样才能从用户那里获得关于在他的电脑上保存这个文件的位置的输入?
到目前为止我的代码:
Javascript:
function XML_ExportAppRestrictions() {
try {
var data = {"action": "exportAppRestrictions"};
var returned = AjaxLoad('Modules/Common/Common.aspx', null, data, null, null, false);
if (returned.toString().toUpperCase().substring(0, 5) == "ERROR") {
return;
}
else {
// should the file be saved here or in my aspx page using xmldoc.save?
// Using xmldoc.save will only be able to save the file on the server yes?
}
}
catch (ex) {
alert(ex.Message);
}
}
ASP:
if (Request["action"] == "exportAppRestrictions")
{
// Create and open DB connection
conn.ConnectionString = SG_Common.CommonClass.NetRegUDL;
common.OpenDBConnection(ref conn);
// Create command and set SQL statement
cmd.Connection = conn;
cmd.CommandType = System.Data.CommandType.Text;
// select text was removed below due to it's length
cmd.CommandText = "select x as AppRestrictions from dual";
rd = cmd.ExecuteReader();
if (rd.HasRows)
{
if (rd.Read())
{
str = rd["AppRestrictions"].ToString();
}
}
rd.Close();
System.Xml.XmlDocument xmldoc = new System.Xml.XmlDocument();
xmldoc.InnerXml = str;
xmldoc.Save("c:\\xmltest.xml");
goto Done;
}
// Done runs in a seperate try/catch statement and only returns data to the calling js function.
Done:
Response.Write(str);