2012-11-27 31 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);