DataAdapter によるパラメータの使用

DataAdapter は、データ ソースからデータを取得したりデータ ソースのデータを更新したりするために使用される 4 つのプロパティを持っています。SelectCommand プロパティは、データ ソースからデータを返します。InsertCommandUpdateCommandDeleteCommand の各プロパティは、データ ソースの変更を管理するために使用します。SelectCommand プロパティは DataAdapterFill メソッドを呼び出す前に設定する必要があります。InsertCommandUpdateCommandDeleteCommand の各プロパティは、DataAdapterUpdate メソッドを呼び出す前に DataSet 内のデータに対して行われた変更に基づいて設定する必要があります。たとえば、行が追加された場合、InsertCommandUpdate 呼び出しの前に設定されている必要があります。Update が挿入行、更新行、または削除行を処理しているとき、DataAdapter がそれぞれの Command プロパティを使用してそのアクションを処理します。変更された行についての現在の情報が Parameters コレクションを通じて Command オブジェクトに渡されます。

たとえば、データ ソースの行を更新するときは、一意識別子を使用してテーブル内の更新する列を識別する UPDATE ステートメントを呼び出します。一意識別子は、一般には主キー フィールドの値です。UPDATE ステートメントは、次の SQL ステートメントで示すように、一意識別子および更新する列および値の両方を含むパラメータを使用します。

UPDATE Customers SET CompanyName = @CompanyName WHERE CustomerID = @CustomerID

この例では、CompanyName フィールドは、CustomerID@CustomerID パラメータの値と等しい列の @CompanyName パラメータの値で更新されます。これらのパラメータは Parameter オブジェクトの SourceColumn プロパティを使用して、変更された行から情報を取得します。前のサンプル UPDATE ステートメントのパラメータを次に示します。

custDA.Parameters.Add("@CompanyName", SqlDbType.NChar, 15, "CompanyName")
Dim myParm As SqlParameter = custDA.UpdateCommand.Parameters.Add("@CustomerID", _
                                              SqlDbType.NChar, 5, "CustomerID")
myParm.SourceVersion = DataRowVersion.Original

Parameters コレクションの Add メソッドは、パラメータ名、DataAdapter 固有の型、サイズ (その型に適用可能な場合)、および DataTableSourceColumn の名前を受け取ります。@CustomerID パラメータの SourceVersionOriginal に設定されていることに注意してください。この設定により、変更済みの DataRow の中で、識別を行う 1 つまたは複数の列の値が既に変更されている場合に、データ ソース内の既存の行を更新することを保証できます。識別列の値が既に変更されている場合は、Original 行の値はデータ ソースの現在の値と一致し、Current 行の値は更新済みの値を格納します。@CompanyName パラメータの SourceVersion は設定されていないため、既定の Current の行の値が使用されます。

SQL ステートメントを DataAdapterSelectCommandInsertCommandUpdateCommandDeleteCommand の各プロパティの CommandText として使用する例を次に示します。OleDbDataAdapter オブジェクトと OdbcDataAdapter オブジェクトの場合は、疑問符 (?) のプレースホルダを使用してパラメータを識別する必要があります。SqlDataAdapter オブジェクトの場合は、名前付きのパラメータを使用する必要があります。

SqlClient

Dim selectSQL As String = "SELECT CustomerID, CompanyName FROM Customers WHERE Country = @Country AND City = @City"
Dim insertSQL As String = "INSERT INTO Customers (CustomerID, CompanyName) " & _
                          "VALUES (@CustomerID, @CompanyName)"

Dim updateSQL As String = "UPDATE Customers SET CustomerID = @CustomerID, CompanyName = @CompanyName " & _
                          "WHERE CustomerID = @OldCustomerID"

