블로그 이미지
Kanais
Researcher & Developer 퍼즐을 완성하려면 퍼즐 조각들을 하나 둘씩 맞춰나가야 한다. 인생의 퍼즐 조각들을 하나 둘씩 맞춰나가다 보면 인생이란 퍼즐도 완성되는 날이 오려나...?

calendar

1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30

Notice

2015. 5. 19. 16:23 Programming/.NET

 

작성날짜    : 2011-04-12


참고 서적 : Microsoft ADO.NET – 정보 문화사 – Rebecca M. Riordan 저 / 이재훈 , 이용훈 공역

 

Adapter 용어 : http://terms.co.kr/adapter.htm

 


Adapter 란?

어댑터란 하나의 하드웨어나 전자적 인터페이스가 다른 하드웨어나 전자적 인터페이스에 맞도록 해주는 물리적 장치이다. 컴퓨터에서, 어댑터는 컴퓨터 마더보드 상의 슬롯에 꽂힐 수 있는 확장카드의 형태로 만들어지는 경우가 많다. 그 카드는 컴퓨터 마이크로프로세서와 카드를 지원하는 주변장치 간에 교환된 정보의 차이를 중간에서 조절한다.

 

DataAdapter 란?

       데이터베이스의 Connection으로부터 DataSet을 생성하는 중간 역할 담당

        DataSet을 채우고 데이터 소스를 업데이트하는 데 사용되는 SQL 명령 집합 및 데이터베이스 연결을 지원하는 클래스

        DataTable와 같은 비연결 지향적 클래스들이 데이터베이스와 연결

 

      Command로 작업할 때에는 데이터베이스와 연결된 상태에서 작업

       DataAdapter로 작업을 할 경우에는 DataSet이라는 결과를 얻은 후에 데이터베이스와의 연결을 끊고, DataSet 자체만으로도 작업을 수행한다.

       작업이 끝난 후에는 DatatAdapter를 통해 DataSet의 변경된 부분이 실제 데이터베이스에 반영 가능

 

DataAdapter 이해

DataAdapter는 데이터 공급자의 일부분이고 각 데이터 공급자에 따라 DataAdapter의 여러 버전이 있다. .NET 프레임워크에 있는 버전에서는 System.Data.OleDb Namespace의 OleDbDataAdapter와 System.Data.SqlClient Namespace의 SqlDataAdapter를 의미한다. 이 두 객체는 System.Data.Adapter를 상속 받은 System.Data.DbDataAdapter를 상속받는다.

 

DataAdapter는 데이터 소스와 DataSet 객체 사이에서 접착제와 같은 역할을 한다. 추상적인 관점에서 보면 DataAdapter는 Connection 객체로부터 데이터를 받아 DataSet에게 넘겨준다. 그 다음 데이터 소스의 데이터를 갱신하기 위해 변경된 것을 DataSet에서 connection으로 되돌려 보낸다(데이터 소스는 데이터베이스뿐만 아니라 어떤 종류의 데이터도 될 수 있다는 것을 기억하도록 한다).

 

Tip

대체로 DataAdapter와 DataSet에 있는 DataTable 사이에는 일대일 관계가 성립한다. 그러나 여러 개의 결과 집합을 리턴하는 SelectCommand하고는 DataSet 내에 있는 여러 테이블과 연결될 수도 있다.

 

데이터 소스를 갱신하기 위해서 Dataadapter는 네 개의 Data Command에 대한 참조를 포함한다. 바로 Selectcommand, UpdateCommand, InsertCommand, 그리고 DeleteCommand이다.

 

Note

앞으로 보게 될 Fill 메서드와 약간의 차이점을 제외하고, SqlDataAdapter와 OleDbDataAdapter는 동일한 속성, 메서드, 이벤트를 가진다.

 

SqlDataAdapter

SqlDataAdapter 클래스는 DataSet을 채우고 SQL 서버 데이터베이스를 업데이트하는데 사용할 데이터 명령 집합과 데이터베이스 연결을 지원하는 클래스이다.

 

DataAdapter의 속성

DataAdapter의 속성은 다음 표과 같다. SqlDataAdapter와 OleDbDataAdapter 객체들도 같은 속성들을 갖는다.

 

Public 속성

속성

설명

AcceptChangesDuringFill

DataTable에 DataRow가 추가된 후 AcceptChanges를 호출할지 결정한다.

