【Oracle + .NET】OracleParameter(DbParameter)を使ってみた。

  • 2012.11.03 Saturday
  • 16:49
JUGEMテーマ:コンピュータ

Source and Project
 
OracleParameterを使って見ました。単なる覚え書きなので解説はしません(できません。SQLよく分からない・・・。)と、言いたいのですが、さすがにそれは寂しいので分かる範囲で説明を加えながらサンプルコードを紹介したいと思います。

今回はバインド変数を扱いたいと思います。SQL関連の知識が無知に等しいので、先ほど一生懸命調べた範囲でSQLを記述させてもらうと今回はプログラムとして書きたい内容をSQLで記述すると下記のような感じになります。

SQL> variable job1 VARCHAR2(9)
SQL> variable sal1 NUMBER
SQL> begin
  2     :job1 := 'SALESMAN';
  3     :sal1 := 1500;
  4  end;
  5  /
SQL> select * from emp where job=:job1 and sal>=:sal1;

:job1というところが「バインド変数」というやつらしいです。バインド変数を使うことの利点は「SQL バインド変数の利点」などでググれば、賢い方々のわかりやすい説明がざくざく出てくるはずです(汗)

で、C#で書けば、プログラム制御でSQLも自由自在に書けるわけですが、「バインド変数の利点」とやらの恩恵にあずかることができなくなってしまうわけです。そこで、今回の「OracleParameter」です。OraclePrameterを利用することでバインド変数に値を指定することができます。

ということで、サンプルコード

using System;
using System.Data.Common;
using System.Linq;
using Oracle.DataAccess.Client;

namespace Art55.OracleAccessDemo20121103_001
{
    class Program
    {
        static void Main()
        {
            const string statement = "select * from emp where job=:job1 and sal>=:sal1";
            const string stringconnection = "Data Source=XE;User Id=art55;Password=art55;";
            using (var connection = new OracleConnection(stringconnection))
            {
                using (var command = new OracleCommand(statement, connection))
                {
                    connection.Open();
                    try
                    {
                        DbParameter job = new OracleParameter("job1", "SALESMAN");
                        command.Parameters.Add(job);
                        DbParameter sal = new OracleParameter("sal1", 1500);
                        command.Parameters.Add(sal);

                        var reader = command.ExecuteReader();
                        while (reader.Read())
                        {
                            string line = Enumerable.Range(0, reader.FieldCount)
                                .Aggregate(string.Empty, (s, c) => s + reader[c] + ", ");
                            Console.WriteLine(line);
                        }
                    }
                    finally
                    {
                        connection.Close();
                    }
                }
            }
        }
    }
}

一つ注意なのが、OracleParameterをOracleCommandにAddする順番です。既定ではOracleCommand.BindByNameプロパティがfalseに設定されており、パラメータに名前を指定しても無視されます。そのため、バインド変数が登場する順序でAddする必要があります。

これを実行すると

7499, ALLEN, SALESMAN, 7698, 1981/02/20 0:00:00, 1600, 300, 30,
7844, TURNER, SALESMAN, 7698, 1981/09/08 0:00:00, 1500, 0, 30,

カラム名も出さずに結果を表示しているので、なんのこっちゃ分かりませんが、私が期待していた結果が帰ってきました。

今回の例ではDbDataReadeを利用して、SQLを1回した発行していないのでバインド変数の利点が利いてくるかどうか不明ですが、DataAdapterを利用した際に大量にInsetするとかUpdateするとかいう場合に、パフォーマンスの向上が図れるのではないかと思われます。(想像で申し訳ないのですが・・・)

Source and Project


------------------------------------------------
(追記)
OracleCommand.BindByNameプロパティをtrueに指定すると、ParameterをAddする順序を意識しなくてよくなります。どちらが良いかは、SQLをどのように生成するかによって異なるのかなって思います。

using System;
using System.Data.Common;
using System.Linq;
using Oracle.DataAccess.Client;

