다음을 통해 공유


DataAdapter 매개 변수(ADO.NET)

업데이트: November 2007

DbDataAdapter에는 데이터 소스에서 데이터를 검색하고 업데이트하는 데 사용되는 다음과 같은 네 가지 속성이 있습니다. SelectCommand 속성은 데이터 소스에서 데이터를 반환하며 InsertCommand, UpdateCommandDeleteCommand 속성은 데이터 소스에서 변경 내용을 관리하는 데 사용됩니다. SelectCommand 속성은 DataAdapter의 Fill 메서드를 호출하기 전에 설정해야 합니다. InsertCommand, UpdateCommand 또는 DeleteCommand 속성은 DataAdapter의 Update 메서드가 호출되기 전에 설정해야 하며, DataTable의 데이터에 적용된 변경 내용에 따라 설정 값이 달라집니다. 예를 들어, 행이 추가되었으면 Update를 호출하기 전에 InsertCommand를 설정해야 합니다. Update가 삽입, 업데이트 또는 삭제된 행을 처리하는 동안 DataAdapter는 해당 Command 속성을 사용하여 동작을 처리합니다. 수정된 행에 대한 현재 정보는 Parameters 컬렉션을 통해 Command 개체에 전달됩니다.

데이터 소스에서 행을 업데이트할 때는 업데이트된 테이블의 행을 고유 식별자로 식별하는 UPDATE 문을 호출합니다. 고유 식별자란 대개 기본 키 필드의 값을 말합니다. UPDATE 문은 다음의 Transact-SQL 문과 같이 고유 식별자와 업데이트된 열 및 값을 모두 포함하는 매개 변수를 사용합니다.

UPDATE Customers SET CompanyName = @CompanyName 
  WHERE CustomerID = @CustomerID
참고:

매개 변수 자리 표시자의 구문은 데이터 소스에 따라 다릅니다. 이 예제에서는 SQL Server 데이터 소스용 자리 표시자를 보여 줍니다. System.Data.OleDbSystem.Data.Odbc 매개 변수의 경우 물음표(?) 자리 표시자를 사용합니다.

이 Visual Basic 예제에서는 CustomerID가 @CustomerID매개 변수의 값과 동일한 행에 대해 CompanyName 필드가 @CompanyName 매개 변수의 값으로 업데이트됩니다. 이 매개 변수는 SqlParameter 개체의 SourceColumn 속성을 사용하여 수정된 행의 정보를 검색합니다. 다음은 앞에 나온 샘플 UPDATE 문에 대한 매개 변수입니다. 이 코드에서는 adapter 변수가 올바른 SqlDataAdapter 개체를 나타낸다고 가정합니다.

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

Parameters 컬렉션의 Add 메서드는 매개 변수 이름, 데이터 형식, 크기(해당 형식에 적용되는 경우) 및 DataTable의 SourceColumn 이름을 사용합니다. @CustomerID 매개 변수의 SourceVersion은 Original로 설정됩니다. 그러면 식별하는 열 값이 수정된 DataRow에서 변경된 경우 데이터 소스의 기존 행이 업데이트됩니다. 이 경우 Original 행 값은 데이터 소스의 현재 값과 일치하고 Current 행 값에는 업데이트된 값이 포함됩니다. @CompanyName 매개 변수의 SourceVersion은 설정되어 있지 않으므로 기본값인 Current 행 값을 사용합니다.

참고:

DataAdapter의 Fill 작업과 DataReader의 Get 메서드 모두에서 .NET Framework 형식은 .NET Framework 데이터 공급자로부터 반환된 형식에서 유추됩니다. 유추된 .NET Framework 형식과 Microsoft SQL Server, OLE DB 및 ODBC 데이터 형식의 접근자 메서드는 ADO.NET의 데이터 형식 매핑에 설명되어 있습니다.

Parameter.SourceColumn, Parameter.SourceVersion

SourceColumn 및 SourceVersion은 Parameter 생성자에 인수로 전달되거나 기존 Parameter의 속성으로 설정될 수 있습니다. SourceColumn은 Parameter 값이 검색될 DataRowDataColumn 이름입니다. SourceVersion에서는 DataAdapter가 값을 검색하기 위해 사용하는 DataRow 버전을 지정합니다.