Container

컴포넌트가 포함된 IComtainer를 가져온다.

ContinueUpdateOnError

행을 업데이트하는 동안 오류가 발생될 경우에 오류가 있는 행을 가져오거나 설정한다.

DeleteCommand

데이터 소스에서 행을 삭제하는데 쓰인다.

InsertCommand

데이터 소스에서 행을 추가하는데 쓰인다.

MissingMappingAction

삽입되는 데이터가 이미 존재하는 테이블이나 행과 일치할 수 없을 때 해야 할 작업을 결정한다.

MissingSchemaAction

삽입되는 데이터가 기존의 DataSet의 Schema와 맞지 않을 때 해야 할 작업을 결정한다.

SelectCommand

데이터 소스에서 행을 가져올 때 쓰인다.

Site

컴포넌트의 Isite를 가져오거나 설정한다.

TableMappings

DataSet의 열과 데이터 소스 사이의 관계를 결정하는 DataTableMapping 객체들의 집합니다.

UpdateCommand

데이터 소스에서 열을 갱신하는데 쓰인다.

AccaptChangeDuringFill 속성은 DataSet에 추가된 각 행들에 대하여 AcceptChanges 메서드를 호출할지 결정한다. 기본값은 True이다.

 

Protected 속성

속성

설명

DesignMode

구성요소가 현재 Design Mode인지 여부를 나타내는 값을 가져온다.

Events

컴포넌트에 연결된 이벤트 핸들러의 목록을 가져온다.

 

MissingMappingAction 속성은 SelectCommand가 DataSet에 없는 열이나 테이블을 반환하였을 때 시스템이 어떻게 반응할지를 결정한다. 가능한 값이 다음 표에 나와 있다. 기본값은 Passthrough이다.

설명

Error

SystemException을 발생시킨다.

Ignore

DataSet에 없는 열이나 테이블을 무시한다.

PassThrough

DataSet에 없는 열이나 테이블은 데이터 소스의 이름으로 DataSet에 추가된다.

 

이와 비슷하게, MissingSchemaAction 속성은 열이 데이터 집합에서 사라졌을 때 시스템이 반응 할 행동을 결정한다. MissingSchemaAction 속성은 MissingMappingAction이 Passthrough로 설정되어 있을 때만 호출된다. 가능한 값은 다음 표에 나와 있다. 기본값은 Add이다.

설명

Add

필요한 열을 DataSet에 추가한다.

AddWithkey

필요한 열과 테이블, 그리고 기본 키 제약 조건들을 추가한다.

Error

SystemException을 발생시킨다.

Ignore

불필요한 열들을 무시한다.

 

SelectCommand 속성

Ø  SelectCommand 속성을 이용하여 원본 DB의 데이터 소스에서 레코드를 검색하는데 사용하는 SQL문이나 Proc를 설정할 수 있다.

Ø  SelectCommand 에 설정된 SQL문을 실행했을때 검색결과가 없어서 SelectCommamd가 행을 반환하지 않으면 데이터 셋에 테이블이 추가되지 않는다.

Ø  SelectCommand 문을 실행해서 나온 결과에 대해서 SqlDataAdapter클래스의 Fill메소드가 데이터 셋에 테이블을 추가하게 된다.

 

InsertCommand 속성

Ø  InsertCommand 속성을 이용하면 새로운 레코드를 데이터 소스에 삽입할 SQL 문이나 Proc를 설정할 수 있다.

Ø  InsertCommand를 이용해서 데이터 셋에 자료를 추가하는 등의 처리를 할 수 있다.

 

DeleteCommad 속성

Ø  DeleteCommand는 행을 삭제할때 사용되는 속성이다.

Ø  DeleteCommand 속성을 이용해서 행(레코드)를 데이터 집합으로부터 삭제할 SQL 문이나 Proc를 가져오거나 설정할 수 있다.

 

UpdateCommand 속성

Ø  작업을 하다보면 여러가지 이유로 입력된 데이터를 수정해야 할 때가 있다.

Ø  UpdateCommand 속성을 이용하면 데이터 소스에서 레코드를 업데이트 하는데 사용하는 SQL 문이나 Proc를 가져오거나 설정할 수 있다

 

 

SystemException 클래스