namespace Art55.OracleAccessDemo20121103_001
{
    class Program
    {
        static void Main()
        {
            const string statement = "select * from emp where job=:job1 and sal>=:sal1";
            const string stringconnection = "Data Source=XE;User Id=art55;Password=art55;";
            using (var connection = new OracleConnection(stringconnection))
            {
                using (var command = new OracleCommand(statement, connection))
                {
                    connection.Open();
                    command.BindByName = true;
                    try
                    {
                        DbParameter sal = new OracleParameter("sal1", 1500);
                        command.Parameters.Add(sal);
                        DbParameter job = new OracleParameter("job1", "SALESMAN");
                        command.Parameters.Add(job);
                        var reader = command.ExecuteReader();
                        while (reader.Read())
                        {
                            string line = Enumerable.Range(0, reader.FieldCount)
                                .Aggregate(string.Empty, (s, c) => s + reader[c] + ", ");
                            Console.WriteLine(line);
                        }
                    }
                    finally
                    {
                        connection.Close();
                    }
                }
            }
        }
    }
}

コメント
コメントする








    
この記事のトラックバックURL
トラックバック

calendar

S M T W T F S
    123
45678910
11121314151617
18192021222324
252627282930 
<< June 2017 >>

あわせて読みたい

あわせて読みたいブログパーツ

selected entries

categories

archives

recent comment

  • 【キーボード】6年前のRealForceを復活させることはできる!?その3
    art55 (05/22)
  • 【キーボード】6年前のRealForceを復活させることはできる!?その3
    分解大好き (05/18)
  • 【.NET Framework 4.5】 IListがIReadOnlyListを継承してない理由。
    art55 (02/04)
  • 【.NET Framework 4.5】 IListがIReadOnlyListを継承してない理由。
    Gen (02/04)
  • 【キーボード】RealForce が壊れて帰ってきた。
    art55 (04/29)
  • 【.NET Framework 4.5】 IListがIReadOnlyListを継承してない理由。
    art55 (02/23)
  • 【.NET Framework 4.5】 IListがIReadOnlyListを継承してない理由。
    かるあ (02/22)
  • 【C#】Dictionaryの実装・データ構造・アルゴリズムを観察する。
    art55 (01/16)
  • 【C#】Dictionaryの実装・データ構造・アルゴリズムを観察する。
    karuakun (01/16)
  • 【NetOffice】【Excel】死なないExcelプロセスをKillする。
    art55 (12/05)

recent trackback

recommend

recommend

recommend

C#プログラマのための.NETアプリケーション最適化技法 (Programmer's SELECTION)
C#プログラマのための.NETアプリケーション最適化技法 (Programmer's SELECTION) (JUGEMレビュー »)
Sasha Goldshtein,Dima Zurbalev,Ido Flatow,サシャ・ゴルドシュタイン,ディマ・ズルバレフ,イド・フラトー

recommend

ろんりと集合
ろんりと集合 (JUGEMレビュー »)
中内 伸光
とてもわかりやすいです。

recommend

recommend

シャノン・ノイマン・ディジタル世界
シャノン・ノイマン・ディジタル世界 (JUGEMレビュー »)
市川 忠男
4章がリレーショナルデータベースな内容になってます。ページ数があまりありませんが、ポイントがものすごく的確にまとまっていて、感動します。

recommend

recommend

東プレ Realforce91UBK-S 静音キーボード 静電容量無接点方式 変荷重 ブラック NG01BS
東プレ Realforce91UBK-S 静音キーボード 静電容量無接点方式 変荷重 ブラック NG01BS (JUGEMレビュー »)

テンキーレス、静音のRealForce91UBK-S。スコスコ感がたまらなく気持ちいいです。家と会社で2台持ってます。

recommend

recommend

プログラミング.NET Framework 第4版 (プログラミングシリーズ)
プログラミング.NET Framework 第4版 (プログラミングシリーズ) (JUGEMレビュー »)
Jeffrey Richter
発売予定美 2013年10月10日。.NET Frameworkとお付き合いする人のバイブルですね。

recommend

recommend

キャット・シッターの君に。
キャット・シッターの君に。 (JUGEMレビュー »)
喜多嶋 隆
私のイラストレータデビュー本です。

recommend

Essential .NET ― 共通言語ランタイムの本質
Essential .NET ― 共通言語ランタイムの本質 (JUGEMレビュー »)
ドン・ボックス,クリス・セルズ,Don Box,Chris Sells,吉松 史彰

links

profile

search this site.

others

mobile

qrcode

powered

無料ブログ作成サービス JUGEM