Dim deleteSQL As String = "DELETE FROM Customers WHERE CustomerID = @CustomerID"
[C#]
string selectSQL = "SELECT CustomerID, CompanyName FROM Customers WHERE Country = @Country AND City = @City";
string insertSQL = "INSERT INTO Customers (CustomerID, CompanyName) " +
                   "VALUES (@CustomerID, @CompanyName)";

string updateSQL = "UPDATE Customers SET CustomerID = @CustomerID, CompanyName = @CompanyName " +
                   "WHERE CustomerID = @OldCustomerID";

string deleteSQL = "DELETE FROM Customers WHERE CustomerID = @CustomerID";

OleDb または Odbc

Dim selectSQL As String = "SELECT CustomerID, CompanyName FROM Customers WHERE Country = ? AND City = ?"
Dim insertSQL AS String = "INSERT INTO Customers (CustomerID, CompanyName) VALUES (?, ?)"

Dim updateSQL AS String = "UPDATE Customers SET CustomerID = ?, CompanyName = ? WHERE CustomerID = ?"

Dim deleteSQL As String = "DELETE FROM Customers WHERE CustomerID = ?"
[C#]
string selectSQL = "SELECT CustomerID, CompanyName FROM Customers WHERE Country = ? AND City = ?";
string insertSQL = "INSERT INTO Customers (CustomerID, CompanyName) " +
                   "VALUES (?, ?)";

string updateSQL = "UPDATE Customers SET CustomerID = ?, CompanyName = ? " +
                   "WHERE CustomerID = ? ";

string deleteSQL = "DELETE FROM Customers WHERE CustomerID = ?";

パラメータとして使用されるクエリ ステートメントは、作成する必要のある入力パラメータおよび出力パラメータを定義します。パラメータを作成するには、Parameters.Add メソッドまたは Parameter コンストラクタを使用して列名、データ型、およびサイズを指定します。Integer など組み込みのデータ型の場合は、サイズを含める必要はありませんし、その場合は自動的に既定のサイズを指定することになります。

前の例の SQL ステートメントのパラメータを作成し、DataSet にデータを格納するサンプル コードを次に示します。

SqlClient

Dim nwindConn As SqlConnection = New SqlConnection("Data Source=localhost;Integrated Security=SSPI;Initial Catalog=northwind")
Dim custDA As SqlDataAdapter = New SqlDataAdapter

Dim selectCMD AS SqlCommand = New SqlCommand(selectSQL, nwindConn)
custDA.SelectCommand = selectCMD

' Add parameters and set values.
selectCMD.Parameters.Add("@Country", SqlDbType.NVarChar, 15).Value = "UK"
selectCMD.Parameters.Add("@City", SqlDbType.NVarChar, 15).Value = "London"

Dim custDS As DataSet = New DataSet
custDA.Fill(custDS, "Customers")
[C#]
SqlConnection nwindConn = new SqlConnection("Data Source=localhost;Integrated Security=SSPI;Initial Catalog=northwind");
SqlDataAdapter custDA = new SqlDataAdapter();         

SqlCommand selectCMD = new SqlCommand(selectSQL, nwindConn);
custDA.SelectCommand = selectCMD;

// Add parameters and set values.
selectCMD.Parameters.Add("@Country", SqlDbType.NVarChar, 15).Value = "UK";
selectCMD.Parameters.Add("@City", SqlDbType.NVarChar, 15).Value = "London";

DataSet custDS = new DataSet();
custDA.Fill(custDS, "Customers");

OleDb

Dim nwindConn As OleDbConnection = New OleDbConnection("Provider=SQLOLEDB;Data Source=localhost;" & _
                                                       "Integrated Security=SSPI;Initial Catalog=northwind")
Dim custDA As OleDbDataAdapter = New OleDbDataAdapter 

Dim selectCMD AS OleDbCommand = New OleDbCommand(selectSQL, nwindConn)
custDA.SelectCommand = selectCMD

' Add parameters and set values.
selectCMD.Parameters.Add("@Country", OleDbType.VarChar, 15).Value = "UK"
selectCMD.Parameters.Add("@City", OleDbType.VarChar, 15).Value = "London"

Dim custDS As DataSet = New DataSet
custDA.Fill(custDS, "Customers")
[C#]
OleDbConnection nwindConn = new OleDbConnection("Provider=SQLOLEDB;Data Source=localhost;" +
                                                "Integrated Security=SSPI;Initial Catalog=northwind;");
OleDbDataAdapter custDA = new OleDbDataAdapter();

OleDbCommand selectCMD = new OleDbCommand(selectSQL, nwindConn);
custDA.SelectCommand = selectCMD;

// Add parameters and set values.
selectCMD.Parameters.Add("@Country", OleDbType.VarChar, 15).Value = "UK";
selectCMD.Parameters.Add("@City", OleDbType.VarChar, 15).Value = "London";

DataSet custDS = new DataSet();
custDA.Fill(custDS, "Customers");

Odbc

Dim nwindConn As OdbcConnection = New OdbcConnection("Driver={SQL Server};Server=localhost;" & _
                                                     "Trusted_Connection=yes;Database=northwind")
Dim custDA As OdbcDataAdapter = New OdbcDataAdapter

Dim selectCMD AS OdbcCommand = New OdbcCommand(selectSQL, nwindConn)
custDA.SelectCommand = selectCMD

' Add Parameters and set values.
selectCMD.Parameters.Add("@Country", OdbcType.VarChar, 15).Value = "UK"
selectCMD.Parameters.Add("@City", OdbcType.VarChar, 15).Value = "London"

Dim custDS As DataSet = New DataSet
custDA.Fill(custDS, "Customers")
[C#]
OdbcConnection nwindConn = new OdbcConnection("Driver={SQL Server};Server=localhost;" +
                                              "Trusted_Connection=yes;Database=northwind;");
OdbcDataAdapter custDA = new OdbcDataAdapter();

OdbcCommand selectCMD = new OdbcCommand(selectSQL, nwindConn);
custDA.SelectCommand = selectCMD;

//Add Parameters and set values.
selectCMD.Parameters.Add("@Country", OdbcType.VarChar, 15).Value = "UK";
selectCMD.Parameters.Add("@City", OdbcType.VarChar, 15).Value = "London";

DataSet custDS = new DataSet();
custDA.Fill(custDS, "Customers");

メモ   あるパラメータに対してパラメータ名がサポートされていない場合は、"Parameter1" から増分していく既定名 ParameterN が割り当てられます。パラメータ名を指定するときには、"ParameterN" の名前付けルールを使用しないことをお勧めします。これは、指定した名前が ParameterCollection 内の既存のパラメータ名と競合しないようにするためです。指定した名前が既に存在する場合は、例外がスローされます。

Parameter.DbType

パラメータの型は .NET Framework データ プロバイダに固有の属性です。型が指定されている場合は、その値がデータ ソースに渡される前に Parameter の値が .NET Framework データ プロバイダ型に変換されます。型が指定されていない場合は、ADO.NET は Parameter オブジェクトの Value の .NET Framework 型の中から Parameter の NET Framework データ プロバイダ型を推論します。

Parameter オブジェクトの DbType プロパティを特定の System.Data.DbType に設定する一般的な方法で Parameter の型を指定することもできます。また、ADO.NET は Parameter オブジェクトの DbType の中から Parameter の .NET Framework データ プロバイダ型を推論します。

Parameter オブジェクトの .NET Framework データ プロバイダ型は、Parameter オブジェクトの Value の .NET Framework 型か、または Parameter オブジェクトの DbType から推論されます。Parameter 値として渡されるオブジェクトまたは指定された DbType に基づいて推論される Parameter 型を、次の表に示します。

.NET Framework 型 System.Data.DbType SqlDbType OleDbType OdbcType OracleType
bool Boolean Bit Boolean Bit Byte
byte Byte TinyInt UnsignedTinyInt TinyInt Byte
byte[] Binary VarBinary。バイト配列が VarBinary の最大サイズ (8000 バイト) より大きい場合は、この暗黙の変換はエラーになります。8000 バイトを超えるバイト配列の場合は、明示的に SqlDbType を設定してください。 VarBinary Binary Raw
char     char からの SqlDbType の推論はサポートされていません。 Char Char Byte
DateTime DateTime DateTime DBTimeStamp DateTime DateTime
Decimal Decimal Decimal Decimal Numeric Number
double Double Float Double Double Double
float Single Real Single Real Float
Guid Guid UniqueIdentifier Guid UniqueIdentifier Raw
Int16 Int16 SmallInt SmallInt SmallInt Int16
Int32 Int32 Int Int Int Int32
Int64 Int64 BitInt BigInt BigInt Number
object Object Variant Variant Object からの OdbcType の推論はサポートされていません。 Blob
string String NVarChar。文字列が NVarChar の最大サイズ (4000 文字) より大きい場合、この暗黙の変換はエラーになります。4000 文字を超える文字列の場合は、明示的に SqlDbType を設定してください。 VarWChar NVarChar NVarChar
TimeSpan Time TimeSpan からの SqlDbType の推論はサポートされていません。 DBTime Time DateTime
UInt16 UInt16 UInt16 からの SqlDbType の推論はサポートされていません。 UnsignedSmallInt Int UInt16
UInt32 UInt32 UInt32 からの SqlDbType の推論はサポートされていません。 UnsignedInt BigInt UInt32
UInt64 UInt64 UInt64 からの SqlDbType の推論はサポートされていません。 UnsignedBigInt Numeric Number
    AnsiString VarChar VarChar VarChar VarChar
    AnsiStringFixedLength Char Char Char Char
Currency Money Currency Currency からの OdbcType の推論はサポートされていません。 Number
    Date Date からの SqlType の推論はサポートされていません。 DBDate Date DateTime
    SByte SByte からの SqlType の推論はサポートされていません。 TinyInt SByte からの OdbcType の推論はサポートされていません。 SByte
    StringFixedLength NChar WChar NChar NChar
    Time Time からの SqlType の推論はサポートされていません。 DBTime Time DateTime
    VarNumeric VarNumeric からの SqlDbType の推論はサポートされていません。 VarNumeric VarNumeric からの OdbcType の推論はサポートされていません。 Number

メモ   .NET Framework Version 1.0 に同梱されている .NET Framework データ プロバイダは、Decimal パラメータ値の PrecisionScale を確認しないため、切り捨てられたデータがデータ ソースに挿入されることがあります。.NET Framework Version 1.0 を使用している場合は、Decimal 値の PrecisionScale を検証してからパラメータ値を設定してください。

.NET Framework Version 1.1 以降では、Decimal パラメータ値で無効な Precision が設定されている場合、例外がスローされます。Decimal パラメータ スケールを超える Scale 値は、切り捨てられます。

Parameter.Direction

ParameterDirection を設定するために ParameterDirection 列挙型で使用できる値を次の表に示します。

メンバ名 説明
Input このパラメータは入力パラメータです。これは、既定の設定です。
InputOutput このパラメータは入力と出力の両方の機能を持っています。
Output このパラメータは出力パラメータです。
ReturnValue このパラメータは戻り値を表します。

ParameterDirection を設定する方法を次のサンプル コードに示します。

myParm.Direction = ParameterDirection.Output

Parameter.SourceColumn、Parameter.SourceVersion

SourceColumn および SourceVersion は、Parameter コンストラクタに記述子として渡したり、既存の Parameter のプロパティとして設定することもできます。SourceColumn は、Parameter の値の取得元である DataRowDataColumn の名前です。SourceVersion は、DataAdapter が値を取得するために使用する DataRow バージョンを指定します。

SourceVersion で使用できる DataRowVersion 列挙型の値を次の表に示します。

メンバ名 説明
Current このパラメータは列の現在の値を使用します。これは、既定の設定です。
Default このパラメータは列の DefaultValue を使用します。
Original このパラメータは列の元の値を使用します。
Proposed このパラメータは提示された値を使用します。

CustomerID 列を 2 つのパラメータ @CustomerID (SET CustomerID = @CustomerID) および @OldCustomerID (WHERE CustomerID = @OldCustomerID) の SourceColumn として使用する UPDATE ステートメントを定義するサンプル コードを次に示します。@CustomerID パラメータは CustomerID 列を DataRow の現在の値に更新するために使用されています。そのため、SourceVersionCurrent に設定した CustomerID SourceColumn が使用されています。@OldCustomerID パラメータは、データ ソースの現在の行を識別するために使用されています。その行の Original バージョンで一致する列の値が見つかったため、SourceVersionOriginal に設定した同じ SourceColumn (CustomerID) が使用されています。

SqlClient

custDA.UpdateCommand.Parameters.Add("@CustomerID", SqlDbType.NChar, 5, "CustomerID")

custDA.UpdateCommand.Parameters.Add("@CompanyName", SqlDbType.NVarChar, 40, "CompanyName")

Dim myParm As SqlParameter = custDA.UpdateCommand.Parameters.Add("@OldCustomerID", _
                               SqlDbType.NChar, 5, "CustomerID")
myParm.SourceVersion = DataRowVersion.Original
[C#]
custDA.UpdateCommand.Parameters.Add("@CustomerID", SqlDbType.NChar, 5, "CustomerID");

custDA.UpdateCommand.Parameters.Add("@CompanyName", SqlDbType.NVarChar, 40, "CompanyName");

SqlParameter myParm = custDA.UpdateCommand.Parameters.Add("@OldCustomerID", SqlDbType.NChar, 5, "CustomerID");
myParm.SourceVersion = DataRowVersion.Original;

OleDb

custDA.UpdateCommand.Parameters.Add("@CustomerID", OleDbType.Char, 5,"CustomerID")

custDA.UpdateCommand.Parameters.Add("@CompanyName", OleDbType.VarChar, 40, "CompanyName")

Dim myParm As OleDbParameter = custDA.UpdateCommand.Parameters.Add("@OldCustomerID", _
                                 OleDbType.Char, 5, "CustomerID")
myParm.SourceVersion = DataRowVersion.Original
[C#]
custDA.UpdateCommand.Parameters.Add("@CustomerID", OleDbType.Char, 5, "CustomerID");

custDA.UpdateCommand.Parameters.Add("@CompanyName", OleDbType.VarChar, 40, "CompanyName");

OleDbParameter myParm = custDA.UpdateCommand.Parameters.Add("@OldCustomerID", OleDbType.Char, 5, "CustomerID");
myParm.SourceVersion = DataRowVersion.Original;

Odbc

custDA.UpdateCommand.Parameters.Add("@CustomerID", OdbcType.Char, 5, "CustomerID")

custDA.UpdateCommand.Parameters.Add("@CompanyName", OdbcType.VarChar, 40, "CompanyName")

Dim myParm As OdbcParameter = custDA.UpdateCommand.Parameters.Add("@oldCustomerID", _
                              OdbcType.Char, 5, "CustomerID")
myParm.SourceVersion = DataRowVersion.Original
[C#]
custDA.UpdateCommand.Parameters.Add("@CustomerID", OdbcType.Char, 5, "CustomerID");

custDA.UpdateCommand.Parameters.Add("@CompanyName", OdbcType.VarChar, 40, "CompanyName");

OdbcParameter myParm = custDA.UpdateCommand.Parameters.Add("@oldCustomerID", OdbcType.Char, 5, "CustomerID");
myParm.SourceVersion = DataRowVersion.Original;

UpdatedRowSource

Command オブジェクトの UpdatedRowSource プロパティを使用すると、データ ソースから返された値を DataSet に割り当てる方法を制御できます。UpdatedRowSource プロパティを UpdateRowSource 列挙型の値の 1 つに設定することで、DataAdapter コマンドが返したパラメータを無視するか、DataSet 内の変更行に適用するかを制御できます。最初に返された行 (存在する場合) を、DataSet 内の変更行に適用するかどうかを指定することもできます。

UpdateRowSource 列挙型のさまざまの値と、それらの値が DataAdapter で使用されるコマンドの動作にどのように影響するかを次の表で説明します。

UpdateRowSource 説明
Both 出力パラメータと返された結果セットの最初の行を DataSet 内の変更行に割り当てます。
FirstReturnedRecord 返された結果セットの最初の行のデータだけを DataSet 内の変更行に割り当てます。
None 出力パラメータまたは返された結果セットの行が無視されます。
OutputParameters 出力パラメータだけを DataSet 内の変更行に割り当てます。

参照

.NET Framework データ プロバイダによるデータのアクセス | コマンドによるストアド プロシージャの使用 | DataRowVersion 列挙体 | OleDbDataAdapter クラス | OdbcDataAdapter クラス | ParameterDirection 列挙体 | SqlDataAdapter クラス