System 네임스페이스의 미리 정의된 예외에 대한 기본 클래스를 정의합니다.

 이 클래스는 시스템에서 정의한 예외와 응용 프로그램에서 정의한 예외를 구분할 수 있도록 제공됩니다.

SystemException은 Exception의 원인에 대해 정보를 제공하지 않습니다. 대부분의 시나리오에서 이 클래스의 인스턴스는 throw될 필요가 없습니다. 이 클래스가 인스턴스화되는 경우 인간이 읽을 수 있는 형태의 오류 설명 메시지가 생성자에게 전달되어야 합니다.

사용자 프로그램에서 복구할 수 있는 사소한 오류가 발생할 경우 공용 언어 런타임에 의해 SystemException이 throw됩니다. 범위를 벗어나는 배열 오류와 같이 이 오류는 런타임 검사가 잘못된 경우 발생하며, 메서드를 실핼할 때 발생할 수 있습니다. SystemException은 Exception에 새 기능을 추가하지 않습니다.

SystemException은 0x80131501 값을 가지는 HRESULT COR_E_SYSTEM을 사용합니다.

 

이외에도 DataAdapter는 좀더 자세히 살펴 봐야 할 두 속성 집합을 가지고 있다. 하나는 DataSet의 변경 사항을 데이터 소스에 반영하기 위해 갱신하는 방법을 명시하는 Command 객체의 집합이고, 다른 하나는 DataSet의 열과 데이터 소스의 열 사이의 관계를 결정하는 TableMappings 속성이다.

 

DataAdapter Commands

지금까지 보았듯이, DataAdapter는 네 개의 Command 객체를 포함하고 있다. 이들 각각은 실행되어야 할 실제 SQL 명령들을 포함하는 CommandText 속성을 가지고 있다.

데이터 어댑터 구성 마법사를 이용하거나 서버 탐색기에서 테이블, 뷰, 저장된 프로시저 등을 드래그하여 DataAdapter를 만들었다면, Visual Studio는 각 Command에 대하여 ComandText 속성을 자동적으로 생성할 것이다. 비록 미리 Command와 Connection 객체를 연결해야 하긴 하지만 속성 창에서 SQL 명령을 편집할 수 있다.

 

Note

모든 DataAdapter의 Command는 Connection과 연결되어 있다. 가장 많은 경우로써 모든 Command에 대해 하나의 Connection만을 사용할 것이다. 그러나 이는 필요 조건이 아니다. 필요하다면, 각Command에 대해 다른 Connection을 연결할 수 있다.

SelectCommand 객체를 위해 CommandText 속성을 명시해야 한다. 그러나 .NET 프레임워크는 갱신, 삽입, 삭제 등이 명시되어 있지 않다면 이들에 대한 명령을 생성할 수 있다.

내부적으로 Visual Studio는 명령들을 생성하기 위해 CommandBuilder 객체를 사용한다. 사용자는 코드로 CommandBuilder 객체를 만들 수 있고, 필요하다면 명령들을 생성하는데  이를 사용할 수도 있다. 그러나 CommandBuilder의 한계를 염두해 두어야 한다. 예를 들어, 파라미터가 있는 저장 프로시저는 처리할 수 없다.

 

DataAdapter 메서드

DataAdapter는 두 가지 중요한 메서드를 제공한다. 즉, 데이터를 데이터 소스에서 DataSet으로 로드하는 Fill과 데이터를 반대 방향으로 전송하는 Update이다. 다시 말해서, DataSet에서 데이터 소스로 전송한다. 여기에서 이 두 가지 모두를 살펴 볼 것이다.

 

Public 메서드

메서드

설명

CreateObjRef

원격 개체와 통신할 때 사용되는 프록시를 생성하는데 필요한 정보를 가진 개체를 생성한다.

Dispose

컴포넌트에서 사용하는 리소스를 해제한다.

Equals

두 개의 Object 인스턴스가 같은지 여부를 확인한다.

Fill

데이터 셋의 행을 데이터 소스와 일치하도록 한다.

FillSchema

데이터 셋에 DataTable을 추가하고 데이터 소스의 스키마와 일치하도록 스키마를 구성한다.

GetFillParameters

Select 문을 실행할 때 사용자가 설정한 매개 변수를 가져온다.

GetHashCode

Hashcode를 가져온다.

GetLifetimeService

인스턴스의 수명 정책을 제어하는 현재 수명 서비스 개체를 검색한다.

