2011-01-31 58 views
10

我有一個方法返回一個格式良好的Xml 字符串。如何將此字符串轉換爲SqlXml?如何將字符串轉換爲SqlXml

+0

此鏈接可能會解決您的問題。 http://stackoverflow.com/questions/574928/c-sql-whats-wrong-with-sqldbtype-xml-in-procedures – 2012-07-13 07:43:54

回答

2

在SQL Server中,一個簡單的:CAST(MyVarcharString AS xml)

或者,它在.NET分配給SQLDbType.Xml的,也就是說,一個參數

+0

對不起,我沒有說我說的是c#,而不是t- sql .. – TonyP 2011-01-31 18:32:24

+0

@TonyP:更新與SQLDbType.Xml信息 – gbn 2011-01-31 18:32:49

+0

我不舒服以下,任何建議 sxml = b.BaanSession(sxml); SqlParameter p = new SqlParameter(「@ x」,SqlDbType.Xml); p.Value = sxml; xmsg =(SqlXml)p.Value; – TonyP 2011-01-31 18:51:05

12

在純C#的另一種方式 - 爲後人:

using (var memoryStream = new MemoryStream()) 
{ 
    using (var xmlWriter = XmlWriter.Create(memoryStream)) 
    { 
     xmlWriter.WriteString(xmlData.ToString().Trim()); 
     return new System.Data.SqlTypes.SqlXml(memoryStream); 
    } 
} 
7

這是我的C#版本的轉換方法。

public static SqlXml ConvertString2SqlXml(string xmlData) 
{ 
    UTF8Encoding encoding = new UTF8Encoding(); 
    MemoryStream m = new MemoryStream(encoding.GetBytes(xmlData)); 
    return new SqlXml(m); 
} 

我不與它相當請,因爲我本來希望有一個使用塊MemoryStream的,但是這給了我:

無法訪問已釋放的對象。對象名稱:'無效嘗試呼叫 流關閉時讀取。'。

我願意接受這個問題,因爲這個代碼只用於單元測試,我想用SqlXml參數測試一個SqlFunction,它將部署到SQL Server CLR。

ReinhardtB的答案並沒有爲我工作,由於下列問題: 當XMLDATA "<?xml version=\"1.0\" encoding=\"utf-8\"?><test></test>"調用這個(背面斜線在C#字符串文字),我得到:

系統。發生InvalidOperationException 消息=令牌處於狀態開始的文本將導致無效的XML文檔。 如果您想要 寫入XML片段,請確保ConformanceLevel設置設置爲 ConformanceLevel.Fragment或ConformanceLevel.Auto。

這被容易地固定通過以下修飾:

XmlWriterSettings settings = new XmlWriterSettings(); 
settings.ConformanceLevel = ConformanceLevel.Fragment; 
using (var xmlWriter = XmlWriter.Create(memoryStream, settings)) 

然而,這導致了以下異常:發生消息

System.ObjectDisposedException =不能訪問 釋放的對象。對象名稱:' 流關閉時,嘗試調用Read無效'。來源= System.Data

這一點,我可以工作,各地通過省略使用塊將MemoryStream(這當然是一個壞主意),只投中下一個問題:檢查的SqlXml的值時, SqlXml.Value,我發現它包含值&lt;?xml version="1.0" encoding="utf-8"?&gt;&lt;test&gt;&lt;/test&gt;,即<和>已經逃脫!這看起來像SqlXml類型的嚴重問題。

1

如果設置了正確的長度,SqlParameter可以正常工作。

comm.Parameters.Add("@XML_Field", SqlDbType.Xml, stringXml.Length) 
comm.Prepare() 
comm.Parameters("@XML_Field").Value = stringXml 

和-1如果你想設置DBNull。在某些情況下的值:

comm.Parameters.Add("@XML_Field", SqlDbType.Xml, -1) 
comm.Prepare() 
comm.Parameters("@XML_Field").Value = DBNull.Value 
3

我知道這已被回答,但這兩個答案似乎都不適用於我。相反,我採取了另一種方法使用該oneliner

var sqlXml = new SqlXml(new XmlTextReader(new StringReader(stringToParseToSqlXml)));

然而,這是漏水,但將其更改爲:

using (var reader = new StringReader(stringToParseToSqlXml)) 
{ 
    using (var xmlreader = new XmlTextReader(reader)) 
    { 
     var sqlXml = new SqlXml(xmlreader); 
     // Do other stuff 
    } 
} 

我用這個,它似乎爲我的作品。