OracleCommandBuilder
オブジェクトでは、データベースが更新される場合に、OracleDataAdapter
に対して自動SQL生成が行われます。
クラスの継承
System.Object
System.MarshalByRefObject
System.ComponentModel.Component
System.Data.Common.DbCommandBuilder
(ADO.NET 2.0のみ)
OracleDataAccess.Client.OracleCommandBuilder
宣言
// ADO.NET 2.0: C# public sealed class OracleCommandBuilder : DbCommandBuilder
// ADO.NET 1.x: C#
public sealed class OracleCommandBuilder : Component
スレッド安全性
パブリック静的メソッドはスレッドセーフですが、インスタンス・メソッドではスレッド安全性は保証されません。
備考
OracleCommandBuilder
では、OracleDataAdapter
のSelectCommand
プロパティが設定されている場合、単一表の更新に対してSQL文が自動的に生成されます。DataSet
に複数の表が含まれている場合、例外が表示されます。DataAdapter
プロパティが設定されている場合は、OracleCommandBuilder
がRowUpdating
イベントのリスナーとして自己登録します。1度に関連付けることができるのは、1つのOracleDataAdapter
オブジェクトと1つのOracleCommandBuilder
オブジェクトのみです。
INSERT
、UPDATE
またはDELETE
文を生成する場合、OracleCommandBuilder
では、必要なメタデータ・セットを取得するため、DataSet
内のExtendedProperties
が使用されます。メタデータの取得後にSelectCommand
が変更された場合(最初の更新後など)、メタデータを更新するためRefreshSchema
メソッドがコールされる必要があります。
OracleCommandBuilder
により、最初にDataSet
のExtendedProperties
のメタデータが検索されます。メタデータがない場合、OracleCommandBuilder
ではOracleDataAdapter
のSelectCommand
プロパティによってメタデータが取得されます。
例
次の例では、EMP
表の更新を実行しています。ここでは、OracleDataAdapter.Update()
がコールされた場合のOracleDataAdapter
オブジェクトに対するUpdateCommand
を作成するために、OracleCommandBuilder
オブジェクトが使用されています。
// C# using System; using System.Data; using Oracle.DataAccess.Client; class OracleCommandBuilderSample { static void Main() { string constr = "User Id=scott;Password=tiger;Data Source=oracle"; string cmdstr = "SELECT empno, sal from emp"; // Create the adapter with the selectCommand txt and the // connection string OracleDataAdapter adapter = new OracleDataAdapter(cmdstr, constr); // Create the builder for the adapter to automatically generate // the Command when needed OracleCommandBuilder builder = new OracleCommandBuilder(adapter); // Create and fill the DataSet using the EMP DataSet dataset = new DataSet(); adapter.Fill(dataset, "EMP"); // Get the EMP table from the dataset DataTable table = dataset.Tables["EMP"]; // Indicate DataColumn EMPNO is unique // This is required by the OracleCommandBuilder to update the EMP table table.Columns["EMPNO"].Unique = true; // Get the first row from the EMP table DataRow row = table.Rows[0]; // Update the salary double sal = double.Parse(row["SAL"].ToString()); row["SAL"] = sal + .01; // Now update the EMP using the adapter // The OracleCommandBuilder will create the UpdateCommand for the // adapter to update the EMP table adapter.Update(dataset, "EMP"); Console.WriteLine("Row updated successfully"); } }
要件
ネームスペース: Oracle.DataAccess.Client
アセンブリ: Oracle.DataAccess.dll
Microsoft .NET Frameworkバージョン: 1.xまたは2.0
OracleCommandBuilder
メンバーは次の表にリスト表示されています。
OracleCommandBuilderコンストラクタ
OracleCommandBuilder
コンストラクタのリストを、表5-8に示します。
OracleCommandBuilder静的メソッド
OracleCommandBuilder
静的メソッドのリストを、表5-9に示します。
表5-9 OracleCommandBuilder静的メソッド
メソッド | 説明 |
---|---|
|
指定した |
|
|
OracleCommandBuilderプロパティ
OracleCommandBuilder
プロパティのリストを、表5-10に示します。
表5-10 OracleCommandBuilderプロパティ
名前 | 説明 |
---|---|
|
|
SQL文を生成するときにOracleオブジェクト名の前後に二重引用符を使用するかどうかを示します |
|
|
サポート対象外 |
|
サポート対象外 |
|
サポート対象外 |
SQL文が生成される |
|
|
名前に空白または予約語などの特殊文字を含むデータベース・オブジェクトを指定するために使用される単一または複数の開始文字を指定します ADO.NET 2.0準拠のODP.NETでのみサポート |
|
名前に空白または予約語などの特殊文字を含むデータベース・オブジェクトを指定するために使用される単一または複数の終了文字を指定します ADO.NET 2.0準拠のODP.NETでのみサポート |
|
スキーマ識別子とその他の識別子のセパレータに使用される文字を指定します ADO.NET 2.0準拠のODP.NETでのみサポート |
|
|
OracleCommandBuilderパブリック・メソッド
OracleCommandBuilder
パブリック・メソッドのリストを、表5-11に示します。
表5-11 OracleCommandBuilderパブリック・メソッド
パブリック・メソッド | 説明 |
---|---|
|
|
|
|
|
|
データベース上で削除を実行するSQL文( |
|
|
|
データベース上で挿入を実行するSQL文( |
|
|
|
|
|
データベース上で更新を実行するSQL文( |
|
|
|
|
引用符で囲まずに指定された識別子の正しい引用書式を、識別子内に埋め込まれた引用符を適切にエスケープして戻します ADO.NET 2.0準拠のODP.NETでのみサポート |
|
|
|
引用符で囲んで指定された識別子の正しい引用符なし書式を、識別子内に埋め込まれた引用符のエスケープ表記を削除して戻します ADO.NET 2.0準拠のODP.NETでのみサポート |
|
|
OracleCommandBuilderイベント
OracleCommandBuilder
イベントのリストを、表5-12に示します。
OracleCommandBuilder
コンストラクタでは、OracleCommandBuilder
クラスの新規インスタンスを作成します。
オーバーロード・リスト:
このコンストラクタでは、OracleCommandBuilder
クラスのインスタンスを作成します。
OracleCommandBuilder(OracleDataAdapter)
このコンストラクタでは、OracleCommandBuilder
クラスのインスタンスを作成し、DataAdapter
プロパティを指定されたOracleDataAdapter
オブジェクトに設定します。
このコンストラクタでは、OracleCommandBuilder
クラスのインスタンスを作成します。
宣言
// C# public OracleCommandBuilder();
備考
デフォルトのコンストラクタ
このコンストラクタでは、OracleCommandBuilder
クラスのインスタンスを作成し、DataAdapter
プロパティを指定されたOracleDataAdapter
オブジェクトに設定します。
宣言
// C#
public OracleCommandBuilder(OracleDataAdapter da);
パラメータ
da
指定されたOracleDataAdapter
オブジェクト
OracleCommandBuilder
静的メソッドのリストを、表5-13に示します。
表5-13 OracleCommandBuilder静的メソッド
メソッド | 説明 |
---|---|
|
指定した |
|
|
このメソッドは、指定したOracleCommand
で表されるストアド・プロシージャまたは関数のパラメータに対する問合せを実行し、その戻り値をコマンドのOracleParameterCollection
に移入します。
宣言
// C#
public static void DeriveParameters(OracleCommand command);
パラメータ
command
パラメータが導出されるストアド・プロシージャまたは関数を表すコマンド
例外
InvalidOperationException
- CommandText
がストアド・プロシージャまたは関数の有効な名前でないか、CommandType
がCommandType.StoredProcedure
でないか、Connection.State
がConnectionState.Open
ではありません。
備考
DeriveParameters
を使用して、ストアド・ファンクションを表すOracleCommand
オブジェクトのParameter
コレクションを移入すると、このファンクションの戻り値が最初のパラメータ(OracleParameterCollection
の位置0
)としてバインドされます。
DeriveParameters
を使用できるのはストアド・プロシージャまたは関数に対してのみであり、無名PL/SQLブロックに対しては使用できません。
DeriveParameters
を起動すると、コマンドのパラメータ・コレクション内の既存のパラメータがすべて削除されます。
DeriveParameters
によりデータベース・ラウンドトリップが発生するため、このメソッドは設計時にのみ使用してください。本番環境での不必要なデータベース・ラウンドトリップを避けるには、設計時にDeriveParameters
メソッドにより戻された明示的なパラメータ設定でDeriveParameters
メソッド自体を置き換えるようにしてください。
DeriveParameters
でストアド・プロシージャ名または関数名の大/小文字の区別が保持されるのは、名前が二重引用符で囲まれている場合のみです。たとえば、データベース内のストアド・プロシージャの名前が大/小文字の混在したGetEmployees
である場合、OracleCommand
オブジェクトのCommandText
プロパティは、次の例のように適切に設定する必要があります。
cmd.CommandText = "\"GetEmployees\"";
パッケージ内のストアド・プロシージャおよび関数は、次の書式で指定する必要があります。
<package name>.<procedure or function name>
たとえば、EmpProcedures
(大/小文字が混在)というパッケージ内のGetEmployees
(大/小文字が混在)というストアド・プロシージャのパラメータを取得する場合、OracleCommand
に指定する名前は次のとおりです。
"\"EmpProcedures\".\"GetEmployees\""
DeriveParameters
をオブジェクト型のメソッドに使用することはできません。
導出されるパラメータには、ストアド・プロシージャを正しく実行するのに必要なすべてのメタデータ情報が含まれています。必要な場合は、アプリケーションで実行の前にパラメータの値を指定する必要があります。またアプリケーションでは、実行前にパラメータのメタデータ情報が変更される場合があります。たとえば、ストアド・プロシージャの実行を最適化するために、OracleParameter
のSize
プロパティがPL/SQLのCHARおよびSTRING型に変更されます。
導出されるパラメータの出力値は、デフォルトでは.NETタイプとして戻されます。出力パラメータをプロバイダ・タイプとして取得するには、パラメータのOracleDbType
プロパティをアプリケーションで明示的に設定して、このデフォルト動作をオーバーライドする必要があります。これを簡単に行う1つの方法として、プロバイダ・タイプとして戻す必要のある出力パラメータのすべてで、OracleDbType
をそれ自体に設定するという方法があります。
指定したOracleCommand
のBindByName
プロパティはそのまま残されますが、アプリケーションでその値を変更することができます。
指定したストアド・プロシージャまたは関数がオーバーロードの場合は、パラメータ・コレクションへの移入に最初のオーバーロードが使用されます。
// Database Setup /* connect scott/tiger@oracle CREATE OR REPLACE PROCEDURE MyOracleStoredProc (arg_in IN VARCHAR2, arg_out OUT VARCHAR2) IS BEGIN arg_out := arg_in; END; / */ // C# using System; using System.Data; using Oracle.DataAccess.Client; class DeriveParametersSample { static void Main() { // Create the PL/SQL Stored Procedure MyOracleStoredProc as indicated in // the preceding Database Setup string constr = "User Id=scott;Password=tiger;Data Source=oracle"; OracleConnection con = new OracleConnection(constr); con.Open(); // Create an OracleCommand OracleCommand cmd = new OracleCommand("MyOracleStoredProc", con); cmd.CommandType = CommandType.StoredProcedure; // Derive Parameters OracleCommandBuilder.DeriveParameters(cmd); Console.WriteLine("Parameters Derived"); // Prints "Number of Parameters for MyOracleStoredProc = 2" Console.WriteLine("Number of Parameters for MyOracleStoredProc = {0}", cmd.Parameters.Count); // The PL/SQL stored procedure MyOracleStoredProc has one IN and // one OUT parameter. Set the Value for the IN parameter. cmd.Parameters[0].Value = "MyText"; // The application may modify the other OracleParameter properties also // This sample uses the default Size for the IN parameter and modifies // the Size for the OUT parameter // The default size for OUT VARCHAR2 is 4000 // Prints "cmd.Parameters[1].Size = 4000" Console.WriteLine("cmd.Parameters[1].Size = " + cmd.Parameters[1].Size); // Set the Size for the OUT parameter cmd.Parameters[1].Size = 6; // Execute the command cmd.ExecuteNonQuery(); // Prints "cmd.Parameters[1].Value = MyText" Console.WriteLine("cmd.Parameters[1].Value = " + cmd.Parameters[1].Value); con.Close(); con.Dispose(); } }
例
OracleCommandBuilder
プロパティのリストを、表5-14に示します。
表5-14 OracleCommandBuilderプロパティ
名前 | 説明 |
---|---|
|
|
SQL文を生成するときにOracleオブジェクト名の前後に二重引用符を使用するかどうかを示します |
|
|
サポート対象外 |
|
サポート対象外 |
|
サポート対象外 |
SQL文が生成される |
|
|
名前に空白または予約語などの特殊文字を含むデータベース・オブジェクトを指定するために使用される単一または複数の開始文字を指定します ADO.NET 2.0準拠のODP.NETでのみサポート |
|
名前に空白または予約語などの特殊文字を含むデータベース・オブジェクトを指定するために使用される単一または複数の終了文字を指定します ADO.NET 2.0準拠のODP.NETでのみサポート |
|
スキーマ識別子とその他の識別子のセパレータに使用される文字を指定します ADO.NET 2.0準拠のODP.NETでのみサポート |
|
|
このプロパティでは、SQL文を生成する場合にOracleオブジェクト名(表または列など)の前後に二重引用符を使用するかどうかを指定します。
宣言
// C# bool CaseSensitive {get; set;}
プロパティ値
二重引用符を使用するかどうかを示すbool
備考
デフォルト = false
このプロパティは、サポートされていません。
宣言
// ADO.NET 2.0: C# public override CatalogLocation CatalogLocation {get; set;}
例外
NotSupportedException
: このプロパティは、サポートされていません。
備考
このプロパティは、サポートされていません。
このプロパティは、サポートされていません。
宣言
// ADO.NET 2.0: C# public override string CatalogSeparator {get; set;}
例外
NotSupportedException
: このプロパティは、サポートされていません。
備考
このプロパティは、サポートされていません。
このプロパティは、サポートされていません。
宣言
// ADO.NET 2.0: C# public override string ConflictOption {get; set;}
例外
NotSupportedException
: このプロパティは、サポートされていません。
備考
このプロパティは、サポートされていません。
このプロパティでは、生成されるSQL文の対象となるOracleDataAdapter
オブジェクトを示します。
宣言
// C# OracleDataAdapter DataAdapter{get; set;}
プロパティ値
OracleDataAdapter
オブジェクト
備考
デフォルト = null
このプロパティでは、名前に空白または予約語などの特殊文字を含むデータベース・オブジェクトを指定するために使用される単一または複数の開始文字を指定します。
宣言
// ADO.NET 2.0: C# public override string QuotePrefix {get; set;}
プロパティ値
使用する単一または複数の開始文字。デフォルト値は"\""
です。
例外
ArgumentNullException
: 入力値はNULLです。
NotSupportedException
: 入力値は"\""
でありません。
備考
このプロパティは、どのOracleConnection
またはOracleCommand
オブジェクトからも独立しています。サポートされている引用接頭辞は"\""
のみです。
このプロパティでは、名前に空白または予約語などの特殊文字を含むデータベース・オブジェクトを指定するために使用される単一または複数の終了文字を指定します。
宣言
// ADO.NET 2.0: C# public override string QuoteSuffix {get; set;}
プロパティ値
使用する単一または複数の終了文字。デフォルト値は"\""
です。
例外
ArgumentNullException
: 入力値はNULLです。
NotSupportedException
: 入力値は"\""
でありません。
備考
このプロパティは、どのOracleConnection
またはOracleCommand
オブジェクトからも独立しています。サポートされている引用接尾辞は"\""
のみです。
このプロパティでは、スキーマ識別子とその他の識別子のセパレータに使用される文字を指定します。
宣言
// ADO.NET 2.0: C# public override string SchemaSeparator {get; set; }
プロパティ値
スキーマ・セパレータとして使用される文字。
例外
ArgumentNullException
: 入力値はNULLです。
NotSupportedException
: 入力値はドット(.
)でありません。
備考
デフォルトのスキーマ・セパレータはドット(.
)です。このプロパティで許容される値はドット(.
)のみです。
このプロパティは、どのOracleConnection
またはOracleCommand
オブジェクトからも独立しています。
例
// C# using System; using System.Data; using System.Data.Common; using Oracle.DataAccess.Client; class SchemaSeperatorSample { static void Main(string[] args) { try { OracleCommandBuilder cmdBuilder = new OracleCommandBuilder(); //schemaSeparator is dot(.) Console.WriteLine("schemaSeparator is {0}", cmdBuilder.SchemaSeparator); //set the schemaseparator, only '.' is allowed. cmdBuilder.SchemaSeparator = "."; // the only acceptable value for this property is a dot (.) // Hence the following line will throw NotSupportedException cmdBuilder.SchemaSeparator = "!"; } catch (Exception ex) { Console.WriteLine(ex.Message); Console.WriteLine(ex.StackTrace); } } }
OracleCommandBuilder
パブリック・メソッドのリストを、表5-15に示します。
表5-15 OracleCommandBuilderパブリック・メソッド
パブリック・メソッド | 説明 |
---|---|
|
|
|
|
|
|
データベース上で削除を実行するSQL文( |
|
|
|
データベース上で挿入を実行するSQL文( |
|
|
|
|
|
データベース上で更新を実行するSQL文( |
|
|
|
|
引用符で囲まずに指定された識別子の正しい引用書式を、識別子内に埋め込まれた引用符を適切にエスケープして戻します ADO.NET 2.0準拠のODP.NETでのみサポート |
|
|
|
引用符で囲んで指定された識別子の正しい引用符なし書式を、識別子内に埋め込まれた引用符のエスケープ表記を削除して戻します ADO.NET 2.0準拠のODP.NETでのみサポート |
|
|
このメソッドでは、OracleDataAdapter
でアプリケーションがUpdate()
を呼び出すときにデータベース上で削除を実行するSQL文(CommandText
)が含まれている、自動生成されたOracleCommand
オブジェクトを取得します。
宣言
// C# public OracleCommand GetDeleteCommand();
戻り値
OracleCommand
例外
ObjectDisposedException
: OracleCommandBuilder
オブジェクトはすでに処理されています。
InvalidOperationException
: SelectCommand
またはDataAdapter
プロパティのいずれかがNULL、または主キーをOracleDataAdapter
のSelectCommand
プロパティから取得できない場合。
このメソッドでは、OracleDataAdapter
でアプリケーションがUpdate()
を呼び出すときにデータベース上で挿入を実行するSQL文(CommandText
)を含んでいる、自動生成されたOracleCommand
オブジェクトを取得します。
宣言
// C# public OracleCommand GetInsertCommand();
戻り値
OracleCommand
例外
ObjectDisposedException
: OracleCommandBuilder
オブジェクトはすでに処理されています。
InvalidOperationException
: SelectCommand
またはDataAdapter
プロパティのいずれかがNULL、または主キーをOracleDataAdapter
のSelectCommand
プロパティから取得できない場合。
このメソッドでは、OracleDataAdapter
でアプリケーションがUpdate()
を呼び出すときにデータベース上で更新を実行するSQL文(CommandText
)を含んでいる、自動生成されたOracleCommand
オブジェクトを取得します。
宣言
// C# public OracleCommand GetUpdateCommand();
戻り値
OracleCommand
例外
ObjectDisposedException
: OracleCommandBuilder
オブジェクトはすでに処理されています。
InvalidOperationException
: SelectCommand
またはDataAdapter
プロパティのいずれかがNULL、または主キーをOracleDataAdapter
のSelectCommand
プロパティから取得できない場合。
このメソッドでは、引用符で囲まずに指定された識別子の正しい引用書式を、識別子内に埋め込まれた引用符を適切にエスケープして戻します。
宣言
// ADO.NET 2.0: C#
public override string QuoteIdentifier(string unquotedIdentifier);
パラメータ
UnquotedIdentifier
引用符で囲まれていない識別子文字列。
戻り値
引用符で囲まれた識別子。識別子内に埋め込まれた引用符は適切にエスケープされます。
例外
ArgumentNullException
: 入力パラメータはNULLです。
備考
このメソッドは、どのOracleConnection
またはOracleCommand
オブジェクトからも独立しています。
例
// C# using System; using System.Data; using System.Data.Common; using Oracle.DataAccess.Client; class QuoteIdentifierSample { static void Main(string[] args) { OracleCommandBuilder builder = new OracleCommandBuilder(); string quoteIdentifier = builder.QuoteIdentifier("US\"ER"); //quoteIdentifier for "US\"ER" is (\"US\"\"ER\") Console.WriteLine("quoteIdentifier is {0}" , quoteIdentifier); } }
このメソッドでは、INSERT
、UPDATE
またはDELETE
文の生成に使用されるデータベース・スキーマ情報をリフレッシュします。
宣言
// ADO.NET 2.0: C# public override void RefreshSchema();
// ADO.NET 1.x: C#
public void RefreshSchema();
備考
OracleDataAdapter
のSelectCommand
オブジェクトが変更されると、常にアプリケーションによってRefreshSchema
が呼び出されます。
このメソッドでは、引用符で囲んで指定された識別子の正しい引用符なし書式を、識別子内に埋め込まれた引用符のエスケープ表記を削除して戻します。
宣言
// ADO.NET 2.0: C#
public override string UnquoteIdentifier(string quotedIdentifier);
パラメータ
quotedIdentifier
引用符で囲まれた文字列識別子。
戻り値
引用符で囲まれていない、埋め込まれた引用符のエスケープ表記が削除された識別子。
例外
ArgumentNullException
: 入力パラメータはNULLです。
ArgumentException
: 入力値は空です。
備考
このメソッドは、どのOracleConnection
またはOracleCommand
オブジェクトからも独立しています。
例
// C# using System; using System.Data; using System.Data.Common; using Oracle.DataAccess.Client; class UnQuoteIdentifierSample { static void Main(string[] args) { //create an OracleCommandBuilder object. OracleCommandBuilder builder = new OracleCommandBuilder(); string identifier = "US\"ER"; Console.WriteLine("Identifier is {0}", identifier); // quote the identifier string quoteIdentifier = builder.QuoteIdentifier(identifier); //quoteIdentifier of "US\"ER" is (\"US\"\"ER\") Console.WriteLine("QuotedIdentifier is {0}" , quoteIdentifier); string unquoteIdentifier = builder.UnquoteIdentifier(quoteIdentifier); //And its unquoteIdentifier is US\"ER Console.WriteLine("UnquotedIdentifier is {0}" , unquoteIdentifier); } }
OracleCommandBuilder
イベントのリストを、表5-16に示します。