GetType

인스턴스의 타입을 가져온다.

InitializeLifetimeService

인스턴스의 수명 정책을 제어하기 위한 수명 서비스 개체를 가져온다.

ToString

오브젝트를 나타내는 문자열을 반환한다.

Update

DataSet의 내용과 동일한 데이터를 가지도록 데이터 소스를 업데이트한다.

 

Protected 메서드

메소드

설명

CloneInternals

DataAdapter의 인스턴스 복사본을 만든다.

CreateRowUpdateEvent

RowUpdatedEventArgs 클래스의 새 인스턴스를 초기화 한다.

CreateRowUpdatingEvent

RowUpdatingEvnetArgs 클래스의 새 인스턴스를 초기화 한다.

CreateTableMappings

새 DataTableMappingCollection을 만든다.

Dispose

컴포넌트에서 사용하는 리소스를 해제한다.

Fill

데이터 소스와 일치하도록 DataSet의 행을 추가하거나 수정한다.

FillSchema

데이터 셋에 DataTable을 추가하고 데이터 소스의 스키마와 일치하도록 스키마를 구현한다.

Finalize

가비지 수집기에서 오브젝트가 리소스를 해제하도록 한다.

GetService

컴포넌트나 해당 컨테이너에서 제공하는 서비스를 반환하는 개체를 반환한다.

MemberwiseClone

현재 오브젝트 단순 복사본을 만든다.

OnFillError

FillError 이벤트를 발생시킨다.

OnRowUpdated

RowUpdated 이벤트를 발생시킨다.

OnRowUpdating

RowUpdating 이벤트를 발생시킨다.

ShouldSerializeTableMappings

하나 이상의 DataTableMapping 개제가 존재하며 유지되어야 하는지 여부를 결정한다.

Update

DataSet과 동이하게 데이터 소스를 업데이트한다.

 

DataSet 생성과 데이터 바인딩

Fill과 Update 메서드를 살펴 보기 전에 데이터를 저장하는데 사용될 DataSet을 만들고 연결해야 한다. 아직 DataSet은 살펴 보지 않았기 때문에 다음 과정을 따라하기만 한다.

 

Fill 메서드

Fill 메서드는 데이터 소스에서 데이터를 하나 또는 그 이상의 DataSet 테이블에 로드한다. 이 때 DataAdapter의 SelectComand에 명시된 명령을 사용한다. OleDbDataAdapter와 SqlDataAdapter 모두를 상속받은 DbDataAdapter 객체는 Fill 메서드를 약간 다르게 하여 제공한다.

메서드

설명

Fill(dataSet)

Table이라는 이름의 DataTable을 만들고 데이터 소스에서 반환된 형을 넣는다.

Fill(dataTable)

명시된 dataTable에 데이터 소스로부터 반환된 행을 넣는다.

Fill(dataset, tableName)

명시된 dataSet에서 tableName DataTable에 데이터소스로부터 반환된 행을 넣는다.

Fill(dataTable, dataReader)

명시된 dataReader를 사용해 dataTable을 채운다(DataReader는 IDataReader로 선언되기 때문에 OleDbDataReader 또는 SqlDataReader 모두 사용이 가능한다).

Fill(dataTabale, command, 

commandBehavior)

Command에 넘겨준 SQL 문자열과 명시된 CommandBehavior를 사용해 dataTable을 채운다.

Fill(dataSet, startRecord,

maxRecords, tableName)

tableName 문자열로 명시된 dataTable에 startRecord를 시작으로 maxRecords만큼의 레코드 또는 마지막까지의 레코드로 채운다.

Fill(dataset, tableName,

dataReader, startRecord,

maxRecords)

tableName 문자열로 명시된 DataTable에 startRecord를 시작으로 maxRecord만큼의 레코드 또는 마지막까지의 레코드로 채운다. 단 이때 명시된 dataReader를 사용한다(DataReader는 IDataReader로 선언되기 때문에 OleDbDataReader 또는 SqlDataReader 모두 사용 가능하다).

Fill(dataset, startRecord,

maxRecords, tableName,

command, comandBehavior)

tableName 문자열로 명시된 dataTable에 startRecord를 시작으로 maxRecords 만큼의 레코드 또는 마지막까지의 레코드로 채운다. 단 command에 포함된 SQL 텍스트와 명시된 commandBehavior를 사용한다.

 

