2017-04-26 8 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

一般的なデータ型 'String xml_str = reader.GetValue(1)'として 'BLOB'を' CLOB'に変更し、.Net 'String'として動作するか、' OracleDataReader'を私はあなたが 'reader.GetOracleLob'を呼び出すことができます、目的は簡単な方法で文字列を取得し、その後に' XmlDocument.LoadXml(String) 'を使用することです。 – Seyran

答えて

0
  1. OracleDataReaderのドキュメントを調べて、文字列フィールドを取得する方法を決定してください。バック文字列にXMLを保存する要素
  2. を変更する方法を決定するために、常にXmlDocumentのドキュメントを調べ、文字列
  3. から編集可能な構造を作成するための
  4. 使用XmlDocument.LoadXml(String)はもう少し複雑ですが、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); 
} 

リストオーバータールループした後、更新ステートメントを実行します。

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を使用する方が簡単かもしれません。

関連する問題