連載
» 2004年12月28日 00時00分 公開

ODP.NETファーストステップ(2):ASP.NETの利点を引き出すODP.NET活用法 (2/4)

[大田浩,日本オラクル]

OO4OとODP.NETの根本的な違い

 ADO.NETでは、データベースへのアクセス方法には大きく接続型データアクセス非接続型データアクセスという2通りの方法があることは、多くの方が知っていると思います。接続型データアクセスと非接続型データアクセスについては、すでに多くの情報が提供されているので、本稿では詳細には触れないことにします。ODP.NETは、ADO.NET準拠のデータプロバイダなので、ADO.NETの情報をそのままODP.NETに置き換えても問題ありません。

 OO4Oには、非接続型データアクセスというアクセス方法はないので、接続型データアクセスでのOO4OとODP.NETの違いを表3にまとめました。

OraDynaset(OO4O) OracleDataReader(ODP.NET)
更新 更新可能 読み取りのみ、更新不可
読み取り 前方・後方移動が可能 前方移動のみ
表3 OraDynasetとOracleDataReaderの比較

 ODP.NETを使った接続型のデータアクセスにはOracleDataReaderを使用します。OracleCommandのExecuteReaderメソッドをコールし、結果をOracleDataReaderに格納します。OracleDataReaderに相当するOO4OのオブジェクトはOraDynasetだと思ってよいでしょう。ここで注目したいのは、OracleDataReaderは更新ができないということです。接続型でデータ更新を行うにはOracleCommandに更新するためのSQLを設定し、ExecuteNonQueryメソッドを呼び出します。

Dim cnn As New OracleConnection
Dim cmd As New OracleCommand

cnn.ConnectionString = _
  "User Id=scott;Password=tiger;Data Source=orcl"
cnn.Open()
cmd.Connection = cnn
cmd.CommandText = _
  "update emp set ename='SCOTT' where empno=1001"
cmd.CommandType = CommandType.Text
cmd.ExecuteNonQuery()
cnn.Close()
リスト3 接続型でのデータ更新(VB.NET)

OracleConnection cnn = new OracleConnection();
OracleCommand cmd = new OracleCommand();

cnn.ConnectionString = 
  "User Id=scott;Password=tiger;Data Source=orcl";
cnn.Open();
cmd.Connection = cnn;
cmd.CommandText = 
  "update emp set ename='SCOTT' where empno=1001";
cmd.CommandType = CommandType.Text;
cmd.ExecuteNonQuery();
cnn.Close();
リスト4 接続型でのデータ更新(C#)

 ODP.NETを利用した実際のアプリケーションでは、接続型データアクセスと非接続型データアクセスを的確に使い分ける必要があります。例えば、参照処理や楽観的同時実行制御で問題のない更新処理を行う場合には非接続型を利用し、悲観的同時実行制御が必要な更新処理では、接続型を利用するなど、処理の性質によって接続型と非接続型を使い分けてください。

文キャッシングを使ったパフォーマンス向上

 ASP.NETなどのWebアプリケーションでは、通常アプリケーション・サーバなどの中間層からデータベースへのアクセスを共有します。その場合、文キャッシングを利用すると、同一のコネクションで発行される同じSQLもしくはPL/SQL文を後続のクエリで実行した際、カーソルから解析された情報を再利用して実行するので、パフォーマンスの向上を得られます。文キャッシングを有効にするには、接続文字列属性に「Statement Cache Size」を指定します。Statement Cache Sizeで指定する値は、実際にキャッシュする文の最大数を指定します。以下の接続文字列属性では最大200の文をキャッシュする設定を行っています。

"User Id=scott;Password=tiger;Data Source=orcl;Statement
Cache Size=200"
注:⇒は表示の都合で改行していることを示します

 デフォルトでは、この属性は0に設定され、文キャッシングは無効です。指定された最大キャッシュ・サイズまで文がキャッシュされると、使用頻度の最も低い文が解放され、新しく作成された文をキャッシュするためのスペースが確保されます。キャッシュされた文をすべて消去するには、OracleConnectionのPurgeStatementCacheメソッドをコールします。また、文キャッシュを有効にするには、SQL文またはPL/SQL文にリテラル値ではなくパラメータを使用する必要があります。例えばテキストボックスの値をパラメータとして設定しているコードは以下のようになります。

Dim cmd As New OracleCommand
cmd.CommandText = _
  "Select * from emp where ename like :ename"
Dim paraEname As OracleParameter = _
  cmd.Parameters.Add("ename", TextboxEname.Text + "%")
リスト5 パラメータを使用して文キャッシュを有効にするコード(VB.NET)

OracleCommand cmd = new OracleCommand();
cmd.CommandText = 
  "Select * from emp where ename like :ename";
OracleParameter paraEname = 
  cmd.Parameters.Add("ename", TextboxEname.Text + "%");
リスト6 パラメータを使用して文キャッシュを有効にするコード(C#)

 以下のコードのように、リテラル値でSQLまたはPL/SQL文を指定すると文キャッシュが有効になりません。

Dim cmd As New OracleCommand
cmd.CommandText = _
  "Select * from emp where ename like '" + _
  TextboxEname.Text + "%'"
リスト7 文キャッシュが有効にならないコード(VB.NET)

OracleCommand cmd = new OracleCommand();
cmd.CommandText = 
  "Select * from emp where ename like '" +
  TextboxEname.Text + "%'";
リスト8 文キャッシュが有効にならないコード(C#)

最新のODP.NETのダウンロードは、OTN(Oracle Technology Network)のホームページの「ダウンロード」タブ→「テクノロジ、ユーティリティ、ドライバ」の欄から、「Oracle Data Provider for .NET(ODP.NET)」のリンクをクリックしてください。また、文キャッシングについては、OTNの「Oracle Data Provider for .NET開発者ガイド」にて詳細に説明してありますので、そちらを参照してください。

次ページへ続く)

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

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

メールマガジン登録

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