2017-04-26 78 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可能会更容易。

相关问题