Share via


데이터 어댑터 명령의 매개 변수

업데이트: 2007년 11월

SelectCommand,InsertCommand, UpdateCommand 및DeleteCommand 개체의 CommandText 속성에 정의되어 있는 데이터 어댑터의 명령에 매개 변수가 자주 사용됩니다. 런타임에 매개 변수를 사용하여 명령에 의해 표시되는 SQL 문이나 저장 프로시저로 값을 전달합니다.

참고:

이전 버전의 Visual Studio에서는 응용 프로그램과 데이터베이스 간의 통신에 데이터 어댑터를 사용했습니다. 이전과 마찬가지로 데이터 어댑터는 .NET Framework 데이터 공급자(ADO.NET)의 주 구성 요소이지만 TableAdapter는 응용 프로그램과 데이터베이스 간의 데이터 이동 프로세스를 간단하게 만들기 위해 디자이너에서 생성한 구성 요소입니다. TableAdapter 작업에 대한 자세한 내용은 TableAdapter 개요를 참조하십시오.

매개 변수는 다음과 같은 두 가지 경우에 사용됩니다.

  • 선택 매개 변수 – 종종 프로덕션 응용 프로그램에서 데이터베이스에 있는 데이터의 일부만 페치해야 하는 경우가 있습니다. 이렇게 하려면 런타임에 얻는 선택 조건에 대한 매개 변수가 있는 WHERE 절이 포함된 SQL 문이나 저장 프로시저를 사용합니다. 또한 레코드를 업데이트하거나 삭제할 때에도 WHERE 절을 사용하여 레코드 또는 변경할 레코드의 정확한 위치를 지정할 수 있습니다. WHERE 절에서 사용되는 값은 대개 런타임에 파생됩니다.

  • 업데이트 매개 변수 – 기존 레코드를 업데이트하거나 새 레코드를 삽입할 때 변경된 레코드나 새 레코드의 열 값은 런타임에 설정됩니다. 또한 낙관적 동시성을 검사하는 동안 사용되는 값은 매개 변수를 사용하여 설정됩니다.

    참고:

    Oracle의 경우, SQL 문이나 저장 프로시저에서 명명된 매개 변수를 사용할 때는 매개 변수 이름 앞에 콜론(:)을 붙여야 합니다. 그러나 예를 들어, 코드에서 Add를 호출할 때처럼 명명된 매개 변수를 참조할 때는 명명된 매개 변수 앞에 콜론(:)을 붙이지 마십시오. 데이터 공급자에서 콜론을 자동으로 제공합니다. 자세한 내용은 OracleParameter 클래스를 참조하십시오.

선택 매개 변수

데이터 집합을 채울 레코드를 선택할 때 종종 WHERE 절에 하나 이상의 매개 변수를 포함시켜서 런타임에 어떤 레코드를 페치할 것인지 지정할 수 있습니다. 예를 들어, 사용자가 웹 페이지에 특정 제목의 키워드를 입력하여 서적 데이터베이스를 검색할 수 있습니다. 이 매개 변수를 사용하기 위해 다음과 같이 SelectCommand의 CommandText 속성으로 SQL 문을 지정해야 할 수 있습니다. 매개 변수는 자리 표시자(물음표)나 명명된 매개 변수의 변수를 사용하여 나타냅니다. OleDbCommandOdbcCommand 개체가 포함된 쿼리의 매개 변수에는 물음표를 사용합니다. SqlCommand 개체를 사용하는 쿼리에서는 @ 기호로 시작하는 명명된 매개 변수를 사용합니다. 반면 OracleCommand 개체를 사용하는 쿼리에서는 콜론(:)으로 시작되는 명명된 매개 변수를 사용합니다.

자리 표시자를 사용하는 쿼리는 다음과 같습니다.

SELECT BookId, Title, Author, Price from BOOKS
WHERE (Title LIKE ?)

명명된 매개 변수 SqlCommand를 사용하는 쿼리는 다음과 같습니다.

SELECT BookId, Title, Author, Price from BOOKS
WHERE (Title LIKE @title)

명명된 매개 변수 OracleCommand를 사용하는 쿼리는 다음과 같습니다.

SELECT BookId, Title, Author, Price from BOOKS
WHERE (Title LIKE :title)

응용 프로그램에서 사용자에게 제목 키워드를 입력하라는 메시지가 나타납니다. 그런 다음 매개 변수 값을 설정하고 명령을 실행합니다.

참고:

조회 테이블을 설정하는 경우와 같이 데이터베이스 테이블의 전체 내용을 가져와야 할 때도 있지만 대개는 응용 프로그램의 효율성을 유지하기 위해 필요한 데이터만 페치합니다.