다음 표에서는 SourceVersion에 사용할 수 있는 DataRowVersion 열거형 값을 보여 줍니다.

DataRowVersion 열거형

설명

Current

열의 현재 값을 사용하는 매개 변수입니다. 기본값입니다.

Default

열의 DefaultValue를 사용하는 매개 변수입니다.

Original

열의 원래 값을 사용하는 매개 변수입니다.

Proposed

제안된 값을 사용하는 매개 변수입니다.

다음 단원의 SqlClient 코드 예제에서는 CustomerID 열이 두 매개 변수 @CustomerID(SET CustomerID = @CustomerID)@OldCustomerID (WHERE CustomerID = @OldCustomerID)에 대한 SourceColumn으로 사용되는 UpdateCommand의 매개 변수를 정의합니다. @CustomerID 매개 변수는 CustomerID 열을 DataRow의 현재 값으로 업데이트하는 데 사용됩니다. 결과적으로 SourceVersion이 Current인 CustomerIDSourceColumn이 사용됩니다. @OldCustomerID 매개 변수는 데이터 소스에서 현재 행을 식별하는 데 사용됩니다. 행의 Original 버전에 일치하는 열 값이 있으므로 SourceVersion이 Original인 동일한 SourceColumn(CustomerID)이 사용됩니다.

SqlClient 매개 변수 사용

다음 예제에서는 데이터베이스에서 추가적인 스키마 정보를 검색하기 위해 SqlDataAdapter를 만들고 MissingSchemaActionAddWithKey로 설정하는 방법을 보여 줍니다. SelectCommand, InsertCommand, UpdateCommandDeleteCommand 속성이 설정되고 해당 SqlParameter 개체가 Parameters 컬렉션에 추가됩니다. 메서드에서 SqlDataAdapter 개체를 반환합니다.

Public Function CreateSqlDataAdapter( _
    ByVal connection As SqlConnection) As SqlDataAdapter

    Dim adapter As SqlDataAdapter = New SqlDataAdapter
    adapter.MissingSchemaAction = MissingSchemaAction.AddWithKey

    ' Create the commands.
    adapter.SelectCommand = New SqlCommand( _
        "SELECT CustomerID, CompanyName FROM CUSTOMERS", connection)
    adapter.InsertCommand = New SqlCommand( _
        "INSERT INTO Customers (CustomerID, CompanyName) " & _
         "VALUES (@CustomerID, @CompanyName)", connection)
    adapter.UpdateCommand = New SqlCommand( _
        "UPDATE Customers SET CustomerID = @CustomerID, CompanyName = " & _
        "@CompanyName WHERE CustomerID = @oldCustomerID", connection)
    adapter.DeleteCommand = New SqlCommand( _
        "DELETE FROM Customers WHERE CustomerID = @CustomerID", connection)

    ' Create the parameters.
    adapter.InsertCommand.Parameters.Add("@CustomerID", _
        SqlDbType.Char, 5, "CustomerID")
    adapter.InsertCommand.Parameters.Add("@CompanyName", _
        SqlDbType.VarChar, 40, "CompanyName")

    adapter.UpdateCommand.Parameters.Add("@CustomerID", _
        SqlDbType.Char, 5, "CustomerID")
    adapter.UpdateCommand.Parameters.Add("@CompanyName", _
        SqlDbType.VarChar, 40, "CompanyName")
    adapter.UpdateCommand.Parameters.Add("@oldCustomerID", _
        SqlDbType.Char, 5, "CustomerID").SourceVersion = _
        DataRowVersion.Original

    adapter.DeleteCommand.Parameters.Add("@CustomerID", _
        SqlDbType.Char, 5, "CustomerID").SourceVersion = _
        DataRowVersion.Original

    Return adapter
