데이터 어댑터 소개
업데이트: 2007년 11월
데이터 어댑터는 ADO.NET에서 관리되는 공급자의 핵심 부분이며 데이터 소스와 데이터 집합 사이의 통신에 사용되는 개체 집합입니다. 관리되는 공급자에는 어댑터 외에도 연결 개체, 데이터 읽기 개체, 명령 개체 등이 포함됩니다. 어댑터는 데이터 소스와 데이터 집합 간에 데이터를 교환하는 데 사용됩니다. 여러 응용 프로그램에서 데이터를 교환한다는 것은 데이터베이스에서 데이터 집합으로 데이터를 읽은 다음 변경된 데이터를 데이터 집합에서 다시 데이터베이스에 쓰는 것을 의미합니다. 그러나 데이터 어댑터는 모든 데이터 소스와 데이터 집합 간에도 데이터를 이동시킬 수 있습니다. 예를 들어, 어댑터는 Microsoft Exchange 서버와 데이터 집합 간에 데이터를 이동시킬 수 있습니다.
참고: |
---|
이전 버전의 Visual Studio에서는 응용 프로그램과 데이터베이스 간의 통신에 데이터 어댑터를 사용했습니다. 이전과 마찬가지로 데이터 어댑터는 .NET Framework 데이터 공급자(ADO.NET)의 주 구성 요소이지만 TableAdapter는 응용 프로그램과 데이터베이스 간의 데이터 이동 프로세스를 간단하게 만들기 위해 디자이너에서 생성한 구성 요소입니다. TableAdapter 작업에 대한 자세한 내용은 TableAdapter 개요를 참조하십시오. |
일반적으로 데이터 집합에서 또는 데이터 집합으로 이동시킬 데이터를 사용자가 지정하도록 어댑터를 구성할 수 있습니다. 이러한 경우 종종 데이터베이스를 읽거나 데이터베이스에 쓸 때 호출되는 SQL 문이나 저장 프로시저에 대한 참조의 형태를 갖습니다.
Visual Studio에서는 데이터베이스와 함께 사용하도록 다음과 같은 데이터 어댑터를 제공합니다.
OleDbDataAdapter 개체는 OLE DB 공급자에 의해 노출되는 모든 데이터 소스와 함께 사용할 수 있습니다.
SqlDataAdapter 개체는 SQL Server와 관련되어 있습니다. 이 개체는 OLE DB 계층을 통과할 필요가 없기 때문에 OleDbDataAdapter 클래스보다 처리 속도가 빠릅니다. 그러나 이 개체는 SQL Server 7.0 이상에서만 사용할 수 있습니다.
OdbcDataAdapter 개체는 ODBC 데이터 소스 액세스에 최적화되어 있습니다.
OracleDataAdapter 개체는 Oracle 데이터베이스 액세스에 최적화되어 있습니다.
참고: 데이터 어댑터, 데이터 연결, 데이터 명령 및 데이터 읽기는 .NET Framework 데이터 공급자를 구성하는 구성 요소입니다. Microsoft 및 타사 공급자를 통해 다른 .NET Framework 데이터 공급자를 Visual Studio로 통합하여 사용할 수 있습니다. 다른 .NET Framework 데이터 공급자에 대한 자세한 내용은 .NET Framework 데이터 공급자(ADO.NET)를 참조하십시오.
.NET Framework 관리 공급자 네임스페이스의 다음 부분을 사용하여 어댑터를 만들고 조작할 수 있습니다.
SqlClient 관리 공급자 네임스페이스
OleDb 관리 공급자 네임스페이스
일반적으로 각 데이터 어댑터는 데이터 집합의 단일 데이터 소스 테이블과 단일 DataTable 개체 사이에서 데이터를 교환합니다. 일반적으로 데이터 집합에 여러 데이터 테이블이 있으면 여러 데이터 어댑터에 데이터를 공급하고 다시 개별 데이터 소스 테이블에 데이터를 씁니다.
데이터 집합의 테이블을 채우려면 SQL 문이나 저장 프로시저를 실행하는 어댑터 메서드를 호출합니다. 어댑터는 데이터 읽기 개체(SqlDataReader, OleDbDataReader, OdbcDataReader 또는 OracleDataReader)를 만들어서 데이터 집합으로 데이터를 읽어들입니다.
참고: |
---|
데이터를 데이터 집합에 저장하지 않고도 데이터베이스에서 읽을 수 있습니다. 이 방법은 읽기 전용 데이터를 사용하는 경우에 매우 효과적입니다. 자세한 내용은 아래의 "읽기 전용 데이터"를 참조하십시오. 또한 데이터 집합을 채우기 위해 SQL 문을 사용하지 않고도 SQL 문을 직접 실행할 수 있습니다. 자세한 내용은 명령(ADO.NET)를 참조하십시오. |
마찬가지로 데이터베이스를 업데이트하는 경우에도 해당 SQL 문이나 저장 프로시저를 사용하는 어댑터 메서드를 호출하여 데이터베이스에서 실제 업데이트를 수행합니다.
데이터 어댑터 및 관련 테이블
데이터 집합에 별도의 테이블이 있도록 구현하려면 일반적으로 데이터 어댑터에서 테이블을 조인하는 SQL 명령이나 저장 프로시저를 참조하지 않습니다. 대신 다른 어댑터에서 관련 테이블의 정보를 개별적으로 데이터 집합으로 읽어들입니다. 그런 다음 DataRelation 개체를 사용하여 데이터 집합 테이블 간의 제약 조건(계단식 업데이트 등)을 관리하고 관련 마스터와 자식 레코드 사이를 탐색합니다.
예를 들어, Northwind 데이터베이스에 있는 Customers와 Orders라는 두 개의 관련 테이블을 사용한다고 가정합니다. 조인을 지정하여 단일 결과 집합으로 두 테이블을 결합하는 대신 가장 일반적인 방법으로 한 어댑터는 데이터 집합의 Customers 테이블을 채우고 다른 어댑터는 Order 레코드를 다른 데이터 집합 테이블로 읽어들이는 두 개의 어댑터를 정의할 수 있습니다. 보통 개별 어댑터에는 데이터 테이블에서 레코드의 수를 제한하는 선택 조건이 포함되어 있습니다.
또한 데이터 집합에서 CustomerID 필드로 Order 레코드가 Customer 레코드와 관련되어 있음을 지정하는 DataRelation 개체를 정의할 수 있습니다. 테이블을 여전히 개별적으로 관리할 수 있지만 데이터 소스에서 레코드를 페치하기 전에 테이블을 조인한 경우에는 그렇게 할 수 없습니다. 이 경우 관련 레코드를 사용하려면 DataRelation 개체의 속성과 메서드를 호출합니다.
데이터 관계에 대한 자세한 내용은 데이터 집합에서의 관계를 참조하십시오.
연결 개체
데이터 어댑터에서 데이터를 읽고 쓰려면 데이터 소스에 대한 열린 연결이 필요합니다. 따라서 어댑터에서는 연결 개체(SqlConnection, OleDbConnection, OdbcConnection 또는 OracleConnection)를 사용하여 데이터 소스와 통신합니다. 어댑터에는 수행할 각 작업 유형, 즉 선택, 업데이트, 삽입 및 삭제에 대해 하나씩 네 개까지의 연결 참조가 포함될 수 있습니다.
다음 표는 도구 상자의 데이터 탭에 있는 연결 개체의 목록입니다.
연결 개체 |
설명 |
---|---|
SQL Server 7.0 이상의 데이터베이스에 대한 연결입니다. |
|
모든 OLE DB 데이터 소스에 대한 연결입니다. |
|
ODBC 데이터 소스에 대한 연결입니다. |
|
Oracle 데이터베이스에 대한 연결입니다. |
위의 모든 경우에서 연결 개체는 데이터 소스 내의 고유한 세션을 나타냅니다. 모든 연결 개체에서는 사용자 ID, 암호 및 연결 시간 초과 설정 등의 연결 세부 사항을 구성하고 수정할 수 있는 속성을 제공합니다. 또한 데이터베이스 트랜잭션을 시작, 커밋 및 롤백할 수 있는 메서드를 제공합니다. 연결 개체에 대한 자세한 내용은 데이터 소스에 연결(ADO.NET)을 참조하십시오.
보안 정보: |
---|
서버 이름, 사용자 이름, 암호 등과 같은 연결 문자열의 세부 사항을 저장하면 응용 프로그램 보안에 영향을 줄 수 있습니다. 데이터베이스 액세스를 제어할 경우에는 통합 보안이라고도 하는 Windows 자동화를 사용하는 방법이 더 안전합니다. |
ADO.NET 명령 개체
어댑터를 사용하여 데이터 소스에 있는 레코드의 읽기, 추가, 업데이트 및 삭제 작업을 수행할 수 있습니다. 이러한 각 작업이 발생하는 방식을 지정하려면 어댑터에서 다음과 같은 네 가지 속성을 지원해야 합니다.
SelectCommand – 데이터 저장소에서 행을 검색하는 명령에 대한 참조(SQL 문이나 저장 프로시저 이름)
InsertCommand – 데이터 저장소에 행을 삽입하는 명령에 대한 참조
UpdateCommand – 데이터 저장소의 행을 수정하는 명령에 대한 참조
DeleteCommand – 데이터 저장소의 행을 삭제하는 명령에 대한 참조
속성 자체도 개체입니다. 속성은 SqlCommand, OleDbCommand, OdbcCommand 또는 OracleCommand 클래스의 인스턴스입니다. 이 개체는 SQL 문이나 저장 프로시저에 대한 참조를 포함하는 CommandText 속성을 지원합니다.
참고: |
---|
명령 클래스는 연결 클래스와 일치해야 합니다. 예를 들어, SqlConnection 개체를 사용하여 SQL Server와 통신하는 경우 SqlCommand 클래스에서 파생된 명령을 사용해야 합니다. |
명령 개체의 텍스트를 명시적으로 설정할 수는 있지만 반드시 그럴 필요는 없습니다. 왜냐하면 대부분의 경우에 Visual Studio에서 필요한 SQL 문을 생성하기 때문입니다. 또한 UpdateCommand, InsertCommand 또는 DeleteCommand 개체가 지정되지 않으면 어댑터에서 런타임에 해당 SQL 문을 자동으로 생성할 수 있습니다. 자세한 내용은 CommandBuilders를 사용하여 명령 생성(ADO.NET)을 참조하십시오.
그러나 디자인 타임과 런타임에 명령 개체를 조작하여 명령이 실행되는 방식을 직접 제어할 수 있습니다. 예를 들어, SelectCommand 개체와 관련된 명령을 실행하기 바로 전에 만들거나 수정할 수 있습니다.
또한 데이터 어댑터에 관계없이 명령을 직접 실행할 수도 있습니다. 이렇게 하면 데이터 어댑터를 통해 데이터베이스의 정의, 수정 등에 사용되는 임의의 SQL 명령을 전달할 수 있습니다. 또한 레코드 집합을 반환하지 않는 저장 프로시저(예: 데이터베이스와 비교하여 사용자 입력의 유효성을 검사하는 저장 프로시저)를 직접 호출할 수도 있습니다. 자세한 내용은 명령 실행(ADO.NET)을 참조하십시오.
보안 정보: |
---|
CommandType 속성을 Text로 설정한 상태에서 데이터 명령을 사용하는 경우, 클라이언트에서 전송된 정보를 데이터베이스에 전달하기 전에 이 정보를 자세히 검사해야 합니다. 악의적인 사용자가 데이터베이스에 무단으로 액세스하거나 데이터베이스를 훼손하기 위해 수정된 SQL 문이나 추가적인 SQL 문을 전송(주입)할 수도 있습니다. 사용자 입력을 데이터베이스에 전송하기 전에 항상 정보의 유효성을 검사해야 합니다. 가능하면 항상 매개 변수가 있는 쿼리나 저장 프로시저를 사용하는 것이 좋습니다. 자세한 내용은 스크립트 악용 개요를 참조하십시오. |
명령 매개 변수
일반적으로 데이터 어댑터의 명령은 매개 변수를 통해 실행됩니다. 예를 들어, SelectCommand 속성에 대한 명령에는 종종 WHERE 절에 매개 변수가 있어서 런타임에 데이터베이스에서 가져올 데이터를 지정할 수 있습니다. 다른 명령은 레코드에 쓸 데이터와 데이터베이스에서 업데이트할 레코드를 런타임에 전달할 수 있는 매개 변수를 사용합니다. 데이터 어댑터에서 매개 변수를 사용하는 방법에 대한 자세한 내용은 데이터 어댑터 명령의 매개 변수를 참조하십시오.
데이터 어댑터를 사용한 읽기 및 업데이트
데이터 어댑터의 주된 목적은 데이터 저장소와 데이터 집합 간의 데이터 통신입니다. 이 어댑터는 데이터 저장소와 데이터 집합 간에 데이터를 이동하기 위해 특정한 메서드를 지원합니다.
참고: |
---|
데이터를 업데이트하지 않고 읽기만 하려면 데이터 집합에 저장할 필요가 없습니다. 대신 데이터베이스에서 응용 프로그램으로 데이터를 직접 읽으면 됩니다. 자세한 내용은 아래의 "읽기 전용 데이터"를 참조하십시오. |
데이터 어댑터를 사용하여 다음과 같은 작업을 수행할 수 있습니다.
데이터 저장소의 행을 데이터 집합의 해당 데이터 테이블로 가져옵니다.
행을 데이터 집합으로 가져오려면 데이터 어댑터 개체(SqlDataAdapter, OleDbDataAdapter, OdbcDataAdapter 또는 OracleDataAdapter)에서 Fill 메서드를 사용합니다. Fill 메서드를 호출하면 SQL SELECT 문이 데이터 저장소로 전송됩니다.
데이터 집합 테이블의 변경된 내용을 해당 데이터 저장소로 전송합니다.
데이터 집합의 데이터 집합 테이블을 데이터 저장소로 전송하려면 어댑터의 Update 메서드를 사용합니다. 이 메서드를 호출하면 영향을 받는 레코드가 새로운 레코드인지, 변경되었는지 또는 삭제되었는지에 따라SQL INSERT, UPDATE 또는 DELETE 문이 실행됩니다.
데이터 어댑터를 사용하여 업데이트를 수행하는 방법에 대한 자세한 내용은 DataAdapters를 사용하여 데이터 소스 업데이트(ADO.NET)를 참조하십시오.
읽기 전용 데이터
사용하는 프로그램에서 쿼리 결과를 통해 순차적인 읽기 전용 전달을 수행해야 하는 경우 데이터 집합을 채우는 대신 데이터 읽기 개체를 사용할 수 있습니다. 데이터 읽기 개체는 데이터 소스에서 데이터를 페치해서 직접 응용 프로그램으로 전달합니다. 일반적으로 데이터 읽기 개체는 데이터 집합에 데이터를 캐싱할 필요가 없을 때 읽기 전용으로 앞으로만 이동하여 데이터에 액세스하는 데 사용됩니다. 한편 데이터 어댑터는 데이터 읽기 개체를 사용하여 데이터 집합을 채웁니다. 예를 들어, 데이터베이스 정보를 표시하는 Web Forms 페이지가 있습니다. Web Forms 페이지는 방문할 때마다 새로 작성되므로 데이터 집합에 데이터를 저장하는 것이 비효율적일 수 있습니다.
Visual Studio에서는 SqlDataReader, OleDbDataReader, OdbcDataReader 및 OracleDataReader라는 네 가지의 데이터 읽기 개체를 제공합니다. 데이터 읽기 개체를 사용한 효율적인 읽기 전용 액세스에 대한 자세한 내용은 DataAdapters(ADO.NET)을 참조하십시오.
테이블 매핑
기본적으로 Visual Studio 도구를 사용하여 데이터베이스 테이블에서 데이터 집합을 생성하는 경우 데이터 집합의 테이블 이름과 열 이름은 데이터베이스에서와 동일합니다. 그러나 이 방식은 비실용적입니다. 예를 들어, 데이터베이스에서 사용되는 이름은 너무 간단하거나 장황하거나 외국어로 작성된 경우가 있습니다. 기존 스키마를 사용하는 경우 스키마에 정의된 이름이 데이터베이스에서 사용되는 이름과 일치하지 않을 수도 있습니다.
따라서 데이터베이스와 데이터 집합의 이름은 일치할 필요가 없습니다. 대신 데이터 집합 명령에서 테이블 이름과 열 이름을 새로 만든 다음 이 이름들을 데이터베이스에서 사용된 이름과 매핑할 수 있습니다. 어댑터는 TableMappings 컬렉션을 사용하여 데이터 집합의 구조(데이터 테이블 및 데이터 열)와 데이터 저장소의 구조(테이블 및 열)가 대응되도록 유지합니다. 테이블 매핑에 대한 자세한 내용은 데이터 어댑터의 테이블 매핑을 참조하십시오.
참고 항목
작업
방법: 데이터 소스 열을 데이터 집합의 데이터 테이블 열로 매핑
개념
DataAdapter에서 DataSet 채우기(ADO.NET)
Visual Studio를 사용하여 데이터 응용 프로그램 만들기