Visual Studio에서 쿼리 작성기를 사용하여 매개 변수가 있는 SQL 문을 빌드할 수 있습니다. 서버 탐색기의 요소를 끌어 오는 경우 Visual Studio에서 매개 변수를 구성할 수도 있습니다. 그렇지 않은 경우에는 사용자가 직접 구성을 완료해야 합니다.

업데이트 매개 변수

어댑터의 SelectCommand 개체가 매개 변수가 있는 명령을 포함하고 있는지 여부에 관계없이 UpdateCommand, InsertCommand 및 DeleteCommand 속성의 명령은 항상 매개 변수화되어 있습니다.

UpdateCommand 및 InsertCommand 속성의 명령은 업데이트할 데이터베이스의 모든 열에 대해 매개 변수가 있어야 합니다. 또한 UpdateCommand 및 DeleteCommand 문에는 일반적으로 SelectCommand 개체를 구성하는 방식과 비슷하게 업데이트할 레코드를 확인하는 매개 변수가 있는 WHERE 절이 있어야 합니다.

예를 들어, 서적을 구입할 수 있는 응용 프로그램이 있습니다. 서점에는 서적을 구입할 수 있도록 데이터 테이블로 구현된 장바구니가 있습니다. ShoppingCart 테이블에서 사용자는 구입할 각 서적의 레코드를 유지하며 여기서 서적 ID와 고객 ID가 쇼핑 수레 레코드에 대한 키 역할을 합니다.

사용자가 서적을 쇼핑 수레에 추가하면 응용 프로그램에서 SQL INSERT 문을 호출합니다. 어댑터에서 이 문의 구문은 다음과 같습니다.

INSERT INTO ShoppingCart
   (BookId, CustId, Quantity)
Values (?, ?, ?)

세 개의 물음표는 런타임에 고객 ID와 서적 ID 및 수량의 값으로 채워질 매개 변수의 자리 표시자를 나타냅니다. 명명된 매개 변수를 사용하는 경우에 위의 쿼리는 다음과 같습니다.

INSERT INTO ShoppingCart
   (BookId, CustId, Quantity)
Values (@bookid, @custid, @quantity)

사용자가 쇼핑 수레의 항목을 변경하면(예:수량 변경) 응용 프로그램에서 SQL UPDATE 문을 호출합니다. 이 문의 구문은 다음과 같습니다.

UPDATE ShoppingCart
   SET (BookId = ?, CustId = ?, Quantity = ?)
WHERE (BookId = ? AND CustId = ?)

명명된 매개 변수를 사용하는 경우에는 다음과 같습니다.

UPDATE ShoppingCart
   SET (BookId = @bookid, CustId = @custid, Quantity = @quantity)
WHERE (BookId = @bookid AND CustId = @custid)

이 문에서 SET 절의 매개 변수는 변경된 레코드의 업데이트된 값으로 채워집니다. WHERE 절의 매개 변수는 업데이트할 레코드를 확인하고 레코드의 원래 값으로 채워집니다.

사용자가 쇼핑 수레에서 항목을 제거할 수도 있습니다. 이 경우 매개 변수 자리 표시자를 사용하여 응용 프로그램에서 다음과 같은 구문이 있는 SQL DELETE 문을 호출합니다.

DELETE FROM ShoppingCart
WHERE (BookId = ? AND CustId = ?)

명명된 매개 변수를 사용하는 경우에는 다음과 같은 SQL DELETE 문을 호출합니다.

DELETE FROM ShoppingCart
WHERE (BookId = @bookid AND CustId = @custid)

매개 변수 컬렉션 및 매개 변수 개체

런타임에 매개 변수 값을 전달할 수 있도록 데이터 어댑터에 대한 네 개의 명령 개체는 Parameters 속성을 지원합니다. 이 속성에는 문의 자리 표시자와 일대일로 대응되는 개별 매개 변수 개체의 컬렉션이 포함되어 있습니다.

다음 표에서는 각 데이터 어댑터에 대한 해당 매개 변수 컬렉션을 보여 줍니다.

데이터 어댑터

매개 변수 컬렉션

SqlDataAdapter

SqlParameterCollection

OleDbDataAdapter

OleDbParameterCollection

OdbcDataAdapter

OdbcParameterCollection

OracleDataAdapter

OracleParameterCollection

참고:

Oracle의 경우, SQL 문이나 저장 프로시저에서 명명된 매개 변수를 사용할 때는 매개 변수 이름 앞에 콜론(:)을 붙여야 합니다. 그러나 예를 들어, 코드에서 Add를 호출할 때처럼 명명된 매개 변수를 참조할 때는 명명된 매개 변수 앞에 콜론(:)을 붙이지 마십시오. .NET Framework Data Provider for Oracle에서 콜론을 자동으로 제공합니다.

