我有一個方法返回一個格式良好的Xml 字符串。如何將此字符串轉換爲SqlXml?如何將字符串轉換爲SqlXml
回答
在SQL Server中,一個簡單的:CAST(MyVarcharString AS xml)
或者,它在.NET分配給SQLDbType.Xml的,也就是說,一個參數
在純C#的另一種方式 - 爲後人:
using (var memoryStream = new MemoryStream())
{
using (var xmlWriter = XmlWriter.Create(memoryStream))
{
xmlWriter.WriteString(xmlData.ToString().Trim());
return new System.Data.SqlTypes.SqlXml(memoryStream);
}
}
這是我的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,我發現它包含值<?xml version="1.0" encoding="utf-8"?><test></test>
,即<和>已經逃脫!這看起來像SqlXml
類型的嚴重問題。
如果設置了正確的長度,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
我知道這已被回答,但這兩個答案似乎都不適用於我。相反,我採取了另一種方法使用該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
}
}
我用這個,它似乎爲我的作品。
- 1. 如何將字符串的字符串轉換爲字符?
- 2. 將字符串轉換爲字符串
- 3. 將字符串轉換爲字符串
- 4. 將字符串轉換爲字符串
- 5. 如何將字符串轉換爲UInt32?
- 6. 如何將字符串轉換爲UTF8?
- 7. 如何將字符串轉換爲long
- 8. 如何將字符串轉換爲xml
- 9. 如何將OutputStream轉換爲字符串?
- 10. 如何將字符串轉換爲Guid
- 11. 如何將Ada.Real_TIme.Time轉換爲字符串?
- 12. 如何將BeautifulSoup.ResultSet轉換爲字符串
- 13. 如何將BigInteger轉換爲字符串?
- 14. 如何將字符串轉換爲DurationFieldType?
- 15. 如何將字符串轉換爲Bytearray
- 16. 如何將字符串轉換爲int
- 17. 如何將字符串轉換爲Int?
- 18. 如何將字符串轉換爲CFMutableString?
- 19. 如何將字符串轉換爲BigInteger?
- 20. 如何將字符串轉換爲ArrayList
- 21. 如何將StreamReader轉換爲字符串?
- 22. 如何將字符串轉換爲ObjectId
- 23. 如何將字符串轉換爲int?
- 24. 如何將wchar_t *轉換爲字符串?
- 25. 如何將字符串轉換爲net.sf.json.JSONObject
- 26. 如何將字符串轉換爲CLLocation?
- 27. 如何將字符串[]轉換爲ArrayList?
- 28. 如何將字符串轉換爲System.Uri?
- 29. 如何將org.jdom.Document轉換爲字符串
- 30. 如何將字符串轉換爲NSDate?
此鏈接可能會解決您的問題。 http://stackoverflow.com/questions/574928/c-sql-whats-wrong-with-sqldbtype-xml-in-procedures – 2012-07-13 07:43:54