【问题标题】:Reading SQL to DataSet to XmlDocument读取 SQL 到 DataSet 到 XmlDocument
【发布时间】:2012-08-06 02:54:00
【问题描述】:

下面的代码很梦幻。但它可以变得更紧凑和 C#'ish 吗?特别是我对两个问题有怀疑。

  1. 通过将fill 用作参数来填充变量,这不是很丑陋(旧的 C 风格)吗?
  2. 能否让代码更紧凑,而不是通过String

C#

String
  connectionString = "...",
  sqlStatement = "select * from Test",
  output = "";

SqlDataAdapter adapter = new SqlDataAdapter(sqlStatement, connectionString);
DataSet dataSet = new DataSet("Contents");
adapter.Fill(dataSet, "Test");
StringWriter stringWriter=new StringWriter();
dataSet.WriteXml(new XmlTextWriter(stringWriter));
XmlDocument document = new XmlDocument();
output = stringWriter.ToString();
document.LoadXml(output);

【问题讨论】:

    标签: c# xml dataset


    【解决方案1】:

    我不知道如何使它更 C#ish 或更紧凑,但您确实需要关闭您的 Adapter 和 StringWriter。我会使用using 块。

       String
           connectionString = "...",
           sqlStatement = "select * from Test",
           output = "";
    
        DataSet dataSet = new DataSet("Contents");
        using (SqlDataAdapter adapter = new SqlDataAdapter(sqlStatement, connectionString)){
            adapter.Fill(dataSet, "Test");}
        using (StringWriter stringWriter = new StringWriter()) { 
          dataSet.WriteXml(new XmlTextWriter(stringWriter));
          output = stringWriter.ToString();
        };
        XmlDocument document = new XmlDocument();
        document.LoadXml(output);
    

    【讨论】:

    • 超出范围时不是自动关闭的吗?
    • 奇怪的是,他们没有。来自 MSDN:如果 SqlConnection 超出范围,它将保持打开状态。因此,您必须通过调用 Close 或 Dispose 显式关闭连接。 Close 和 Dispose 在功能上是等效的...为确保始终关闭连接,请在 using 块内打开连接,如下面的代码片段所示。这样做可确保在代码退出块时自动关闭连接。
    • 现在,我想起来了,我以前也读过。但是随着时间的流逝,我忘记了...谢谢!
    • 这正是我想要的。我错过了 XmlTextWriter 转换,在第一个节点中获得了一大堆 XML 作为值。谢谢!
    【解决方案2】:

    虽然 Holger 的回答非常好,但我实际上是在使用 Linq to XML。我认为,如果您的输出是 XElement 而不是 XmlDocument 或 XmlNode,我从他的代码中利用到 Linq 的内容更加优雅。您也不需要强制转换为 XmlTextWriter。

    String
       strConnection = "...",
       strSQL = "select * from Test",
    
    XElement objOutput = null;
    
    DataSet objDataSet = new DataSet("output");
    
    using (SqlDataAdapter objAdapter = new SqlDataAdapter(strSQL, strConnection)){
        objAdapter.Fill(objDataSet, "row");}
    using (StringWriter objWriter = new StringWriter()) { 
      objDataSet.WriteXml(objWriter);
      XDocument objDoc = XDocument.Parse(objDataSet.GetXml());
      objOutput = objDoc.Root;
    };
    return objOutput;
    

    【讨论】:

      猜你喜欢
      • 2021-05-04
      • 1970-01-01
      • 2013-01-06
      • 1970-01-01
      • 1970-01-01
      • 2013-08-28
      • 2015-05-18
      • 1970-01-01
      • 2011-04-13
      相关资源
      最近更新 更多