連載
» 2005年02月26日 00時00分 公開

ODP.NETでOracle XML DBを活用するODP.NETファーストステップ(4)(4/4 ページ)

[大田浩,日本オラクル]
前のページへ 1|2|3|4       

OracleXmlSavePropertiesクラスを利用した通常の表へのアクセス

 OracleXmlSavePropertiesクラスを利用して、XML文書から通常の表への追加/更新/削除が可能です。XMLから通常の表へアクセスするメリットは、複数行を1回のデータベース・ラウンドトリップで追加/更新/削除できることです。例えば、以下のようなデータをemp表に一度に格納する場合のコードは以下のようになります。

empno ename
1000 Smith
1001 Barney
表3 emp表に格納するデータ
Dim cnn As New OracleConnection( _
  "user id=scott;password=tiger;data source=orcl")
cnn.Open()

Dim keyColumnList(1) As String
keyColumnList(0) = "EMPNO"
Dim insertColumnList(2) As String
insertColumnList(0) = "EMPNO"
insertColumnList(1) = "ENAME"
Dim cmd As OracleCommand = New OracleCommand("", cnn)
cmd.XmlCommandType = OracleXmlCommandType.Insert
Dim sb As New StringBuilder
sb.Append("<ROWSET>")
sb.Append("<MYROW num = ""1"">")
sb.Append("<EMPNO>1000</EMPNO>")
sb.Append("<ENAME>Smith</ENAME>")
sb.Append("</MYROW>")
sb.Append("<MYROW num = ""2"">")
sb.Append("<EMPNO>1001</EMPNO>")
sb.Append("<ENAME>Barney</ENAME>")
sb.Append("</MYROW>")
sb.Append("</ROWSET>")
cmd.CommandText = sb.ToString

With cmd.XmlSaveProperties
  .KeyColumnsList = keyColumnList
  .RowTag = "MYROW"
  .Table = "EMP"
  .UpdateColumnsList = insertColumnList
End With

cmd.ExecuteNonQuery()
リスト16 emp表に1回のデータベース・ラウンドトリップで2レコードをInsertするコード(VB.NET)

OracleConnection cnn = new OracleConnection(
  "user id=scott;password=tiger;data source=orcl");
cnn.Open();

string[] keyColumnList = new string[1];
keyColumnList[0] = "EMPNO";
string[] insertColumnList = new string[2];
insertColumnList[0] = "EMPNO";
insertColumnList[1] = "ENAME";
OracleCommand cmd = new OracleCommand("", cnn);
cmd.XmlCommandType = OracleXmlCommandType.Insert;
StringBuilder sb = new StringBuilder();
sb.Append("<ROWSET>");
sb.Append("<MYROW num = \"1\">");
sb.Append("<EMPNO>1000</EMPNO>");
sb.Append("<ENAME>Smith</ENAME>");
sb.Append("</MYROW>");
sb.Append("<MYROW num = \"2\">");
sb.Append("<EMPNO>1001</EMPNO>");
sb.Append("<ENAME>Barney</ENAME>");
sb.Append("</MYROW>");
sb.Append("</ROWSET>");
cmd.CommandText = sb.ToString();

