2017-04-26 81 views
0

我有以下問題。 我在C#中編碼,我需要從BLOB中檢索XML,然後使用它(使用XML)。從我的代碼C#如何檢索存儲在BLOB中的XML,然後更新它並存儲

... 
var xmldoc = new XmlDocument(); 
OracleCommand oraCmd = new OracleCommand(); 
oraCmd.Connection = db.oraConnection; 
oraCmd.CommandText = "SELECT XML_IN_BLOB FROM TABLE_X"; 
oraCmd.CommandType = CommandType.Text; 
OracleDataReader dr = oraCmd.ExecuteReader(); 
dr.Read(); 
while (dr.Read()) 
{ 
// 1. convert dr. value into XML //var xmldoc 
// 2. update XML element 
// 3. store/update BLOB in TABLE_X 
} 
db.Close(); 

部分你有什麼想法?

+0

如果可以,請將'BLOB'更改爲'CLOB',並將其作爲.Net'String',作爲通用數據類型'String xml_str = reader.GetValue(1)',或者如果使用'OracleDataReader'作爲我明白了,你可以調用'reader.GetOracleLob',目標是以簡單的方式獲取字符串,然後使用'XmlDocument.LoadXml(String)'。 – Seyran

回答

0
  1. 檢查文檔OracleDataReader以確定如何從中獲取字符串字段。
  2. 使用XmlDocument.LoadXml(String)從字符串
  3. 創建可編輯的結構檢查的XmlDocument的文檔,以確定如何更改元素
  4. 保存XML回字符串是有點複雜,但你可以按照this example
+0

LoadXml(String) - 需要字符串作爲輸入,這意味着之前 - 您需要從BLOB中檢索字符串。我不知道怎麼。 –

+0

閱讀Seyrans評論。 – manuzi1

0

如果你打算更新行,那麼你需要改變你的SELECT來包含一個Id。你還需要結構來保存所有的id和修改的xml字節。

var xmlsToUpdate = new Dictionary<int, byte[]>(); 
while (dr.Read()) 
{ 

    //Open it as a blob, then load the xml from the Stream. 
    var id  = dr.GetInt32(0); 
    var stream = dr.GetOracleLob(1); 
    var xml = new XmlDocument(); 
    xml.Load(stream); 

    //manipulate xml 

    var ms = new MemoryStream(); 
    xml.Save(ms); 
    var bytes = ms.ToArray(); 
    xmlsToUpdate.Add(id, bytes); 
} 

後塔爾遍歷列表,並執行UPDATE語句:

cmd.CommandText = "UPDATE TABLEX SET XML_IN_BLOB = :data WHERE id=" + item.Key; 
cmd.Parameters.Add(":data", OracleType.Blob); 
cmd.Parameters[":data"].Value = item.Value; 

而且不要忘記處置一次性物品。使用ORM可能會更容易。

相關問題