220 likes | 461 Views
21장 데이터베이스 다루기. 데이터베이스 사용하기. ADO.NET 소개 데이터베이스 연결하기 DataTable 의 이해 DataAdapter 생성하기 DataRow 의 필드 참조하기 레코드 탐색 레코드 추가 , 편집 , 삭제하기 ADO.NET 예제 만들기. ADO .NET 소개. ADO .NET ADO(Active Data Object) 를 통해 만들어진 .NET 기반의 새로운 데이터베이스 기술
E N D
데이터베이스 사용하기 • ADO.NET 소개 • 데이터베이스 연결하기 • DataTable의 이해 • DataAdapter 생성하기 • DataRow의 필드 참조하기 • 레코드 탐색 • 레코드 추가, 편집, 삭제하기 • ADO.NET 예제 만들기
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에 속해있음
데이터베이스에 연결하기 • 데이터베이스에 접근하려면 ADO.NET Connection 객체 사용 • OleDbConnection 객체와 SqlConnection 객체 사용가능 • OleDbConnection 객체 초기화 OleDbConnection cnADONetConnection = new OleDbConnection(); • 데이터베이스 연결 상태 저장을 위한 모듈 변수 선언 OleDbConnection m_cnADONetConnection = new OleDbConnection(); • 데이터베이스 연결을 위해 ConnectionString에 데이터 원본 지정 • Provider의 이름, 사용자 이름, 패스워드 등의 연결 정보 저장
예제 데이터베이스에 연결하기 • 폼의 Load 이벤트에 다음 문장을 입력하여 ADO.NET 연결의 ConnectionString 속성 지정 • 예제 데이터베이스가 C:\Temp 폴더에 저장해놓은 것으로 가정 m_cnADONetConnection.ConnectionString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\temp\contacts.mdb"; • 위의 문장 다음에 아래 문장 추가 m_cnADONetConnection.Open();
데이터 원본의 연결 닫기 • 데이터 원본의 연결 객체 사용이 끝나면 항상 직접 닫아주어야 함 • Connection 객체의 Close() 메서드 사용 • 코드 창의 객체 드롭다운 목록에서 (frmMainEvents) 선택 • 이벤트 드롭다운 목록에서 FormClosing 을 선택하고, 이벤트에 다음 문장 입력 m_cnADONetConnection.Close(); m_cnADONetConnection.Dispose();
DataTables 이해하기 • DataTables • 데이터 원본의 데이터 복사본(Snapshot) 저장 • DataTable에서 변경한 모든 내용은 Update 메서드를 호출할 때까지 데이터의 로컬 복사본으로만 존재 • DataTable의 사용 과정 • DataTable의 내용을을 채우면서 시작 • 결과를 처리하고 • 변경 내용을 다시 데이터 원본에 저장
DataAdapter 만들기 • DataAdapter : DataTable 채우기 • 미리 정의해놓은 데이터 원본과의 연결을 사용하고, 별도로 작성한 질의문(Query)을 실행시키면 질의문의 결과가 DataTable에 채워짐 • DataAdapter 추가하기 • 모듈 수준의 변수를 생성하는 문장 바로 아래에 다음 문장 추가 OleDbDataAdapter cnADONetAdapter = new OleDbDataAdapter([CommandText],[Connection]); • 다음 구문을 m_cnADONewConnection 객체 선언문 바로 아래에 추가한다 OleDbDataAdapter m_daDataAdapter; • 다음 문장을 폼의 Load 이벤트 아래에 입력 m_daDataAdapter = new OleDbDataAdapter("Select * From Contacts",m_cnADONetConnection); • CommandBuilder의 모듈 수준 변수를 생성하기 위해 클래스 헤더에 다음 문장 입력 OleDbCommandBuilder m_cbCommandBuilder; • CommandBuilder 객체를 초기화하기 위해 Form_Load 이벤트 끝에 다음 문장 추가 OleDbCommandBuilder m_cbCommandBuilder = new OleDbCommandBuilder(m_daDataAdapter);
데이터 테이블 만들고 채우기 • 또 다른 모듈 수준의 변수를 생성하기 위해 클래스 헤더에 다음 문장을 추가하여 DataTable 변수 생성 DataTable m_dtContacts = new DataTable(); • 위의 코드 다음에 DataTable 내에서 사용자의 현재 위치(줄)를 추적하기 위한 정수형 변수를 다음과 같이 선언 int m_rowPosition = 0; • DataTable에 데이터를 채우기 위해, 폼의 Load 이벤트에서 기존 코드 아래에 다음 문장을 추가한다. m_daDataAdapter.Fill(m_dtContacts);
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");
데이터 테이블에서 현재 레코드 표시하기 • 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(); }
다음 문장을 Load 이벤트의 기존 문장 다음에 입력하여, 폼이 로드될 때 첫 번째 레코드가 표시되도록 함 this.ShowCurrentRecord(); • 데이터를 표시하기 위해서는 폼에 몇 가지 컨트롤을 추가해야 함. 새로운 텍스트 상자를 만들고, 속성을 다음과 같이 설정 • 폼에 두 번째 텍스트 상자를 추가하고 속성을 다음과 같이 설정 • <F5>를 눌러서 프로젝트를 실행시키고, 데이터가 표시되는 것 확인
레코드 살펴보기 • frmMain 폼에, 첫번째 레코드로 이동할 때 사용하기 위한 버튼을 추가하고 속성을 다음과 같이 설정 • 버튼을 더블클릭하고 버튼의 Click 이벤트에 다음 코드 추가 // 첫 번째 행으로 이동하고 데이터를 표시한다. m_rowPosition = 0; this.ShowCurrentRecord();
이전 레코드로 이동하기 위한 두 번째 버튼을 추가하고 속성을 다음과 같이 설정 • 두번째 버튼을 더블클릭하고 Click 이벤트에 다음 코드 추가 // 첫 번째 행이 아니면 한 행을 앞으로 이동하고 레코드를 표시한다. if (m_rowPosition != 0) { m_rowPosition--; this.ShowCurrentRecord(); }
DataTable에서 다음 레코드로 이동할 때 사용하기위한 세 번째 버튼을 폼에 추가하고 그 속성을 다음과 같이 설정 • 세 번째 버튼을 더블클릭하고, Click 이벤트에 다음 코드 입력 // 마지막 행이 아니면 한 행을 이동하고 레코드를 표시한다. if (m_rowPosition < m_dtContacts.Rows.Count-1) { m_rowPosition++; this.ShowCurrentRecord(); }
DataTable에서 마지막 레코드로 이동할 때 사용하기 위한 네 번째 버튼을 추가하고 속성을 다음과 같이 지정 • 네 번째 버튼을 더블클릭하고 Click 이벤트에 다음 코드 추가 if (m_dtContacts.Rows.Count != 0) { m_rowPosition = m_dtContacts.Rows.Count-1; this.ShowCurrentRecord(); }
레코드 편집하기 • DataAdapter의 Update()를 호출하여 변경된 내용의 DataTable을 전달할 때까지, 변경 내용은 원본 데이터 소스에 반영되지 않음 • 새로운 버튼을 추가하고, 버튼의 속성을 다음과 같이 설정 • 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); }
새로운 데이터 만들기 • DataTable에 새로운 레코드를 추가하려면 NewRow() 메서드를 호출하고, 컬럼에 값을 지정한 후, DataTable의 RowCollection에서 Add() 메서드 호출 • 폼에 그룹 상자를 추가하고, 속성을 다음과 같이 설정 • 그룹 상자에 텍스트 상자를 추가하고 속성을 다음과 같이 설정 • 두 번째 텍스트 상자를 그룹 상자에 추가하고, 속성을 다음과 같이 설정 • 그룹 상자에 버튼을 추가하고, 속성을 다음과 같이 설정 그룹상자 속성 첫번째 텍스트 상자 속성 두번째 텍스트 상자 속성 버튼 속성
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();
레코드 삭제하기 • 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(); }