cmd.XmlSaveProperties.KeyColumnsList = keyColumnList;
cmd.XmlSaveProperties.RowTag = "MYROW";
cmd.XmlSaveProperties.Table = "EMP";
cmd.XmlSaveProperties.UpdateColumnsList = insertColumnList;
cmd.ExecuteNonQuery();
リスト17 emp表に1回のデータベース・ラウンドトリップで2レコードをInsertするコード(C#)

 追加と同様にOracleXmlSavePropertiesクラスを利用して更新も可能です。以下のサンプルコードでは、emp表のename列を1回のデータベース・ラウンドトリップで更新しています。

Dim cnn As New OracleConnection( _
  "user id=scott;password=tiger;data source=orcl")
cnn.Open()

Dim keyColumnList(1) As String
keyColumnList(0) = "EMPNO"
Dim updateColumnList(1) As String
updateColumnList(0) = "ENAME"
Dim cmd As OracleCommand = New OracleCommand("", cnn)
cmd.XmlCommandType = OracleXmlCommandType.Update
Dim sb As New StringBuilder
sb.Append("<ROWSET>")
sb.Append("<MYROW num = ""1"">")
sb.Append("<EMPNO>1000</EMPNO>")
sb.Append("<ENAME>Emily</ENAME>")
sb.Append("</MYROW>")
sb.Append("<MYROW num = ""2"">")
sb.Append("<EMPNO>1001</EMPNO>")
sb.Append("<ENAME>John</ENAME>")
sb.Append("</MYROW>")
sb.Append("</ROWSET>")
cmd.CommandText = sb.ToString

With cmd.XmlSaveProperties
  .KeyColumnsList = keyColumnList
  .RowTag = "MYROW"
  .Table = "EMP"
  .UpdateColumnsList = updateColumnList
End With

cmd.ExecuteNonQuery()
リスト18 emp表に1回のデータベース・ラウンドトリップで2レコードをUpdateするコード(VB.NET)

OracleConnection cnn = new OracleConnection(
  "user id=scott;password=tiger;data source=orcl");
cnn.Open();

string[] keyColumnList = new string[1];
keyColumnList[0] = "EMPNO";
string[] updateColumnList = new string[1];
updateColumnList[0] = "ENAME";
OracleCommand cmd = new OracleCommand("", cnn);
cmd.XmlCommandType = OracleXmlCommandType.Update;
StringBuilder sb = new StringBuilder();
sb.Append("<ROWSET>");
sb.Append("<MYROW num = \"1\">");
sb.Append("<EMPNO>1000</EMPNO>");
sb.Append("<ENAME>Emily</ENAME>");
sb.Append("</MYROW>");
sb.Append("<MYROW num = \"2\">");
sb.Append("<EMPNO>1001</EMPNO>");
sb.Append("<ENAME>John</ENAME>");
sb.Append("</MYROW>");
sb.Append("</ROWSET>");
cmd.CommandText = sb.ToString();

cmd.XmlSaveProperties.KeyColumnsList = keyColumnList;
cmd.XmlSaveProperties.RowTag = "MYROW";
cmd.XmlSaveProperties.Table = "EMP";
cmd.XmlSaveProperties.UpdateColumnsList = updateColumnList;
cmd.ExecuteNonQuery();
リスト19 emp表に1回のデータベース・ラウンドトリップで2レコードをUpdateするコード(C#)

 削除の場合も、以下のコードにより1回のデータベース・ラウンドトリップで複数行の削除が可能です。

Dim cnn As New OracleConnection( _
  "user id=scott;password=tiger;data source=orcl")
cnn.Open()

Dim keyColumnList(1) As String
keyColumnList(0) = "EMPNO"
Dim cmd As OracleCommand = New OracleCommand("", cnn)
cmd.XmlCommandType = OracleXmlCommandType.Delete
Dim sb As New StringBuilder
sb.Append("<ROWSET>")
sb.Append("<MYROW num = ""1"">")
sb.Append("<EMPNO>1000</EMPNO>")
sb.Append("</MYROW>")
sb.Append("<MYROW num = ""2"">")
sb.Append("<EMPNO>1001</EMPNO>")
sb.Append("</MYROW>")
sb.Append("</ROWSET>")
cmd.CommandText = sb.ToString

With cmd.XmlSaveProperties
  .KeyColumnsList = keyColumnList
  .RowTag = "MYROW"
  .Table = "EMP"
End With

cmd.ExecuteNonQuery()
リスト20 emp表に1回のデータベース・ラウンドトリップで2レコードをDelelteするコード(VB.NET)

OracleConnection cnn = new OracleConnection(
  "user id=scott;password=tiger;data source=orcl");
cnn.Open();

string[] keyColumnList = new string[1];
keyColumnList[0] = "EMPNO";
OracleCommand cmd = new OracleCommand("", cnn);
cmd.XmlCommandType = OracleXmlCommandType.Delete;
StringBuilder sb = new StringBuilder();
sb.Append("<ROWSET>");
sb.Append("<MYROW num = \"1\">");
sb.Append("<EMPNO>1000</EMPNO>");
sb.Append("</MYROW>");
sb.Append("<MYROW num = \"2\">");
sb.Append("<EMPNO>1001</EMPNO>");
sb.Append("</MYROW>");
sb.Append("</ROWSET>");
cmd.CommandText = sb.ToString();

cmd.XmlSaveProperties.KeyColumnsList = keyColumnList;
cmd.XmlSaveProperties.RowTag = "MYROW";
cmd.XmlSaveProperties.Table = "EMP";
cmd.ExecuteNonQuery();
リスト21 emp表に1回のデータベース・ラウンドトリップで2レコードをDelelteするコード(C#)


 以上、今回はODP.NETからOracle XML DBへのアクセス手法について説明しました。ODP.NETが提供しているクラスと、.NET Frameworkが提供しているクラスをうまく連携させることにより、Oracle XML DBの機能を最大限に生かしたアプリケーションの開発を行うことが可能です。

連載の最後に

 今回で「ODP.NETファーストステップ」の連載は最終回となります。この連載をきっかけに、.NET環境でOracleを利用される方が増えてくだされば、筆者としてこれ以上うれしいことはありません。.NET環境への対応は、VSIP(Visual Studio Industry Partner)への参加によって加速しており、現在Visual Studio .NET上でGUIによりOracleデータベースのオブジェクト管理ができるツール「Oracle Developer Tools for Visual Studio .NET」のベータ版がUSのOTNサイトよりダウンロードできます。ぜひ、ダウンロードして試してみてください。長い間ご愛読いただき、ありがとうございました。(連載完)

前のページへ 1|2|3|4       

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。