OleDbDataAdapter는 추가적으로 두 가지 Fill 메서드를 제공한다.

메서드

설명

Fill(dataTable, adoObject)

ADO Recordset 또는 adoObject에 명시된 Record 객체로부터 얻은 행을 명시된 datatable에 채운다.

Fill(dataSet, adoObject,

tableName)

ADO Recordset 또는 adoObject에 명시된 Record 객체로부터 얻은 행을 명시된 dataTable에 채운다. 단, TableMappings을 결정하기 위해 tableName 문자열로 명시된 dataTable을 사용한다.

 

SqlDataAdapter는 DbDataAdapter가 제공하는 메서드만 제공한다. 물론, 다른 데이터 공급자에 포함된 DataAdapter는 추가적인 Fill 메서드를 제공한다.

 

Important

Microsoft SQL Server 십진 데이터 타입은 최대 38자리까지 지원하지만 .NET 프레임워크의 십진 타입은 최대 28자리이다. SQL 테이블에 포함된 열의 십진수가 28자리를 넘어서면 그 행은 DataSet에 추가될 수 없고 FillError가 발생한다.

 

FillSchema 메서드

FillSchema 메서드는 DataSet에 DataTable을 추가하고 데이터 소스의 스키마와 일치하도록 스키마를 구성하는 역할을 한다. 스키마란 테이블의 구조를 의미한다. FillSchema 메서드를 통해 소스 테이블에 설정된 값들이 DataTable에 추가된다.

Public 메서드

메서드

설명

FillSchema(DataSet,SchemaType)

지정된 DataSet에 Table이라는 DataTable을 추가하고 지정된 SchemaType을 기반으로 데이터 소스의 스키마와 일치하도록 스키마를 구성한다.

FillSchema(DataTable,SchemaType)

SchemaType을 기반으로 지정된 DataTable의 스키마를 구성한다.

FillSchema(DataSet,SchemaType,

string);

지정된 데이터 셋에 DataTable을 추가하고 지정된 SchemaType과 DataTable을 기반으로 데이터 소스의 스키마와 일치하도록 스키마를 구성한다.

Protected 메서드

메서드

설명

FillSchema(DataTable, SchemaType,

IDbCommand, commandBehavior)

지정된 SchemaType, 명령 문자열 및 CommandBehavior 값을 기반으로 지정된 DataTable의 스키마를 구성한다.

FillSchema(DataSet, SchemaType,

IDbCommnad, string,

commandBehavior)

지정된 데이터 셋에 DataTable을 추가하고 지정된 SchemaType을 기반으로 데이터 소스의 스키마와 일치하도록 스키마를 구성한다.

 

Updata 메서드

DataSet은 데이터가 무엇을 포함하는지 그 정보를 지니고 있지 않다. 그리고 DataSet의 행을 변경한다 하여도 데이터 소스에는 영향을 미치지 않는다는 것을 기억하기 바란다. 이를 가능하게 하기 위해서는 DataAdapter의 Update 메서드를 사용해야 한다. Update 메서드는 DataSet에서 변경된 각각의 행에 대해 DataAdapter의 InsertCommand, DeleteCommand, 또는 UpdateCommand를 적절하게 호출한다.

 

상기할 수 있듯이, System.Data.Common.DbDataAdatper는 DataAdapter를 상속받은 관계 데이터베이스 데이터 공급자들로부터 나온 DataAdapter 클래스이다. System.Data.Common.DbDataAdapter는 다음 표에 나와 있는 것과 같이 몇 가지의 Update 메서드를 제공한다. SqlDataAdapter와 OleDbDataAdapter는 모두 추가적인 버전을 추가하지 않는다.

메서드

설명

Update(dataSet)

명시된 dataSet에서 Table이라는 이름의 DataTable로부터 데이터 소스를 갱신한다.

Update(dataRows)

명시된 dataRows 배열로부터 데이터 소스를 갱신한다.

Update(dataTable)

명시된 dataTable로부터 데이터 소스를 갱신한다.

Update(dataRows,

dataTableMapping)

명시된 DataRows 배열로부터 데이터 소스를 갱신한다. 단, 명시된 dataTableMapping을 사용한다.

Update(dataSet, sourceTable)

명시된 dataSet에서 sourceTable로 명시된 dataTable로부터 데이터 소스를 갱신한다.

 

