12 장. ADO.NET ADO.NET 개요 데이터공급자데이터베이스연결 (Connection) 데이터베이스조작 (Command) 데이터읽기 (DataReader) DataTable, DataColumn, DataRow 클래스 DataAdapter 클래스와 DataSet 클래스 순천향대학교컴퓨터학부이상정 1 ADO.NET 개요 순천향대학교컴퓨터학부이상정 2
ADO.NET 소개 ADO.NET 기존 ADO(ActiveX Data Objects) 기술을바탕으로한닷넷기반의데이터베이스 API 다양한언어지원, XML지원, 비연결지향데이터베이스등진보된특징을추가 다양한데이터베이스시스템을단일방법으로검색, 수정, 업데이트등의작업을할수있으므로데이터베이스프로그램을쉽게개발 ADO.NET의주요구성요소 데이터공급자 (Data Provider) DataSet 순천향대학교컴퓨터학부이상정 3 ADO.NET 구성요소 DataSet 테이블의데이터를읽어서메모리에보관하는클래스 데이터베이스의내용을메모리데이터베이스 ( 데이터베이스사본 ) 형태로보유하고있으면서작업을수행하다필요할때데이터베이스를업데이트 데이터공급자 (Data Provider) 데이터베이스연결을포함하여데이터베이스에의접근을담당 Connection, Command, DataReader, DataAdapter 클래스를사용하여데이터베이스에접근 데이터베이스로부터읽어들인자료를 DataSet 클래스에전달 순천향대학교컴퓨터학부이상정 4
ADO.NET 데이터베이스접근 DataBase Data Provider ADO.NET Connection Command DataReader DataAdapter DataSet t 순천향대학교컴퓨터학부이상정 5 ADO.NET 네임스페이스 (1) 순천향대학교컴퓨터학부이상정 6
ADO.NET 네임스페이스 (2) System.Data 테이블, 행, 열, 제약조건, 데이터셋등을정의 System.Data.Common 데이터공급자사이에공유하는타입을정의 System.Data.OleDb OLEDB 를위한닷넷데이터공급자 OLEDB 데이터소스를액세스하는데사용되는클래스를제공 System.Data.SqlClient S SQL Server를위한닷넷데이터공급자 SQL Server 데이터베이스를액세스하는데사용되는클래스를제공 System.Data.SqlTypes SQL Server 에서사용하는고유한데이터타입지원 순천향대학교컴퓨터학부이상정 7 데이터공급자 순천향대학교컴퓨터학부이상정 8
데이터공급자 (Data Provider) 데이터베이스연결을포함하여데이터베이스에접근을담당 다양한데이터저장소들과통신하기위해사용 특정데이터저장소와통신하는방법을알고있는형식들의집합 데이터베이스와연결을하는 Connection 연결된상태에서 Command 를수행 쿼리의결과로서 DataReader 를사용 SqlClient 공급자 SQL Server 7.0 이상에서사용 OleDb 공급자 이전버전과기타데이터베이스를지원 순천향대학교컴퓨터학부이상정 9 SqlClient/OleDb 에서사용하는주요클래스 순천향대학교컴퓨터학부이상정 10
ADO.NET API를이용한데이터베이스조작절차 연결형 1 데이터소스에연결 (Connection) 데이터베이스들에일관된접근을수행 2 데이터베이스조작 (Command) 검색, 삽입, 수정, 삭제등의명령수행 3 데이터베이스불러오기 (DataReader) 명령의결과인데이터읽기를수행 비연결형 1 데이터소스에연결 (Connection) 2 데이터전송하기 (DataAdapter) 데이터베이스로부터 DataSet에값을채우거나필요할때데이터베이스로업데이트가능 순천향대학교컴퓨터학부이상정 11 데이터베이스연결 (Connection) 순천향대학교컴퓨터학부이상정 12
Connection 클래스 Connection 클래스 데이터베이스데이터를처리하기위해서는먼저응용프로그램이데이터베이스에연결되어야하는데이러한기능을처리하는클래스 SqlClient 공급자를이용하여 Connection 을설정 OleDb 공급자를이용하여 Connection 을설정 순천향대학교컴퓨터학부이상정 13 SqlClient 공급자 Connection 설정 1. 네임스페이스명시 using System.Data.SqlClient; 2. Connection 객체생성 : 생성자에연결속성설정 SqlConnection conn; conn=new SqlConnection("Server=localhost; user id=sa; 3. Connecton 연결 conn.open(); 4. 작업수행 SQL 쿼리작업 5. 연결해제 conn.close(); password=; database=northwind"); 순천향대학교컴퓨터학부이상정 14
OleDb 공급자 Connection 설정 1. 네임스페이스명시 using System.Data.OleDb; 2. Connection 객체생성 : 생성자에연결속성설정 OleDbConnection conn; conn = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0; Data Source=test.mdb"); 3. Connecton 연결 conn.open(); 4. 작업수행 SQL 쿼리작업 5. 연결해제 conn.close(); 순천향대학교컴퓨터학부이상정 15 Connection 클래스생성자 SqlClient 공급자를이용하여연결할때생성자 OleDb 공급자를이용하여연결할때생성자 순천향대학교컴퓨터학부이상정 16
Connection 클래스의주요속성 순천향대학교컴퓨터학부이상정 17 SQL Server ConnectionString 사용방법 다음은모두같은의미를갖는연결문자열 순천향대학교컴퓨터학부이상정 18
OLEDB ConnectionString 사용방법 순천향대학교컴퓨터학부이상정 19 Connection 클래스멤버메서드 Connection 클래스에서는데이터베이스연결과관련된여러메서드를제공 Connection 클래스의주요메서드 순천향대학교컴퓨터학부이상정 20
데이터베이스조작 (Command) 순천향대학교컴퓨터학부이상정 21 Command 클래스 Command 클래스 데이터베이스와연결한후, DB로필요한명령을전달하거나그결과를받아올때사용하는클래스 SqlCommand, OleDbCommand SqlCommand, OleDbCommand 에서사용할수있는명령 DLL(Data Definition Language) 명령 SELECT, CREATE, ALERT, DROP DCL(Data Control Language) 명령 GRANT, DENY, REVOKE DML(Data Modification Language) 명령 INSERT, UPDATE, DELETE 순천향대학교컴퓨터학부이상정 22
Command 클래스의주요속성 순천향대학교컴퓨터학부이상정 23 Command 클래스생성자 SqlClient 공급자를이용하여연결할때생성자 OleDb 공급자를이용하여연결할때생성자 인수 commandtext에는실행할쿼리문이나저장프로시저를지정 인수 connection 에는 Connection 객체를지정 인수 transaction에는 Transaction 객체를지정 순천향대학교컴퓨터학부이상정 24
Command 클래스주요메서드 순천향대학교컴퓨터학부이상정 25 CreateParameter 메서드 매개변수를사용하는쿼리문이나저장프로시저를위해매개변수를지정할수있는 Parameter 객체를생성할때사용 ADO.NET 에서는 Command 객체에서 Parameter 객체를자주사용 OLEDB 에서 CreateParameter 메서드의사용예 순천향대학교컴퓨터학부이상정 26
쿼리실행관련메서드 ExecuteNonQuery 메서드 DB 내용을변경할때사용하는메서드 쿼리문명령이실행되어영향을받은레코드수를반환 Insert, Update, Delete 등대부분의쿼리문에사용 ExecuteReader 메서드 Select 쿼리문을수행할때사용 DataReader 형태로결과를제공 SqlClient 공급자의경우 SqlDataReader 를생성 OleDb의경우 OleDbDataReader를생성 ExecuteScalar 메서드 반환되는결과값이하나일때사용 반환값이아무리많더라도첫번째데이터만반환 object 형으로반환하기때문에적당히캐스팅 순천향대학교컴퓨터학부이상정 27 예제 12-1: 1 ExecuteNonQuery 사용예 마이크로소프트오피스의 Access(OleDb 공급자 ) 에서 ExecuteNonQuery 메서드를사용하여테이블 (Address) 을생성한후레코드를삽입하는예제 프로그램실행전에 Access 사용하여빈데이터베이스파일생성 C: 디렉토리에 Access 2002-2003 형식파일 ado.mdb 생성 SQL 쿼리 create 명령으로 Address 테이블생성하고, insert 명령으로레코드를테이블에삽입 필드는 id, name, addr 3 개 프로그램코드순서 1. Connection 생성과오픈 2. Command 생성 3. Command 수행 4. Connection 닫기 순천향대학교컴퓨터학부이상정 28
빈 Access 파일생성 순천향대학교컴퓨터학부이상정 29 예제12-1: 1 소스 (1) using System; using System.Data; using System.Data.OleDb; namespace Ex12_1_ExNonQuery class Program static void Main(string[] args) //////// OleDb 공급자 string constr = @"Provider = Microsoft.Jet.OLEDB.4.0; Data Source=C: source ado.mdb"; // @ 는문자열상수에서특수문자를무시, 즉, 를문자자체로읽음, 교재 p.154 참조 string createquery ="create table Address ( id int, name char(20), addr char(40))"; string query1 = "Insert into Address values (1, ' 이주형 ', ' 서울시 ')"; string query2 = "Insert into Address values (2, ' 이정민 ', ' 부산시 ')"; string query3 ="Insert into Address values (3, ' 조해원 ', ' 광주시 ')"; ); string query4 = "Insert into Address values (4, ' 최병덕 ', ' 대구시 ')"; string query5 = "Insert into Address values (5, ' 박인상 ', ' 대전시 ')"; Console.WriteLine( WriteLine("1. Connection 생성과오픈 "); OleDbConnection conn = new OleDbConnection(conStr); conn.open(); 순천향대학교컴퓨터학부이상정 30
예제12-1: 1 소스 (2) Console.WriteLine("2. Command 생성 "); OleDbCommand comm = new OleDbCommand(createQuery, conn); OleDbCommand comm1 = new OleDbCommand(query1, conn); OleDbCommand comm2 = new OleDbCommand(query2, conn); OleDbCommand comm3 = new OleDbCommand(query3, conn); OleDbCommand comm4 = new OleDbCommand(query4, conn); OleDbCommand comm5 = new OleDbCommand(query5, conn); Console.WriteLine("3. Command 수행 "); comm.executenonquery(); comm1.executenonquery(); comm2.executenonquery(); comm3.executenonquery(); comm4.executenonquery(); comm5.executenonquery(); Console.WriteLine("4. Connection 닫기 "); conn.close(); 순천향대학교컴퓨터학부이상정 31 실행결과 순천향대학교컴퓨터학부이상정 32
데이터읽기 (DataReader) 순천향대학교컴퓨터학부이상정 33 DataReader 클래스 DataReader 클래스 데이터베이스에있는내용을불러오는역할을담당 검색된결과만을가져오는읽기전용클래스 SQL 서버용 (SqlDataReader), OLEDB용 (OleDbDataReader) DataReader 객체는 Command 객체의 ExecuteReader 메서드로생성 OleDbDataReader 객체를얻는과정 순천향대학교컴퓨터학부이상정 34
데이터공급자 (Data Provider) 데이터베이스연결을포함하여데이터베이스에접근을담당 다양한데이터저장소들과통신하기위해사용 특정데이터저장소와통신하는방법을알고있는형식들의집합 데이터베이스와연결을하는 Connection 연결된상태에서 Command 를수행 쿼리의결과로서 DataReader 를사용 SqlClient 공급자 SQL7.0서버이상에서사용 OleDb 공급자 이전버전과기타데이터베이스를지원 순천향대학교컴퓨터학부이상정 35 SqlClient/OleDb 에서사용하는주요클래스 순천향대학교컴퓨터학부이상정 36
ADO.NET API를이용한데이터베이스조작절차 연결형 1 데이터소스에연결 (Connection) : 데이터베이스들에일관된접근을수행 2 데이터베이스조작 (Command) : 검색, 삽입, 수정, 삭제등의명령수행 3 데이터베이스불러오기 (DataReader) : 명령의결과인데이터읽기를수행 비연결형 1 데이터소스에연결 (Connection) 2 데이터전송하기 (DataAdapter) : 데이터베이스로부터 DataSet에값을채우거나필요할때데이터베이스로업데이트가능 순천향대학교컴퓨터학부이상정 37 DataReader 클래스의주요속성 FieldCount 쿼리문이반환한레코드셋 ( 결과 ) 의칼럼 ( 필드 ) 수를반환 순천향대학교컴퓨터학부이상정 38
RecordsAffected 속성 RecordsAffected 데이터베이스에서변화된레코드의개수를알아내고싶을때사용 Insert, Update, Delete문을사용하면변경된레코드의개수를반환 Select 문을사용할경우에는 -1 을반환 순천향대학교컴퓨터학부이상정 39 Item 속성 Item 레코드필드를표현하는방법 인덱서를제공하며 read[ 서수 ], read[ 필드명 ] 두가지형식으로사용 순천향대학교컴퓨터학부이상정 40
DataReader 클래스주요메서드 순천향대학교컴퓨터학부이상정 41 예제 12-2: 2 DataReader 사용예 DataReader 클래스를사용하여예제 12-11 에서만들어진 ado.mdb 데이터베이스의 Address 테이블을읽어서출력하는예 실행결과 순천향대학교컴퓨터학부이상정 42
using System; using System.Data.OleDb; namespace Ex12_2_ExReader class Program static void Main(string[] args) ////// OleDb 공급자 string constr = @"Provider = Microsoft.Jet.OLEDB.4.0; Data Source =C: ado.mdb"; string query = "select * from Address"; OleDbConnection conn = new OleDbConnection(conStr); conn.open(); OleDbCommand comm = new OleDbCommand(query, conn); OleDbDataReader sr = comm.executereader(); while (sr.read()) Console.WriteLine(sr.GetInt32(0) +" " +sr.getstring(1).trim() +" " +sr.getstring(2)); // string 클래스의 Trim 메서드는문자열앞뒤의공백문자제거, 교재 p.158 참조 sr.close(); conn.close(); 순천향대학교컴퓨터학부이상정 43 예제 12-3: DataReader 사용예 ( 윈도우즈응용 ) DataReader 클래스를사용한윈도우즈응용예 예제 12-1에서만들어진 ado.mdb 데이터베이스에새테이블 address1 을생성 아래와같이 DB 에연결하고, 텍스트박스에 SQL 쿼리를입력하면쿼리의결과가출력되는예 순천향대학교컴퓨터학부이상정 44
Access 테이블디자인 순천향대학교컴퓨터학부이상정 45 Access 기본키, 테이블저장 순천향대학교컴퓨터학부이상정 46
Access 데이터입력 순천향대학교컴퓨터학부이상정 47 컨트롤을배치하고속성을설정 순천향대학교컴퓨터학부이상정 48
도구상자에새항목추가 OleDbConnect, OleCommand, OleDbDataAdapter 컨트롤을도구상자에추가 순천향대학교컴퓨터학부이상정 49 OleDbConnection, OleCommand 속성설정 순천향대학교컴퓨터학부이상정 50
DB 연결 버튼 [Click] 이벤트처리기 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Data.OleDb; // 추가 private void button1_click(object sender, EventArgs e) try oledbconnection1.open(); // 데이터베이스에연결 button1.text = " 연결성공 "; catch (Exception ex) MessageBox.Show(ex.StackTrace, " 연결오류 "); 순천향대학교컴퓨터학부이상정 51 명령실행 버튼 [Click] 이벤트처리기 (1) private void button3_click(object sender, EventArgs e) string ti sql = textsql.text.trim().toupper(); tsql t T T (); // 앞뒤공백제거 try if (sql.startswith("select")) //select 문으로시작하는경우 oledbcommand1.commandtext = sql; OleDbDataReader read = oledbcommand1.executereader(); textoutput.text = ""; // 필드이름을구하고출력창에헤드출력 for (int i = 0; i < read.fieldcount; i++) textoutput.text = textoutput.text + read.getname(i) + " "; textoutput.text = textoutput.text +" r n"; // 레코드를하나씩 read while (read.read()) // 필드값들을구함 for (int i = 0; i < read.fieldcount; i++) textoutput.text = textoutput.text + read[i] + " "; // 출력창에결과출력 textoutput.text = textoutput.text + " r n"; 순천향대학교컴퓨터학부이상정 52
명령실행 버튼 [Click] 이벤트처리기 (2) else // select 이외의명령일경우 oledbcommand1.commandtext = sql; oledbcommand1.executenonquery(); textoutput.text = " 명령을성공적으로수행 "; catch (Exception ex) MessageBox.Show(ex.StackTrace, " 명령오류 "); 종료 버튼 [ 클릭 ] 이벤트처리기 private void button2_click(object sender, EventArgs e) this.close(); 순천향대학교컴퓨터학부이상정 53 DataTable, DataColumn, DataRow 클래스 순천향대학교컴퓨터학부이상정 54
DataSet 의계층구조 순천향대학교컴퓨터학부이상정 55 DataTable 클래스 DataTable 클래스 메모리에있는데이터로구성된테이블 ADO.NET 라이브러리의중심객체 SqlClient나 OleDb 네임스페이스에있는타입과 DataSet을사용해생성 DataSet 및 DataView도 DataTable 을사용 순천향대학교컴퓨터학부이상정 56
DataTable 클래스생성자 Member 라는이름의새테이블을생성하는코드 순천향대학교컴퓨터학부이상정 57 DataTable 클래스의주요속성및메서드 순천향대학교컴퓨터학부이상정 58
DataTable 클래스사용예 DataTable 객체를만들고그이름을 "Customers" 로지정 DataSet t 의 Tables 컬렉션에 DataTable 객체를추가 순천향대학교컴퓨터학부이상정 59 DataColumn 클래스 DataColumn 클래스 DataTable의스키마 ( 열들의이름, 타입등 ) 를만들기위한기본요소 DataColumnCollection에하나이상의 DataColumn 객체를추가하여스키마를생성 DataColumn 에포함되는데이터의종류를결정하는 DataType 속성을명시 순천향대학교컴퓨터학부이상정 60
DataColumn 클래스생성자 user 칼럼을만들고타입을 System.String St 형으로지정 순천향대학교컴퓨터학부이상정 61 DataColumn 클래스의주요속성및메서드 (1) 데이터베이스테이블의각필드의상태와제약조건등을표현할수있는다양한속성들을제공 순천향대학교컴퓨터학부이상정 62
DataColumn 클래스의주요속성및메서드 (2) 순천향대학교컴퓨터학부이상정 63 DataColumn 클래스의사용예 칼럼이름을 User 로, 칼럼타입은문자열로설정 칼럼이름을 NUM 으로설정하고자동증가속성을설정 순천향대학교컴퓨터학부이상정 64
DataRow 클래스 DataRow 클래스 DataTable 테이블에 DataColumn 속성을사용해새로운레코드 (Row) 를추가하거나기존레코드를수정, 갱신, 삭제할때사용 DataRowCollection 은 DataTable 에있는실제 DataRow 객체를나타냄 DataRow 클래스생성자 새 DataRow 객체를만들려면생성자를직접사용할수없고 DataTable 객체의 NewRow 메서드를사용 객체를만든후 Add 메서드를사용하여 DataRowCollection 에추가 순천향대학교컴퓨터학부이상정 65 DataRow 클래스의주요속성및메서드 순천향대학교컴퓨터학부이상정 66
DataRowState 열거형 DataRow 객체의상태를표시할때사용 순천향대학교컴퓨터학부이상정 67 예제 12-4: DataTable이 DataColumn 과 DataRow 를사용하는예제 using System; using System.Data; // DataTable, DataColumn, DataRow를사용하기위해추가 namespace Ex12_4_DataTableEx class Program private void MakeTable() // DataTable 객체를생성 DataTable mytable = new DataTable("myTable"); // DataColumn 객체를생성하고속성들을정의 DataColumn mycolumn1 = new DataColumn(); mycolumn1.datatype = System.Type.GetType("System.String"); mycolumn1.allowdbnull = false; mycolumn1.caption Caption = "Name"; mycolumn1.columnname = "Name"; mycolumn1.defaultvalue = ""; // 테이블에첫번째칼럼을추가 mytable.columns.add(mycolumn1); 순천향대학교컴퓨터학부이상정 68
예제 12-4: DataTable 소스 (1) // DataColumn 객체를생성하고속성들을정의 DataColumn mycolumn2 = new DataColumn(); mycolumn2.datatype = System.Type.GetType("System.Decimal"); mycolumn2.allowdbnull = false; mycolumn2.caption = "Price"; mycolumn2.columnname C l = "Price"; " mycolumn2.defaultvalue = 25; // 테이블에두번째칼럼을추가한다. mytable.columns.add(mycolumn2); l C l // 10개의행을추가하고값을넣는다. DataRow myrow; for (int i = 0; i < 10; i++) myrow = mytable.newrow(); // 새행객체를생성 myrow["name"] = "name" + i; // Name 값 myrow["price"] "] = i + 1000; // Price 값 mytable.rows.add(myrow); // 행추가 PrintTable(myTable, "Name", "Price"); 순천향대학교컴퓨터학부이상정 69 예제 12-4: DataTable 소스 (2) private void PrintTable(DataTable t, string label1, string label2) // 테이블에있는행들의값을출력 Console.WriteLine(" n" " + label1 l1 + " " + label2); l2) for (int i = 0; i < t.rows.count; i++) Console.WriteLine(t.Rows[i]["Name"] + " " + t.rows[i]["price"]); Console.WriteLine(); static ti void Main(string[] i args) Program table = new Program(); table.maketable(); 순천향대학교컴퓨터학부이상정 70
예제 12-4: 실행결과 순천향대학교컴퓨터학부이상정 71 DataView 클래스 DataView 클래스 DataTable 클래스에보관되어있는데이터들을기초로정렬이나데이터필터링, 데이터검색등을위해사용할수있는클래스 DataView 객체는데이터베이스에실제로존재하는테이블이아니라필요할때메모리에생겼다가소멸되는가상테이블 DataTable 로부터특정필드와레코드정보를가져올때사용 DataView 클래스의생성자 순천향대학교컴퓨터학부이상정 72
DataView 클래스의주요속성및메서드 순천향대학교컴퓨터학부이상정 73 예제 12-5: DataView 클래스사용예 행이 4개의열 ( 이름, 국어, 영어, 수학 ) 로구성된 DataTable을만들고테이블에몇개의행을입력시킨다음테이블에서어떤조건을만족하는행들을 DataView 객체로만들어 DataGrid 컨트롤에출력하는프로그램 컨트롤을배치하고속성을설정 순천향대학교컴퓨터학부이상정 74
Form1.cs, Form1() 생성자소스 public partial class Form1 : Form DataTable tbl; public Form1() InitializeComponent(); tbl = new DataTable("grade"); // grade 테이블생성 DataColumn column; // 칼럼객체참조 // 이름칼럼만들기 column = new DataColumn(); column.datatype = Type.GetType("System.String"); column.columnname = "Name"; // 칼럼이름설정 column.allowdbnull= false; // 널값허용안함 tbl.columns.add(column); // 테이블에칼럼추가 // 국어칼럼만들기 column = new DataColumn(); column.datatype = Type.GetType("System.Int32"); y column.columnname = "Kor"; // 칼럼이름 column.allowdbnull = false; // 널값허용안함 tbl.columns.add(column); // 테이블에칼럼추가 순천향대학교컴퓨터학부이상정 75 // 데이터형을 string 으로지정 // 데이터형을정수형으로지정 객체지향윈도즈프로그래밍 // 영어칼럼만들기, Visual C# column = new DataColumn(); column.datatype = Type.GetType("System.Int32"); // 데이터형을정수형으로지정 column.columnname l = "Eng";" // 칼럼이름 column.allowdbnull = false; // 널값허용안함 tbl.columns.add(column); // 테이블에칼럼추가 // 수학칼럼만들기 column = new DataColumn(); column.datatype = Type.GetType("System.Int32"); // 데이터형을정수형으로지정 column.columnname = "Math"; // 칼럼이름 column.allowdbnull ll = false; // 널값허용안함 tbl.columns.add(column); // 테이블에칼럼추가 // 평균칼럼만들기 column = new DataColumn(); column.datatype = Type.GetType("System.Double"); // 데이터형을 double형으로지정 column.columnname = "Avg"; // 칼럼이름 column.allowdbnull = false; // 널값허용안함 tbl.columns.add(column); l l // 테이블에칼럼추가 DataRow row; // 새레코드추가하기 row = tbl.newrow(); row["name"] = " 이주형 "; row["kor"] = 95; row["eng"] = 80; row["math"] = 85; row["avg"] = (95 + 80 + 85) / 3.0; tbl.rows.add(row); 순천향대학교컴퓨터학부이상정 76
row = tbl.newrow(); row["name"] = " 이정민 "; row["kor"] = 90; row["eng"] = 75; row["math"] = 90; row["avg"] = (90 + 75 + 90) / 3.0; tbl.rows.add(row); row = tbl.newrow(); row["name"] = " 최병덕 "; row["kor"] = 80; row["eng"] = 95; row["math"] = 90; row["avg"] = (80 + 95 + 90) / 3.0; tbl.rows.add(row); row = tbl.newrow(); row["name"] = " 조해원 "; row["kor"] = 100; row["eng"] = 90; row["math"] = 90; row["avg"] = (100 + 90 + 90) / 3.0; tbl.rows.add(row); datagrid1.datasource = tbl; //datagrid1 과데이터테이블을연결 순천향대학교컴퓨터학부이상정 77 뷰보기 버튼의 [Click] 이벤트처리기추가 데이터테이블에대해 2 개의뷰객체를생성하고원하는조건에맞는행을데이터그리드에출력시키는코드를입력 private void button1_click(object sender, EventArgs e) DataView view1 = new DataView(this.tbl); DataView view2 = new DataView(this.tbl); // 뷰1 생성 // 뷰2 생성 view1.rowfilter = "Kor >= 90"; // 국어가 90 점이상인행 view2.rowfilter = "Avg >= 85 And Eng >= 90"; // 평균 85이상이고영어 90이상인행 datagrid2.datasource = view1; //datagrid2과데이터뷰1을연결, 그리드에출력 datagrid3.datasource t = view2; //datagrid3 과데이터뷰 2 를연결 순천향대학교컴퓨터학부이상정 78
실행결과 순천향대학교컴퓨터학부이상정 79 DataAdapter 클래스와 DataSet 클래스 순천향대학교컴퓨터학부이상정 80
DataAdapter, DataSet 기능소개 DataSet 과 DataAdapter 는데이터베이스의과부하문제의해결책으로제시된닷넷의새로운아키텍처 DataAdapter 의기능 데이터베이스의 Connection으로부터 DataSet을생성하는중간역할을담당 DataSet 을채우고데이터소스를업데이트하는데사용되는 SQL 명령집합및데이터베이스연결 DataSet 의기능 데이터베이스의데이터를메모리로캐시 ( 메모리상의데이터베이스 ) 해두고실제데이터베이스와는연결을끊는다. 프로그램에서는주로 DataSet 을사용하기때문에데이터베이스의접근을줄일수있다. 순천향대학교컴퓨터학부이상정 81 연결지향과비연결지향의차이점 Command로작업할때에는데이터베이스와연결된상태에서작업 DataAdapter로작업을할경우에는 DataSet이라는결과를얻은후에데이터베이스와의연결을끊고, DataSet 자체만으로도작업을수행 작업이끝난후에는 DatatAdapter를통해 DataSet의변경된부분을실제데이터베이스에반영가능 순천향대학교컴퓨터학부이상정 82
DataAdapter 클래스 DataAdapter 는 DataSet 및데이터소스를연결시키는역할을하며데이터를검색하고저장하는데사용 DataAdapter 클래스객체생성 OLEDB 의경우 순천향대학교컴퓨터학부이상정 83 DataAdapter 클래스의주요속성과메서드 DataAdapter 를사용할때입력 / 수정 / 삭제 / 조회에해당하는각각의 Command 객체를사용 순천향대학교컴퓨터학부이상정 84
DataSet 클래스 DataSet 은여러개의 DataTable 로구성 DataTable의구성요소 DataRow( 행에대한정보 ) DataColumn( 열에대한정보 ) Constraint( 값을제어하는규약 ) DataRelation( 두테이블간에관계 ) DataSet 클래스생성자 순천향대학교컴퓨터학부이상정 85 DataSet 클래스의주요속성과메서드 순천향대학교컴퓨터학부이상정 86
DataAdapter 와 DataSet 생성절차 1. Connection 생성 OleDbConnection conn; conn = new OleDbConnection(@"Provider = Microsoft.Jet.OLEDB.4.0; Data Source =C: ado.mdb"); Conn.Open(); 2. DataAdapter 생성 OleDbDataAdapter adapter = new OleDbDataAdapter(); 3. SqlCommand 할당 adapter.selectcommand = new OleDbCommand(sql, conn); 4. DataSet 생성 DataSet ds = new DataSet(); adapter.fill(ds); // SelectCommand 속성에지정된 SELECT 문을사용하여 // 데이터베이스검색하여채움 5. 작업수행 6. 연결닫기 conn.close(); 순천향대학교컴퓨터학부이상정 87 예제 12-6: DataAdapter 와 DataSet 사용예 DataAdapter, DataSet 클래스를사용하여예제 12-11 에서만들어진ado.mdb 데이터베이스의 Address 테이블을읽어서출력하는예 실행예 순천향대학교컴퓨터학부이상정 88
using System; using System.Data; using System.Data.OleDb; namespace Ex12_6_DAdapterDSetEx class Program static void Main(string[] args) string constr = @"Provider = Microsoft.Jet.OLEDB.4.0; Data Source =C: ado.mdb"; string query = "select * from Address"; Console.WriteLine("1.Connection 생성과 Open"); OleDbConnection conn = new OleDbConnection(conStr); conn.open(); Console.WriteLine("2.OleDbDataAdapter 생성 "); OleDbDataAdapter adapter = new OleDbDataAdapter(); Console.WriteLine("3.Adapter 에 SelectCommand 할당 "); adapter.selectcommand = new OleDbCommand(query, conn); Console.WriteLine("4.DataSet 생성 "); DataSet ds = new DataSet(); Console.WriteLine("5.Adapter 를통해서 DataSet 채우기 "); adapter.fill(ds); Console.WriteLine("6.Connection 닫기 "); conn.close(); 순천향대학교컴퓨터학부이상정 89 예제 12-6: 소스 Console.WriteLine("7.DataSet 으로작업하기 "); DataTable table = ds.tables[0]; DataRowCollection rows = table.rows; foreach (DataRow dr in rows) for (int i = 0; i < table.columns.count; i++) Console.Write("0, 15", dr[i]); //,15 는출력되는너비지정 Console.WriteLine(); 순천향대학교컴퓨터학부이상정 90
예제 12-7: DataAdapter와 DataSet 사용예 1 ( 윈도우응용 1) Access ado.mdb 데이터베이스에서생성된 diary 테이블의내용을입출력하는프로그램 실행예 순천향대학교컴퓨터학부이상정 91 Access 테이블디자인 순천향대학교컴퓨터학부이상정 92
컨트롤배치 (1) 순천향대학교컴퓨터학부이상정 93 컨트롤배치 (2) 순천향대학교컴퓨터학부이상정 94
TabControl 속성 tabcontrol1 컨트롤의 [TabPages] 컬렉션으로 tabpage1,tabpage2 추가 순천향대학교컴퓨터학부이상정 95 객체지향윈도즈프로그래밍 using System;, Visual C# using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Data.OleDb; // OleDb 네임스페이스 using System.Drawing; using System.Text; using System.Windows.Forms; Form1.cs 코드추가 namespace Ex12_7_WinDbEx1 public partial class Form1 : Form // DataAdapter, DataSet 선언 OleDbDataAdapter adapter; DataSet ds; public Form1() InitializeComponent(); string constr = @"Provider = Microsoft.Jet.OLEDB.4.0; Data Source =C: ado.mdb"; string sel_query = "select * from diary"; // DataAdapter 생성 adapter = new OleDbDataAdapter(sel_query,conStr); // selectcommand, 연결초기화 // DataSet 생성 ds =newdataset(); 순천향대학교컴퓨터학부이상정 96
종료, 출력 버튼 [Click] 이벤트처리기 테이블출력 버튼의 Click 이벤트처리기추가 데이터세트의내용채우기위해 oledbdataadapter의 Fill 함수를호출 데이터그리드와테이블연결 private void btn_exit_click(object sender, EventArgs e) Close(); // this.close private void btn_print_click(object sender, EventArgs e) ds.clear(); adapter.fill(ds,"diary"); // 데이터세트의내용채우기, 소스테이블이름지정 datagridview1.datasource = ds.tables[ diary ]; // 데이터그리드와테이블연결 // Fill 에서지정된이름사용 순천향대학교컴퓨터학부이상정 97 입력 버튼 [Click] 이벤트처리기 private void btn_input_click(object sender, EventArgs e) try // 추가, 수정, 삭제시에필요한명령을자동으로생성해주는객체 OleDbCommandBuilder mycommandbuilder = new OleDbCommandBuilder(adapter); ds.clear(); adapter.fill(ds,"diary"); // 데이터세트의내용채우기 DataTable tbl = ds.tables["diary"]; DataRow row = tbl.newrow(); w(); row["name"] = txtname.text; row["age"] = byte.parse(txtage.text); row["phone"] = txtphone.text; row["address"] = txtaddr.text; row["email"] = txtemail.text; tbl.rows.add(row); adapter.update(ds,"diary"); catch (Exception ex) MessageBox.Show(ex.Message); 순천향대학교컴퓨터학부이상정 98
예제 12-8: DataAdapter와 DataSet 사용예 2 ( 윈도우응용 2) Access ado.mdb 데이터베이스에서생성된 diary 테이블의내용을입출력하는프로그램 OleDbConnection, OleDbDataAdapter 컨트롤사용 데이터어댑터구성마법사 쿼리작성기 실행예 순천향대학교컴퓨터학부이상정 99 컨트롤배치 (1) 순천향대학교컴퓨터학부이상정 100
컨트롤배치 (2) 순천향대학교컴퓨터학부이상정 101 컨트롤배치 (3) 순천향대학교컴퓨터학부이상정 102
OleDbConnection 컨트롤속성 속성창에서 [ConnectionString] 을선택한후 < 새연결 > 을클릭한다음에 [ 연결추가 ] 창이뜨면데이터베이스와연결 순천향대학교컴퓨터학부이상정 103 OleDbDataAdapter 컨트롤속성 (1) OleDbDataAdapter 을도구상자에서폼에끌어다놓으면자동으로마법사가시작 순천향대학교컴퓨터학부이상정 104
OleDbDataAdapter 컨트롤속성 (2) SQL 문생성 과정에서 [ 쿼리작성기 ] 를클릭하면나오는 테이블추가 대화상자에서현재연결된데이터베이스에서사용할테이블 (diary) 을추가한다음 [ 추가 ] 와 [ 닫기 ] 버튼을연속으로클릭 순천향대학교컴퓨터학부이상정 105 OleDbDataAdapter 컨트롤속성 (3) 쿼리작성기 대화상자에 SELECT diary.* From diary 를입력후 [ 확인 ] 을클릭 순천향대학교컴퓨터학부이상정 106
DataSet 추가 oledbdataadapter1 을선택하고오른쪽마우스버튼을클릭하면나타나는팝업창에서 [ 데이터집합생성 ] 을클릭하면나타나는 [ 데이터집합생성 ] 대화상자에서 [ 새로만들기 ] 를선택하고 DataSet1" 을입력하고,[ 데이터집합에추가할테이블선택 ] 에서 "diary" 를선택하여데이터베이스와 DataSet을연결 순천향대학교컴퓨터학부이상정 107 DataSet 추가결과 순천향대학교컴퓨터학부이상정 108
OleDbCommand(oledb_cmd) 컨트롤 oledb_cmd 의속성창을선택하고 [Connection] 속성을 oledb_conn 으로설정 [CommandText] 속성에서버튼을클릭해서 INSERT INTO diary(na me, age, phone, address, email)values(?????) (?,?,?,?,?) 문을입력 순천향대학교컴퓨터학부이상정 109 OleDbCommand(oledb_select) 컨트롤 oledb_select 의속성창을선택하고 [Connection] 속성을 oledb_conn 으로설정 [CommandText] 속성에서버튼을클릭해서 SELECT *.diary FR OM diary 문을입력 순천향대학교컴퓨터학부이상정 110
OleDbDataAdapter 컨트롤속성지정 oledbdataadapter1 을선택하고속성창 [InsertCommand] 부분을 oledb_cmd 지정 [SelectCommand] 부분도 oledb_select 로지정 순천향대학교컴퓨터학부이상정 111 datagridview 컨트롤속성지정 datagridview1 속성창에서 [DataSource] 를 DataSet1.diary로선택하여하여DataSet객체와 DataGrid를연결 순천향대학교컴퓨터학부이상정 112
폼 [Load], 종료 버튼 [Click] 이벤트처리기 Load 이벤트처리기 폼이시작하여메모리에적재될때발생하는이벤트 폼선택하여마우스로더블클릭해서다음코드를입력 데이터베이스연결작업과 datagridview1 부분에값을출력하기위해서 oledbdataadapter1의 Fill 함수를사용 private void Form1_Load(object sender, EventArgs e) oledb_conn.open(); // 데이터베이스에연결 oledbdataadapter1.fill(dataset11); // 데이터셋의내용을그리드에출력 프로그램종료 버튼이벤트처리기 private void btn_exit_click(object sender, EventArgs e) Close(); // this.close() 순천향대학교컴퓨터학부이상정 113 출력 버튼 [Click] 이벤트처리기 테이블출력 버튼의 Click 이벤트처리기추가 테이블이갱신되도록 oledbdataadapter의 Fill 함수를호출 private void btn_print_click(object sender, EventArgs e) oledbdataadapter1.fill(dataset11); // 데이터세트의내용을그리드에출력 순천향대학교컴퓨터학부이상정 114
입력 버튼 [Click] 이벤트처리기 입력 버튼의 Click 이벤트처리기추가 여러텍스트박스에서입력한정보를데이터베이스에입력 private void btn_input_click(object sender, EventArgs e) try oledbdataadapter1.insertcommand.parameters[0].value = txtname.text; oledbdataadapter1.insertcommand.parameters[1].value = byte.parse(txtage.text); oledbdataadapter1.insertcommand.parameters[2].value = txtphone.text; oledbdataadapter1.insertcommand.parameters[3].value = txtaddr.text; oledbdataadapter1.insertcommand.parameters[4].value = txtemail.text; oledbdataadapter1.insertcommand.executenonquery(); catch (Exception ex) MessageBox.Show(ex.Message); 순천향대학교컴퓨터학부이상정 115 실행결과 순천향대학교컴퓨터학부이상정 116
과제 12: 리스트뷰주소록완결 과제 9의리스트뷰를사용한주소록프로그램에직렬화-역직렬화를사용하여주소록을파일에저장하는대신데이터베이스에연결하도록수정 DB 추가버튼 : 리스트뷰와데이터베이스에추가 DB 삭제버튼 : 선택된항목 (1개) 을리스트뷰와데이터베이스에서삭제 DB 열기버튼 : 데이터베이스연결하여리스트부항목을채움 순천향대학교컴퓨터학부이상정 117 과제 12: 힌트 (1) DB 추가 adapter.fill(ds, "ADDR_CARD CARD"); DataTable tbl = ds.tables["addr_card"]; DataRow row = tbl.newrow(); row["name"] = textbox1.text; tbl.rows.add(row); adapter.update(ds, "ADDR_CARD"); // 데이터세트의내용채우기 순천향대학교컴퓨터학부이상정 118
과제 12: 힌트 (2) DB 삭제 adapter.fill(ds, "ADDR_CARD"); // 데이터세트의내용채우기 foreach (ListViewItem item in listview1.selecteditems) tbl.rows[item.index].delete(); listview1.items.removeat(item.index); adapter.update(ds.getchanges(datarowstate.deleted), "ADDR_CARD"); 순천향대학교컴퓨터학부이상정 119 과제 12: 힌트 (3) DB 열기 adapter.fill(ds, "ADDR_CARD"); // 데이터세트의내용채우기 DataTable tbl = ds.tables["addr_card"]; for (int i = 0; i < tbl.rows.count; i++) ListViewItem item = new ListViewItem((string) tbl.rows[i]["name"], 0); item.subitems.add((string)tbl.rows[i]["address"]);"); 순천향대학교컴퓨터학부이상정 120