[この記事は18年前に書かれました]
Oracle Data Provider for .NET (ODP.NET) を使用して、動的なパラメータのある データベースアクセスを行うにはOracleParameterクラスを使用します。 ODP.NETを使用する場合は、バインドするパラメータを名前で指定するか 位置で指定するかをBindByNameで指定します。 名前で指定するには、BindByNameをtrueにします。
using (OracleConnection con = new OracleConnection()) { con.ConnectionString = "User Id=scott; Password=tiger; Data Source=oracle"; con.Open(); try { // Commandオブジェクト生成 using (OracleCommand cmd = con.CreateCommand()) { // クエリ文字列 cmd.CommandText = "select column1, column2 from test where column2 = :column2 and column1 = :column1"; // バインド・メソッドを指定(名前指定パラメータ) cmd.BindByName = true; // パラメータの生成(プレイスホルダを名前で指定) OracleParameter para1 = new OracleParameter(); para1.ParameterName = "column1"; para1.Value = "103"; cmd.Parameters.Add(para1); OracleParameter para2 = new OracleParameter(); para2.ParameterName = "column2"; para2.Value = "test"; cmd.Parameters.Add(para2); // クエリの実行 using (OracleDataReader reader = cmd.ExecuteReader()) { while (reader.Read()) { // カラム名 Console.WriteLine(reader["column1"]); Console.WriteLine(reader["column2"]); } } } } finally { if (con != null) { con.Close(); } } }
位置で指定する場合は、クエリで指定したパラメータと、OracleParameterオブジェクト の追加順を同じにする必要があります。 この場合は、プレイスホルダと、OracleParameterの名前が一致している必要はありません。 ちなみに、こちらがデフォルトになっていてBindByNameを指定しなければ位置指定になります。
// クエリ文字列 cmd.CommandText = "select column1, column2 from test where column1 = :param and column2 = :param"; // パラメータの生成(プレイスホルダを順番で指定) OracleParameter para1 = new OracleParameter(); para1.Value = "103"; cmd.Parameters.Add(para1); OracleParameter para2 = new OracleParameter(); para2.Value = "test"; cmd.Parameters.Add(para2);
パラメータの型は、設定された値から推測されますが、明示的に指定する場合は、OracleParameter.DbTypeにOracleDbType列挙体を指定します。
・関連記事
Oracle Data Provider for .NET (ODP.NET) でデータベースアクセス
汎用的なコードでデータベースアクセス(パラメータ)
コメント