DataAdapter 이벤트 처리

에러의 의해 발생되는 이벤트 외에 DataAdapter는 두 가지 이벤트를 제공한다. 즉, OnRow-Updating과 OnRowUpdated이다. 이 두 이벤트는 실제 DataSet 갱신 떄에나 프로세스가 이상 없이 진행될 때 발생한다.

 

OnRowUpdating 이벤트

OnRowUpdating 이벤트는 실행되어야 할 명령의 파라미터 값을 Update 메서드가 설정한 후에 발생한다. 그러나 명령은 실행되기 전이다. 이 이벤트에 대한 핸들러는 하나의 인자를 받는다. 이 인자는 실행될 명령에 대한 필수적인 정보를 제공한다.

 

이벤트 인자 클래스는 데이터 제공자가 정의한 것이다. 따라서 .NET 프레임워크 데이터 공급자 중의 하나가 사용된다면 OleDbRowUpdatingEventArgs 또는 SqlRowUpdatingEventArgs가 인자 클래스가 된다.

속성

설명

Command

실행될 Data Command.

Errors

.NET 데이터 공급자가 발생시킨 에러.

Row

갱신될 DataReader.

StatementType

실행될 Command의 타입. 가능한 값은 Select, Insert, Delete, 그리고 Update이다.

Status

Command의 UpdateStatus.

TableMapping

갱신에 사용될 DataTableMapping.

 

Command 속성은 데이터 소스를 갱신하는데 사용될 실제 Command 객체에 대한 참조를 포함한다. 예를 들면, 이 참조를 사용하여 실행될 SQL을 결정하는 Command의 CommandText를 시험해 볼 수 있고 필요하다면 바꿀 수도 있다.

 

이벤트 인자의 StatementType 속성은 수행해야 할 행위를 정의한다. 이 속성은 Select, Insert, Update 또는 Delete 값을 가질 수 있다. StatementType은 읽기 전용이기 때문에 수행할 행위의 타입은 바꿀 수 없다.

 

Row 속성은 데이터 소스에 반영되어야 할 DataRow에 대한 참조를 포함한다. 이는 읽기 전용이다. 반면에, TableMapping 속성은 갱신하는데 사용될 DataTableMapping에 대한 참조를 포함한다.

 

이벤트 핸들러가 처음 호출되면, UpdateStatus 목록인 Status 속성이 이벤트 상태를 정의한다. 그것이 ErrorsOccurred라면 Errors 속성은 Errors 컬렉션을 포함할 것이다.

 

시스템이 취해야 할 행위를 결정하기 위해 이벤트 핸들러 사이에서 Status 속성을 설정할 수 있다. 예외 상황이 발생할 때 일어나는 ErrorsOccurred 뿐만 아니라 가능한 종료 상태는 Continue, SkipAllRemainingRows, 그리고 SkipCurrentRow 등이다. 기본값인 Continue는 이미 예상했듯이 시스템이 작업을 계속 하도록 지시한다. SkipAllRemainingRows는 현재 행과 나머지 행들에 대해 갱신을 취소한다. 반면, SkipCurrentRow는 현재 작업 중인 행만을 취소한다.

 

OnRowUpdated 이벤트

OnRowUpdated 이벤트는 Update 메서드가 데이터 소스에 대한 적당한 명령을 수행한 후에 발생한다. 이 이벤트의 이벤트 핸들러는 데이터 공급자에 따라 SqlRowUpdatedEventArgs 또는 OleDbRowUpdatedEvnetArgs 인자를 받는다.

 

어떤 것이든 이벤트 인자는 RowUpdatingEvent 인자와 모두 같은 속성을 포함한다. 게다가 실행된 SQL 명령에 의해 변경되고 삽입되고 삭제된 행들의 수를 알려 주는 RecordsEffected 인자도 포함한다. 이는 읽기 전용이다.

 

Quick Reference

To

Do this

서버 탐색기에서

DataAdapter 생성하기

테이블을 폼 디자이너로 드래그한다.

도구 상자를 사용해

DataAdapter 생성하기

OleDbDataAdapter 또는 SqlDataAdapter를 폼 디자이너로 드래그한다.

DataAdapter 설정을 수동으로 하고 싶다면[데이터 어댑터 구성 마법사]를 취소한다.

코드로 DataAdapter 생성하기

