2012-11-27 34 views
1

我想加载一个c#数据集,使用SQL“FOR XML”子句生成的xml。看起来如果我格式化XML以便包含模式,则数据不会被加载。如果我离开模式,我会得到数据,但不是正确的数据类型。FOR XML到数据集

如何从使用FOR XML子句生成的XML加载数据集,以便加载类型信息和数据? (的FOR XML AUTO一些组合| RAW,XMLDATA | XMLSCHEMA ???)

UPDATE

改变它使用从字符串内置一个XmlReader而不是从可变的SqlXml创建的阅读器允许的类型都信息和数据被带入数据集,只要模式信息包含在xml中。当然,我认为这意味着对xml进行额外的解析。有更好的解决方案吗?

  string xml = cmd.Parameters["@xml"].Value.ToString(); 
      StringReader str = new StringReader(String.Format(@"<root>{0}</root>", xml)); 
      System.Xml.XmlReader xmr = System.Xml.XmlReader.Create(str); 
      ds.ReadXml(xmr); 

SQL:

ALTER PROCEDURE prc_GetXmlData @xml XML OUTPUT 
AS 
BEGIN 
    IF OBJECT_ID('test') IS NOT NULL 
     DROP TABLE test 
    CREATE TABLE test (field1 INT, field2 BIT, field3 MONEY, field4 VARCHAR(8000)) 

    INSERT INTO test 
     (field1, field2, field3, field4) 
    VALUES 
     (3, 1, 99.45, 'testvalue') 

    --what combination???? 
    SELECT @xml = (SELECT * FROM test FOR XML RAW, XMLDATA) 
END 

C#:

static void Main(string[] args) 
    { 
     try 
     { 
      SqlConnection con = new SqlConnection(<<connectionstring>>); 
      SqlCommand cmd = new SqlCommand("prc_GetXmlData", con); 
      cmd.CommandType = CommandType.StoredProcedure; 
      cmd.Parameters.Add("@xml", SqlDbType.Xml).Direction = ParameterDirection.Output; 
      try 
      { 
       con.Open(); 
       cmd.ExecuteNonQuery(); 
      } 
      finally 
      { 
       if (con.State == ConnectionState.Open) 
        con.Close(); 
      } 

      System.Data.SqlTypes.SqlXml sqlXml = (System.Data.SqlTypes.SqlXml)cmd.Parameters["@xml"].SqlValue; 
      DataSet ds = new DataSet(); 
      ds.ReadXml(sqlXml.CreateReader()); 

      for (int t = 0; t < ds.Tables.Count; t++) 
      { 
       Console.WriteLine("Column DataTypes:"); 
       for (int c = 0; c < ds.Tables[t].Columns.Count; c++) 
       { 
        Console.WriteLine("ds.Tables[{0}].Columns[{1}].DataType={2}", t, c, ds.Tables[t].Columns[c].DataType); 
       } 

       Console.WriteLine("Rowcount:{0}", ds.Tables[0].Rows.Count); 
      } 
     } 
     catch (Exception ex) 
     { 
      Console.WriteLine(ex); 
     } 

      Console.WriteLine(); 
      Console.WriteLine("Press any key to exit..."); 
      Console.ReadKey(true); 

    } 

回答

0

传给你从那个程序返回到ReadXML的部分XML字符串()。它会填充你的数据集。

string xml = "<your xml string>"; 
DataSet ds= new DataSet(); 
ds.ReadXml(xml);