【问题标题】:How to get data from SQL Server database in Xml format and from that Xml fill DataSet如何从 SQL Server 数据库中获取 Xml 格式的数据并从该 Xml 填充 DataSet
【发布时间】:2014-09-16 12:23:42
【问题描述】:

我正在尝试以 xml 格式从 SQL Server 获取数据,并从该 xml 填充数据集。

这是我的查询:

SELECT * 
FROM TblAcademicYear 
FOR XML RAW('AcademicYear'), ELEMENTS;

这个查询给了我以下输出:

 <AcademicYear>
    <AcademicYearId>3</AcademicYearId>
    <AcademicYearName>دو ‌ہزار ‌پندرہ</AcademicYearName>
    <StartingYear>2015-01-01</StartingYear>
   <EndingYear>2015-12-31</EndingYear>
   <Comments>دو ‌ہزار ‌پندرہ ‌کا ‌تعلیم ‌سال</Comments>
  <RCO>2014-07-02</RCO>
  <UserID>2</UserID>
</AcademicYear>

我的 C# 代码是:

SqlConnection conn = new SqlConnection(ConnectionString);

SqlCommand cmd = new SqlCommand();
System.Xml.XmlReader xmlreader;

try
{
    cmd.Connection = conn;
    conn.Open();
    cmd.CommandText = _Query;
    xmlreader = cmd.ExecuteXmlReader();
    conn.Close();

    DataSet ds = new DataSet();
    dt.Columns.Add("AcademicYearId", typeof(string));
    dt.Columns.Add("AcademicYearName", typeof(string));
    dt.Columns.Add("StartingYear", typeof(string));
    dt.Columns.Add("EndingYear", typeof(string));
    dt.Columns.Add("Comments", typeof(string));
    dt.Columns.Add("RCO", typeof(string));
    dt.Columns.Add("UserID", typeof(string));

    ds.Tables.Add(dt);

    ds.ReadXml(xmlreader);
}
catch (Exception ex)
{
    throw ex;
}
finally
{
    if (conn.State != ConnectionState.Closed)
    {
       conn.Close();
    }
}

上面的代码运行完美,但没有给我数据

任何帮助将不胜感激.....

【问题讨论】:

  • 到底为什么你想输出成 XML 然后再读回来?您可以直接从 SQL 查询中填充数据集,而完全不必担心 XML .....
  • 绝对同意你@marc_s
  • @marc_s :实际上我正在开发 Web 服务 (WCF),有人告诉我不要在 Web 服务 (WCF) 中使用 DataTable/DataSet 因为互操作性,所以这就是为什么我认为 XML 在 WCF 中是最好的....我说的对吗?
  • 不,不是这样 - WCF 将轻松愉快地将任何普通数据类型转换为 XML 以进行传输 - 以 XML 开头实际上是障碍多于好处!但在 WCF 服务中,我也不会使用像 DataTable 这样的 .NET 重量级类型 - 使用正确的 POCO(普通旧 CLR 对象)及其列表/集合 - 不要使用 DataTableDataSet 或任何其中....

标签: c# sql sql-server xml


【解决方案1】:
SqlConnection conn = new SqlConnection(ConnectionString);

SqlCommand cmd = new SqlCommand();
System.Xml.XmlReader xmlreader;
XmlDataDocument xmlDataDoc = new XmlDataDocument();
try
{
    cmd.Connection = conn;
    conn.Open();
    cmd.CommandText = _Query;
    xmlreader = cmd.ExecuteXmlReader();
    DataSet ds = new DataSet();
    dt.Columns.Add("AcademicYearId", typeof(string));
    dt.Columns.Add("AcademicYearName", typeof(string));
    dt.Columns.Add("StartingYear", typeof(string));
    dt.Columns.Add("EndingYear", typeof(string));
    dt.Columns.Add("Comments", typeof(string));
    dt.Columns.Add("RCO", typeof(string));
    dt.Columns.Add("UserID", typeof(string));

    ds.Tables.Add(dt);
    while(xmlreader.Read()
    {
      xmlDataDoc.DataSet.ReadXml(xmlreader);
    }
    ds = xmlDataDoc.DataSet;
    xmlreader.Close();
    conn.Close();
}
catch (Exception ex)
{
    throw ex;
}
finally
{
    if (conn.State != ConnectionState.Closed)
    {
       conn.Close();
    }
}

【讨论】:

    【解决方案2】:

    您没有获取数据,因为您在读取之前关闭了连接。

    DataSet ds = new DataSet();
    DataTable dt = new DataTable();
    dt.Columns.Add("AcademicYearId", typeof(string));
    dt.Columns.Add("AcademicYearName", typeof(string));
    dt.Columns.Add("StartingYear", typeof(string));
    dt.Columns.Add("EndingYear", typeof(string));
    dt.Columns.Add("Comments", typeof(string));
    dt.Columns.Add("RCO", typeof(string));
    dt.Columns.Add("UserID", typeof(string));
    ds.Tables.Add(dt);
    
    cmd.Connection = conn;
    conn.Open();
    cmd.CommandText = _Query;
    xmlreader.Read();    -- // Add this line
    xmlreader = cmd.ExecuteXmlReader();
    // conn.Close();  -- Remove this line and add it at the end   
    ds.ReadXml(xmlreader);
    conn.Close();
    

    你必须调用 xmlreader 的 read() 方法。

    【讨论】:

    • @KhurramAli:您必须调用 xmlreader 的 read() 方法。我已经更新了我的答案...抱歉,因为忙于其他项目,所以迟到了回复... :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-22
    • 1970-01-01
    • 2021-09-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多