DataAdapter 변수와 네 개의 Command 객체 변수를 선언하고 이들을 인스턴스화한다. 그리고 Command 객체를 DataAdapter에 할당한다.

DAtaAdapter의 결과 미리보기

폼 디자이너에서 DataAdapter를 선택하고 속성 창의 [데이터 집합 미리 보기]를 클릭한다.

 


DataAdapter 예제 소스

소스 설명에 들어가기 앞서.. SqlAdapter 클래스를 이용하기 위해서는 namespace에서 using 예약어를 이용해서 System.data.SqlClient를 추가해 줘야 한다.

 

using System.Data.SqlClient;

 

물리적 Database의 데이터 소스와 DataSet을 동일하게 하는 소스

string connString = "server = 504-04\\sql2005; database = jjdb;";

      connString = connString + "uid=4;password=1"; ;

      SqlConnection SConnection = new SqlConnection(connString);

      SqlDataAdapter adapter = new SqlDataAdapter();

      adapter.SelectCommand = new SqlCommand();

      adapter.SelectCommand.Connection = SConnection;

      string Query = "select m_name, m_age from TestTable";

      adapter.SelectCommand.CommandText = Query;

      DataSet ds = new DataSet("Mytable");

 

      adapter.FillSchema(ds, SchemaType.Source, "TestTable");

adapter.Fill(ds, "TestTable");

      dataGrid1.DataSource = ds.Tables["TestTable"].DefaultView;

 

서버와 Database에 이름을 설정하는 부분과 ID와 Password를 설정 하는 부분

string connString = "server = 504-04\\sql2005; database = jjdb;";

      connString = connString + "uid=4;password=1"; ;

 

설정된 connString으로 database에 연결하는 부분

SqlConnection SConnection = new SqlConnection(connString);

      SqlDataAdapter adapter = new SqlDataAdapter();

      adapter.SelectCommand = new SqlCommand();

      adapter.SelectCommand.Connection = SConnection;

 

쿼리문을 쓰고 Command를 입력하는 부분.

string Query = "select m_name, m_age from TestTable";

      adapter.SelectCommand.CommandText = Query;

 

DataSet을 생성하고 DataSet테이블에 데이터 소스의 스키마와 동일한 스키마를 구성하기 위해 FillSchema Method를 사용하고, 물리적 Database의 데이터 소스와 DataSet을 동일하게 해주기 위해 Fill Method를 사용하는 부분

DataSet ds = new DataSet("Mytable");

      adapter.FillSchema(ds, SchemaType.Source, "TestTable");

adapter.Fill(ds, "TestTable");

 

출력부분

dataGrid1.DataSource = ds.Tables["TestTable"].DefaultView;

dataGrid1은 Form에 DataGrid  Control 명이다.

 

출력 화면

더블클릭을 하시면 이미지를 수정할 수 있습니다 

Fill Method 생성자에는 여러 개가 있지만.. 그 중에서 아래와 같이 쓴다면

adapter.Fill(ds, 13"TestTable");

아래와 같은 결과를 얻게 된다. 첫번째 정수는 Index를 설정하고, 두번째 정수는 데이터의 개수를 설정하는 부분이다.(실질적으로 Fill Method를 사용할 때 이와 같이 사용하는 방법보단 쿼리문에서 설정해서 사용하는 것이 더 좋다)

 

 

 

DataSet에 Item 추가 후 업데이트하는 소스

string connString = "server = 504-04\\sql2005; database = jjdb;";

    connString = connString + "uid=4;password=1"; ;

    SqlConnection SConnection = new SqlConnection(connString);

    SqlDataAdapter adapter = new SqlDataAdapter();

    adapter.SelectCommand = new SqlCommand();

    adapter.SelectCommand.Connection = SConnection;

    string Query =  "select * from TestTable";

    adapter.SelectCommand.CommandText = Query;

    DataSet ds = new DataSet("Mytable");

 

    adapter.FillSchema(ds, SchemaType.Source, "TestTable");

    adapter.Fill(ds, "TestTable");

    SqlCommand insertcom = adapter.InsertCommand;

    insertcom = new SqlCommand();

Query = "insert from TestTable (m_name) values (@name), (m_age)

