21장 데이터베이스 다루기

22
21 장 장장장장장장 장장장

Upload: moses-gates

Post on 03-Jan-2016

71 views

Category:

Documents


0 download

DESCRIPTION

21장 데이터베이스 다루기. 데이터베이스 사용하기. ADO.NET 소개 데이터베이스 연결하기 DataTable 의 이해 DataAdapter 생성하기 DataRow 의 필드 참조하기 레코드 탐색 레코드 추가 , 편집 , 삭제하기 ADO.NET 예제 만들기. ADO .NET 소개. ADO .NET ADO(Active Data Object) 를 통해 만들어진 .NET 기반의 새로운 데이터베이스 기술 - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: 21장 데이터베이스  다루기

21 장 데이터베이스 다루기

Page 2: 21장 데이터베이스  다루기

데이터베이스 사용하기

• ADO.NET 소개 • 데이터베이스 연결하기 • DataTable 의 이해 • DataAdapter 생성하기 • DataRow 의 필드 참조하기 • 레코드 탐색 • 레코드 추가 , 편집 , 삭제하기 • ADO.NET 예제 만들기

Page 3: 21장 데이터베이스  다루기

ADO .NET 소개

• ADO .NET– ADO(Active Data Object) 를 통해 만들어진 .NET 기반의 새로운

데이터베이스 기술– 인터넷과 인트라넷에서 연결이 단절된 데이터 집합들을 쉽게 이동시킬

수 있도록 최적화된 DataSet 과 DataTable 객체 제공– 기존의 Connection 과 Command 객체와 DataReader 라는 객체도 포함

• 주요 객체– OleDBConnection : OLEDB 데이터 원본과 연결하기 위해 사용– SqlConnection : SQL Server 데이터 원본과 연결하기 위해 사용 .– DataSet : 메모리에 남아있는 데이터의 복사본이다 . DataTables 등의

다양한 방법을 통해 DataSet 을 사용– DataTable : 데이터를 처리하고 검색하기 위한 결과 집합 (Resultset) 을

저장– DataAdapter : DataReader 의 내용을 채우기 위해 사용

• ADO.NET 객체들은 System.Data 네임스페이스에 속해있으며 , DataTable 은 System.XML 에 속해있음

Page 4: 21장 데이터베이스  다루기

데이터베이스에 연결하기• 데이터베이스에 접근하려면 ADO.NET Connection 객체 사용

– OleDbConnection 객체와 SqlConnection 객체 사용가능– OleDbConnection 객체 초기화

OleDbConnection cnADONetConnection = new OleDbConnection();

• 데이터베이스 연결 상태 저장을 위한 모듈 변수 선언OleDbConnection m_cnADONetConnection = new OleDbConnection();

• 데이터베이스 연결을 위해 ConnectionString 에 데이터 원본 지정– Provider 의 이름 , 사용자 이름 , 패스워드 등의 연결 정보 저장

매개변수 설명

Provider 사용할 데이터 공급자의 이름 (Jet, SQL 등 )

Data Source 연결할 데이터 원본 ( 데이터베이스 ) 의 이름 . 데이터 형식은 공급자에 의해 결정된다 .

User ID 데이터 원본에 연결할 때 사용하는 사용자 이름

Password 데이터 원본에 연결할 때 사용하는 비밀번호

DRIVER 사용할 데이터베이스의 드라이버 이름 . DSN 이 지정되면 드라이버는 필요하지 않다 .

SERVER 데이터 원본 서버의 네트워크 이름

Page 5: 21장 데이터베이스  다루기

예제 데이터베이스에 연결하기

• 폼의 Load 이벤트에 다음 문장을 입력하여 ADO.NET 연결의 ConnectionString 속성 지정– 예제 데이터베이스가 C:\Temp 폴더에 저장해놓은 것으로 가정m_cnADONetConnection.ConnectionString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\temp\contacts.mdb";

• 위의 문장 다음에 아래 문장 추가m_cnADONetConnection.Open();

Page 6: 21장 데이터베이스  다루기

데이터 원본의 연결 닫기

• 데이터 원본의 연결 객체 사용이 끝나면 항상 직접 닫아주어야 함– Connection 객체의 Close() 메서드 사용

• 코드 창의 객체 드롭다운 목록에서 (frmMainEvents) 선택• 이벤트 드롭다운 목록에서 FormClosing 을 선택하고 , 이벤트에

다음 문장 입력m_cnADONetConnection.Close(); m_cnADONetConnection.Dispose();

Page 7: 21장 데이터베이스  다루기

DataTables 이해하기

• DataTables– 데이터 원본의 데이터 복사본 (Snapshot) 저장– DataTable 에서 변경한 모든 내용은 Update 메서드를 호출할 때까지

데이터의 로컬 복사본으로만 존재• DataTable 의 사용 과정

– DataTable 의 내용을을 채우면서 시작– 결과를 처리하고– 변경 내용을 다시 데이터 원본에 저장