매개 변수 컬렉션을 사용하면 SQL 명령을 런타임 값을 갖는 문자열로 직접 작성하지 않아도 되며 매개 변수에서 형식을 검사할 수 있습니다.

데이터 어댑터 구성 마법사를 사용하여 어댑터를 구성하면 네 개의 명령 모두에 대해 매개 변수 컬렉션이 자동으로 설정되고 구성됩니다. 서버 탐색기에서 폼이나 구성 요소로 요소를 끌어 오면 Visual Studio에서 다음과 같이 구성할 수 있습니다.

  • 테이블이나 일부 열을 디자이너로 끌어 오면 Visual Studio에서는 매개 변수가 없는 SelectCommand 개체(특히 SQL SELECT 문)와 매개 변수가 있는 UpdateCommand, InsertCommand 및 DeleteCommand 개체가 생성됩니다. SelectCommand 개체 문에 매개 변수가 있도록 하려면 사용자가 직접 이를 구성해야 합니다.

  • 저장 프로시저를 디자이너로 끌어 오면 Visual Studio에서는 저장 프로시저의 요청에 따라 매개 변수를 갖는 SelectCommand 개체가 생성됩니다. 그러나 필요한 경우 UpdateCommand, InsertCommand 및 DeleteCommand 개체를 해당 매개 변수와 함께 직접 구성해야 합니다.

일반적으로 어댑터에 대해 매개 변수가 있는 쿼리를 만들려면 데이터 어댑터 구성 마법사를 사용해야 합니다. 그러나 필요한 경우 속성 창을 사용하여 매개 변수를 직접 구성할 수 있습니다.

매개 변수 컬렉션의 구조

명령의 매개 변수 컬렉션에 있는 항목은 해당하는 명령 개체에 필요한 매개 변수와 일대일로 대응합니다. 명령 개체가 SQL 문인 경우 컬렉션의 항목은 문의 자리 표시자(물음표)에 대응합니다. 다음 UPDATE 문에는 매개 변수 항목 다섯 개의 컬렉션이 있어야 합니다.

UPDATE ShoppingCart
   SET (BookId = ?, CustId = ?, Quantity = ?)
WHERE (BookId = ? AND CustId = ?)

명명된 매개 변수를 사용하는 경우에 위의 문은 다음과 같습니다.

UPDATE ShoppingCart
   SET (BookId = @bookid, CustId = @custid, Quantity = @quantity)
WHERE (BookId = @bookid AND CustId = @custid)

명령 개체가 저장 프로시저를 참조하는 경우 컬렉션에 있는 매개 변수 항목의 수는 프로시저 자체에 의해 결정됩니다. 매개 변수는 SQL 문의 자리 표시자와 정확하게 대응하지 않을 수 있습니다.

저장 프로시저에서는 명명된 매개 변수를 사용할 수도 있습니다. 이 경우 컬렉션에서 매개 변수의 위치는 중요하지 않습니다. 대신 컬렉션의 각 매개 변수 항목에 있는 ParameterName 속성을 사용하여 저장 프로시저의 대응하는 매개 변수와 일치시킵니다.

매개 변수 컬렉션을 직접 구성하는 경우 저장 프로시저에 필요한 매개 변수에 대해 정확히 알아야 합니다. 여러 저장 프로시저는 값을 반환합니다. 이 경우 값이 매개 변수 컬렉션의 응용 프로그램으로 다시 전달되므로 값을 반환받을 수 있도록 해야 합니다. 또한 일부 저장 프로시저에는 여러 SQL 문이 포함되므로 매개 변수 컬렉션이 프로시저의 모든 문으로 전달된 모든 값을 반영하도록 해야 합니다.

저장 프로시저의 경우와 같이 매개 변수가 명명되지 않으면 컬렉션의 항목은 위치에 기반하여 명령에 필요한 매개 변수에 매핑됩니다. 명령이 저장 프로시저이고 값을 반환하는 경우 컬렉션의 첫 항목(항목 0)이 이 반환 값으로 예약됩니다.

따라서 컬렉션의 인덱스 위치로 개별 매개 변수 개체를 참조할 수 있습니다. 그러나 매개 변수 개체는 순서에 관계없이 매개 변수를 참조할 수 있는 ParameterName 속성도 지원합니다. 예를 들어, 컬렉션의 둘째 매개 변수 이름이 Title_Keyword로 지정된 경우 다음 두 개의 문은 동일합니다.