End Function
public static SqlDataAdapter CreateSqlDataAdapter(SqlConnection connection)
{
    SqlDataAdapter adapter = new SqlDataAdapter();
    adapter.MissingSchemaAction = MissingSchemaAction.AddWithKey;

    // Create the commands.
    adapter.SelectCommand = new SqlCommand(
        "SELECT CustomerID, CompanyName FROM CUSTOMERS", connection);
    adapter.InsertCommand = new SqlCommand(
        "INSERT INTO Customers (CustomerID, CompanyName) " +
        "VALUES (@CustomerID, @CompanyName)", connection);
    adapter.UpdateCommand = new SqlCommand(
        "UPDATE Customers SET CustomerID = @CustomerID, CompanyName = @CompanyName " +
        "WHERE CustomerID = @oldCustomerID", connection);
    adapter.DeleteCommand = new SqlCommand(
        "DELETE FROM Customers WHERE CustomerID = @CustomerID", connection);

    // Create the parameters.
    adapter.InsertCommand.Parameters.Add("@CustomerID", 
        SqlDbType.Char, 5, "CustomerID");
    adapter.InsertCommand.Parameters.Add("@CompanyName", 
        SqlDbType.VarChar, 40, "CompanyName");

    adapter.UpdateCommand.Parameters.Add("@CustomerID", 
        SqlDbType.Char, 5, "CustomerID");
    adapter.UpdateCommand.Parameters.Add("@CompanyName", 
        SqlDbType.VarChar, 40, "CompanyName");
    adapter.UpdateCommand.Parameters.Add("@oldCustomerID", 
        SqlDbType.Char, 5, "CustomerID").SourceVersion = 
        DataRowVersion.Original;

    adapter.DeleteCommand.Parameters.Add("@CustomerID", 
        SqlDbType.Char, 5, "CustomerID").SourceVersion = 
        DataRowVersion.Original;

    return adapter;
}

OleDb 매개 변수 자리 표시자

OleDbDataAdapterOdbcDataAdapter 개체의 경우 물음표(?) 자리 표시자를 사용하여 매개 변수를 식별해야 합니다.

Dim selectSQL As String = _
  "SELECT CustomerID, CompanyName FROM Customers " & _
  "WHERE CountryRegion = ? 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 = ?"
string selectSQL = 
  "SELECT CustomerID, CompanyName FROM Customers " +
  "WHERE CountryRegion = ? 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을 채웁니다.

OleDb 예제

' Assumes that connection is a valid OleDbConnection object.
Dim adapter As OleDbDataAdapter = New OleDbDataAdapter 

Dim selectCMD AS OleDbCommand = New OleDbCommand(selectSQL, connection)
adapter.SelectCommand = selectCMD

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

Dim customers As DataSet = New DataSet
adapter.Fill(customers, "Customers")
// Assumes that connection is a valid OleDbConnection object.
OleDbDataAdapter adapter = new OleDbDataAdapter();

OleDbCommand selectCMD = new OleDbCommand(selectSQL, connection);
adapter.SelectCommand = selectCMD;

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

DataSet customers = new DataSet();
adapter.Fill(customers, "Customers");

Odbc 매개 변수

' Assumes that connection is a valid OdbcConnection object.
Dim adapter As OdbcDataAdapter = New OdbcDataAdapter

Dim selectCMD AS OdbcCommand = New OdbcCommand(selectSQL, connection)
adapter.SelectCommand = selectCMD

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

Dim customers As DataSet = New DataSet
adapter.Fill(customers, "Customers")
// Assumes that connection is a valid OdbcConnection object.
OdbcDataAdapter adapter = new OdbcDataAdapter();

OdbcCommand selectCMD = new OdbcCommand(selectSQL, connection);
adapter.SelectCommand = selectCMD;

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

DataSet customers = new DataSet();
adapter.Fill(customers, "Customers");
참고:

매개 변수에 이름을 지정하지 않으면 "Parameter1"로 시작하는 증분 기본 이름인 ParameterN이 매개 변수에 지정됩니다. 매개 변수 이름을 입력하는 경우에는 ParameterN 명명 규칙을 사용하지 않는 것이 좋습니다. 이 경우 ParameterCollection에 있는 기존의 기본 매개 변수 이름과 충돌이 발생할 수 있습니다. 이미 있는 이름을 입력하면 예외가 throw됩니다.

참고 항목

개념

DataAdapters를 사용하여 데이터 소스 업데이트(ADO.NET)

저장 프로시저로 데이터 수정(ADO.NET)

기타 리소스

DataAdapters 및 DataReaders(ADO.NET)

명령 및 매개 변수(ADO.NET)

ADO.NET의 데이터 형식 매핑