Page 8: 21장 데이터베이스  다루기

DataAdapter 만들기

• DataAdapter : DataTable 채우기– 미리 정의해놓은 데이터 원본과의 연결을 사용하고 , 별도로 작성한 질의문 (Query) 을

실행시키면 질의문의 결과가 DataTable 에 채워짐• DataAdapter 추가하기

1. 모듈 수준의 변수를 생성하는 문장 바로 아래에 다음 문장 추가OleDbDataAdapter cnADONetAdapter = new OleDbDataAdapter([CommandText],[Connection]);

2. 다음 구문을 m_cnADONewConnection 객체 선언문 바로 아래에 추가한다 OleDbDataAdapter m_daDataAdapter;

3. 다음 문장을 폼의 Load 이벤트 아래에 입력m_daDataAdapter = new OleDbDataAdapter("Select * From Contacts",m_cnADONetConnection);

4. CommandBuilder 의 모듈 수준 변수를 생성하기 위해 클래스 헤더에 다음 문장 입력OleDbCommandBuilder m_cbCommandBuilder;

5. CommandBuilder 객체를 초기화하기 위해 Form_Load 이벤트 끝에 다음 문장 추가OleDbCommandBuilder m_cbCommandBuilder = new OleDbCommandBuilder(m_daDataAdapter);

Page 9: 21장 데이터베이스  다루기

CommandBuilder 객체 초기화

Page 10: 21장 데이터베이스  다루기

데이터 테이블 만들고 채우기

1. 또 다른 모듈 수준의 변수를 생성하기 위해 클래스 헤더에 다음 문장을 추가하여 DataTable 변수 생성DataTable m_dtContacts = new DataTable();

2. 위의 코드 다음에 DataTable 내에서 사용자의 현재 위치 ( 줄 ) 를 추적하기 위한 정수형 변수를 다음과 같이 선언int m_rowPosition = 0;

3. DataTable 에 데이터를 채우기 위해 , 폼의 Load 이벤트에서 기존 코드 아래에 다음 문장을 추가한다 .m_daDataAdapter.Fill(m_dtContacts);

Page 11: 21장 데이터베이스  다루기

DataRow 에서 필드 참조하기

• DataTable 내의 레코드 (Row) 에 접근하려면 , 해당되는 DataRow 의 순서 값 (Index) 을 지정해야 하며 , DataTable 의 첫 번째 줄에 접근하려면 다음과 같이 코드 작성DataRow m_rwContact = m_dtContacts.Rows[0];

• DataRow 의 데이터 요소들을 컬럼 (Column) 이라고 부르며 , Contacts 테이블의 ContactName 을 참조하려면 , 다음과 같이 DataRow 에 컬럼 이름을 지정

// 컬럼의 값을 변경한다 . m_rwContact["ContactName"] = "Bob Brown";

또는 다음과 같이 사용할 수 있다 .// 컬럼의 값을 얻는다 . strContactName = m_rwContact("ContactName");

Page 12: 21장 데이터베이스  다루기

데이터 테이블에서 현재 레코드 표시하기

1. frmMain_FormClosing 이벤트의 다음 위치에 아래 프로시저 전체 입력private void ShowCurrentRecord() { if (m_dtContacts.Rows.Count==0) { txtContactName.Text = ""; txtState.Text = ""; return; } txtContactName.Text = m_dtContacts.Rows[m_rowPosition]["ContactName"].ToString(); txtState.Text = m_dtContacts.Rows[m_rowPosition]["State"].ToString(); }

Page 13: 21장 데이터베이스  다루기

2. 다음 문장을 Load 이벤트의 기존 문장 다음에 입력하여 , 폼이 로드될 때 첫 번째 레코드가 표시되도록 함this.ShowCurrentRecord();

3. 데이터를 표시하기 위해서는 폼에 몇 가지 컨트롤을 추가해야 함 . 새로운 텍스트 상자를 만들고 , 속성을 다음과 같이 설정

4. 폼에 두 번째 텍스트 상자를 추가하고 속성을 다음과 같이 설정5. <F5>를 눌러서 프로젝트를 실행시키고 , 데이터가 표시되는 것 확인

속성 값Name txtContactName

Location

48,112

Size 112,20

속성 값Name txtState

Location 168,112

Size 80,20

Page 14: 21장 데이터베이스  다루기

레코드 살펴보기

1. frmMain 폼에 , 첫번째 레코드로 이동할 때 사용하기 위한 버튼을 추가하고 속성을 다음과 같이 설정

2. 버튼을 더블클릭하고 버튼의 Click 이벤트에 다음 코드 추가// 첫 번째 행으로 이동하고 데이터를 표시한다 . m_rowPosition = 0; this.ShowCurrentRecord();

속성 값Name btnMoveFirst

Location 16,152

Size 32,23

Text <<

Page 15: 21장 데이터베이스  다루기

3. 이전 레코드로 이동하기 위한 두 번째 버튼을 추가하고 속성을 다음과 같이 설정