' Encloses the keyword in SQL wildcard characters.
titleKeyword = "%" & txtTitleKeyword.Text & "%"
OleDbDataAdapter1.SelectCommand.Parameters(1).Value = titleKeyword
OleDbDataAdapter1.SelectCommand.Parameters("Title_Keyword").Value = titleKeyword
// Encloses the keyword in SQL wildcard characters.
string titleKeyword = "%" + txtTitleKeyword.Text + "%";
this.OleDbDataAdapter1.SelectCommand.Parameters[1].Value = titleKeyword;
this.OleDbDataAdapter1.SelectCommand.Parameters["Title_Keyword"].Value = titleKeyword;

매개 변수의 개수가 변경되는 경우 관리의 필요성이 줄어들고 저장 프로시저가 값을 반환하는지 여부를 기억할 필요가 없기 때문에 일반적으로 매개 변수 이름을 사용하는 것이 인덱스 값으로 매개 변수를 참조하는 것보다 훨씬 좋은 프로그래밍 방식입니다. 인덱스 값 대신 이름으로 매개 변수를 참조하면 오버헤드는 약간 늘어나지만 프로그래밍과 응용 프로그램을 쉽게 관리할 수 있습니다.

매개 변수 값 설정

매개 변수의 값은 다음 두 가지 방법으로 설정됩니다.

  • 매개 변수의 Value 속성을 명시적으로 설정합니다.

  • 필요한 경우 데이터 행에서 값을 추출할 수 있도록 데이터 집합 테이블의 열에 매개 변수를 매핑합니다.

데이터 집합을 채우거나 명령을 호출할 때, 즉 선택 매개 변수의 경우에 매개 변수 값을 명시적으로 설정합니다. 예를 들어, 서적을 검색하는 위의 예제에서 응용 프로그램에 사용자가 제목 키워드를 입력하는 텍스트 상자가 있을 수 있습니다. 그러면 어댑터의 Fill 메서드를 호출하기 전에 명시적으로 매개 변수의 값을 텍스트 상자의 텍스트로 설정합니다. 이 작업을 수행하는 코드는 다음과 같습니다. 이 코드는 데이터 집합을 채우기 전에 텍스트 상자의 내용을 매개 변수로 설정합니다.

' Encloses the keyword in SQL wildcard characters.
titleKeyword = "%" & txtTitleKeyword.Text & "%"
OleDbDataAdapter1.SelectCommand.Parameters("Title_Keyword").Value = titleKeyword
OleDbDataAdapter1.Fill(dsAuthors1)
// Encloses the keyword in SQL wildcard characters.
titleKeyword = "%" + txtTitleKeyword.Text + "%";
this.OleDbDataAdapter1.SelectCommand.Parameters["Title_Keyword"].Value = titleKeyword;
this.OleDbDataAdapter1.Fill(dsAuthors1);

매핑된 매개 변수의 값은 업데이트하는 동안 사용됩니다. 어댑터의 Update 메서드를 호출하면 이 메서드는 데이터 집합 테이블의 레코드를 검색하여 각 레코드에 대해 개별적으로 업데이트(업데이트, 삽입 및 삭제)를 수행합니다. 이 경우 매개 변수의 값은 이미 데이터 집합 레코드의 열로 사용할 수 있습니다. 예를 들어, 업데이트 과정이 데이터 집합 테이블의 새 레코드, 즉 데이터베이스에서 INSERT 문을 호출해야 하는 레코드에 이르면 INSERT 문의 VALUE 절에 대한 값을 레코드에서 직접 읽을 수 있습니다.

이러한 경우는 일반적인 시나리오 중 하나입니다. 저장 프로시저는 매개 변수를 사용하거나 프로시저의 반환 값을 통해 데이터를 반환합니다. 이 경우 반환된 값은 데이터 집합 테이블의 열에 매핑됩니다.

업데이트 매개 변수를 명시적으로 설정할 수도 있습니다. 어댑터는 행이 업데이트될 때마다 호출되는 RowUpdating 이벤트를 지원합니다. 이 이벤트 처리기를 만들어 매개 변수의 값을 설정할 수 있습니다. 이렇게 하면 매개 변수 값을 세밀하게 제어할 수 있고 매개 변수의 값이 데이터베이스 레코드에 쓰여지기 전에 동적으로 만드는 등의 프로세스를 수행할 수 있습니다.

참고 항목

개념

DataAdapter에서 DataSet 채우기(ADO.NET)

데이터의 새로운 기능

Visual Studio를 사용하여 데이터 응용 프로그램 만들기

기타 리소스

DataAdapters(ADO.NET)

데이터 어댑터 만들기

데이터 연습

ADO.NET