values (@age)";

    insertcom.Connection = SConnection;

    insertcom.CommandText = Query;

    insertcom.Parameters.Add("@name"SqlDbType.VarChar, 10"m_name");

    insertcom.Parameters.Add("@age"SqlDbType.Int, 4"m_age");

    DataRow row = ds.Tables["TestTable"].NewRow();

    row["m_name"] = "고길동";

    row["m_age"] = 45;

    ds.Tables["TestTable"].Rows.Add(row);

    try

    {

       SqlCommandBuilder builder = new SqlCommandBuilder(adapter);

         adapter.UpdateCommand = builder.GetUpdateCommand();

         adapter.Update(ds, "TestTable");

    }

    catch (Exception ex)

    {

    }

    dataGrid1.DataSource = ds.Tables["TestTable"].DefaultView;

DataSet을 생성하는 부분까지는 위와 동일하다.

 

최소 지식의 원칙인 디미터의 법칙을 활용한 부분

SqlCommand insertcom = adapter.InsertCommand;

 

DataSet에 Item을 추가하는 부분

insertcom.Parameters.Add("@name"SqlDbType.VarChar, 10"m_name");

    insertcom.Parameters.Add("@age"SqlDbType.Int, 4"m_age");

    DataRow row = ds.Tables["TestTable"].NewRow();

    row["m_name"] = "고길동";

    row["m_age"] = 45;

    ds.Tables["TestTable"].Rows.Add(row);

 

물리적 DB에 Update하는 부분

SqlCommandBuilder를 사용하지 않는다면 아래 그림과 같이 빨간색 원에 느낌표가 뜨면서, “새 행을 포함하여 DataRow 컬렉션을 전달하는 경우 업데이트하려면 올바른 InsertCommand가 필요합니다.” 라고 뜬다.

SqlCommandBuilder builder = new SqlCommandBuilder(adapter);

  adapter.UpdateCommand = builder.GetUpdateCommand();

  adapter.Update(ds, "TestTable");

 

 

출력 화면

 

 

DataSet에 Item 삭제 후 업데이트하는 소스

string connString = "server = 504-04\\sql2005; database = jjdb;";

    connString = connString + "uid=4;password=1"; ;

    SqlConnection SConnection = new SqlConnection(connString);

    SqlDataAdapter adapter = new SqlDataAdapter();

    adapter.SelectCommand = new SqlCommand();

    adapter.SelectCommand.Connection = SConnection;

    adapter.SelectCommand.CommandText = "select * from TestTable";

DataSet ds = new DataSet("myDataSet");

 

    SqlCommand delcom = adapter.DeleteCommand;

    delcom = new SqlCommand();

    delcom.Connection = (SqlConnection)adapter.SelectCommand.Connection;

    string strUpdateQuery;

    strUpdateQuery = "delete from TestTable where name = @m_name";

    delcom.CommandText = strUpdateQuery;

SqlParameter myParam = new SqlParameter("@m_name"SqlDbType.NChar, 10);

    myParam.SourceColumn = "m_name";

    myParam.SourceVersion = DataRowVersion.Current;

    delcom.Parameters.Add(myParam);

 

    adapter.FillSchema(ds, SchemaType.Source, "TestTable");

    adapter.Fill(ds, "TestTable");

 

    string strExpression! = "m_name='고길동'";

    DataRow[] myRows = ds.Tables["TestTable"].Select(strExpression!);

    if (myRows.Length > 0)

    {

         myRows[0].Delete();

    }

    try

    {

         adapter.Update(ds, "TestTable");

    }

    catch (Exception ex)

    {

    }

    dataGrid1.DataSource = ds.Tables["TestTable"].DefaultView;

DataSet을 생성하는 부분까지는 위와 동일하다.

 

DataSet에 Item 삭제하는 Parameter 설정하는 부분

SqlParameter myParam = new SqlParameter("@m_name"SqlDbType.NChar, 10);

    myParam.SourceColumn = "m_name";

    myParam.SourceVersion = DataRowVersion.Current;

    delcom.Parameters.Add(myParam);

 

출력 화면  

'Programming > .NET' 카테고리의 다른 글

[.NET] Reflection (C#)  (0) 2015.05.19
[.NET] DataAdapter 생성  (0) 2015.05.19
[.NET] try-catch-finally  (0) 2015.05.19
[.NET] Windows Form Timer  (0) 2015.05.19
[.NET] Form  (0) 2015.05.19
posted by Kanais