4. 두번째 버튼을 더블클릭하고 Click 이벤트에 다음 코드 추가// 첫 번째 행이 아니면 한 행을 앞으로 이동하고 레코드를 표시한다 . if (m_rowPosition != 0) { m_rowPosition--; this.ShowCurrentRecord(); }

속성 값Name btnMovePrevious

Location 56,152

Size 32,23

Text <

Page 16: 21장 데이터베이스  다루기

5. DataTable 에서 다음 레코드로 이동할 때 사용하기위한 세 번째 버튼을 폼에 추가하고 그 속성을 다음과 같이 설정

6. 세 번째 버튼을 더블클릭하고 , Click 이벤트에 다음 코드 입력// 마지막 행이 아니면 한 행을 이동하고 레코드를 표시한다 . if (m_rowPosition < m_dtContacts.Rows.Count-1) { m_rowPosition++; this.ShowCurrentRecord(); }

속성 값Name btnNext

Location 96,152

Size 32,23

Text >

Page 17: 21장 데이터베이스  다루기

7. DataTable 에서 마지막 레코드로 이동할 때 사용하기 위한 네 번째 버튼을 추가하고 속성을 다음과 같이 지정

8. 네 번째 버튼을 더블클릭하고 Click 이벤트에 다음 코드 추가if (m_dtContacts.Rows.Count != 0) { m_rowPosition = m_dtContacts.Rows.Count-1; this.ShowCurrentRecord(); }

속성 값Name btnMoveLast

Location 136,152

Size 32,23

Text >>

Page 18: 21장 데이터베이스  다루기

레코드 편집하기• DataAdapter 의 Update() 를 호출하여 변경된 내용의 DataTable 을 전달할

때까지 , 변경 내용은 원본 데이터 소스에 반영되지 않음1. 새로운 버튼을 추가하고 , 버튼의 속성을 다음과 같이 설정

2. Save 버튼을 더블클릭하고 , Click 이벤트에 다음 코드 추가// 데이터가 존재하면 업데이트한다 . if (m_dtContacts.Rows.Count !=0) { m_dtContacts.Rows[m_rowPosition]["ContactName"]= txtContactName.Text; m_dtContacts.Rows[m_rowPosition]["State"] = txtState.Text; m_daDataAdapter.Update(m_dtContacts); }

속성 값Name btnSave

Location 176,152

Size 40,23

Text 저장

Page 19: 21장 데이터베이스  다루기

새로운 데이터 만들기

1. DataTable 에 새로운 레코드를 추가하려면 NewRow() 메서드를 호출하고 , 컬럼에 값을 지정한 후 , DataTable 의 RowCollection에서 Add() 메서드 호출

2. 폼에 그룹 상자를 추가하고 , 속성을 다음과 같이 설정3. 그룹 상자에 텍스트 상자를 추가하고 속성을 다음과 같이 설정4. 두 번째 텍스트 상자를 그룹 상자에 추가하고 , 속성을 다음과 같이 설정

5. 그룹 상자에 버튼을 추가하고 , 속성을 다음과 같이 설정

속성 값

Name grpNewRecord

Location 16,192

Size 264,64

Text 새 연락처

속성 값

Name txtNewContactName

Location

8,24

Size 112,20

속성 값

Name txtNewState

Location 126,24

Size 80,20

속성 값

Name btnAddNew

Location 212,24

Size 40,20

Text 추가

그룹상자 속성 첫번째 텍스트 상자 속성 두번째 텍스트 상자 속성 버튼 속성

Page 20: 21장 데이터베이스  다루기

6. Add 버튼을 더블클릭하고 , 버튼의 Click 이벤트에 다음 코드 추가

DataRow drNewRow = m_dtContacts.NewRow(); drNewRow["ContactName"] = txtNewContactName.Text; drNewRow["State"] = txtNewState.Text; m_dtContacts.Rows.Add(drNewRow); m_daDataAdapter.Update(m_dtContacts); m_rowPosition = m_dtContacts.Rows.Count-1; this.ShowCurrentRecord();

Page 21: 21장 데이터베이스  다루기

레코드 삭제하기• DataTable 에서 레코드를 삭제하려면 삭제하고자 하는 DataRow 에서

Delete() 메서드 호출• 폼에 새로운 버튼을 추가하고 , 속성을 다음과 같이 설정

• Delete 버튼을 더블클릭하고 , 버튼의 Click 이벤트에 다음 코드 추가// 데이터가 존재하면 현재 행을 삭제한다 . if (m_dtContacts.Rows.Count !=0) { m_dtContacts.Rows[m_rowPosition].Delete(); m_daDataAdapter.Update(m_dtContacts); m_rowPosition=0; this.ShowCurrentRecord(); }

속성 값

Name btnDelete

Location 224,152

Size 56,23

Text 삭제

Page 22: 21장 데이터베이스  다루기

데이터베이스 예제 완성 결과