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);
}