17 장 . ADO.NET

48
C# 17 장 . ADO.NET

description

C#. 17 장 . ADO.NET. DB 사용하기 위한 방법 ( 초기 ). SQL 서버. 오라클. DBLib. OCI. SQL 서버용 응용 프로그램. ORACLE 응용 프로그램. DB 사용하기 위한 방법. ADO.NET. ADO. OLE DB. ODBC. ODBC : 열린 접속 환경 제공 C 언어 위주의 함수 호출 구조 OLE DB : COM 프로토콜에 기반하며 메일이나 파일 시스템 등 비관계형 데이터에도 접속할 수 있는 방법 제공 기능적으로 완벽하였으나 , 너무 복잡함 - PowerPoint PPT Presentation

Transcript of 17 장 . ADO.NET

Page 1: 17 장 . ADO.NET

C#

17 장 . ADO.NET

Page 2: 17 장 . ADO.NET

c#

17 장 . ADO.NET

2 / 33

DB 사용하기 위한 방법 ( 초기 )

SQL 서버

DBLib

SQL 서버용 응용 프로그램

오라클

OCI

ORACLE 응용 프로그램

Page 3: 17 장 . ADO.NET

c#

17 장 . ADO.NET

3 / 33

DB 사용하기 위한 방법

ODBC OLE DB ADO ADO.NET

ODBC : 열린 접속 환경 제공C 언어 위주의 함수 호출 구조

OLE DB : COM 프로토콜에 기반하며 메일이나 파일 시스템 등 비관계형 데이터에도 접속할 수 있는 방법 제공기능적으로 완벽하였으나 , 너무 복잡함

ADO : OLE DB 를 쉽게 쓸 수 있도록 래핑한 것 ( 성능에 문제 발생 )ActiveX Data Objects

ADO.NET : ADO 가 닷넷 환경에 맞게 업그레이드 된 것

Page 4: 17 장 . ADO.NET

c#

17 장 . ADO.NET

4 / 33

ADO.NET 구조

응용 프로그램ADO.NE

T

SQL Server

Provider

ORACLE Provider

ODBC Provider

OLE DB Provider

SQL 서버

오라클

MySQL

Access

Page 5: 17 장 . ADO.NET

c#

17 장 . ADO.NET

5 / 33

▣ ADO.NET◈ ADO(ActiveX Data Objects) + .NET

▣ ADO.NET 의 개선 사항◈ 닷넷 기반의 다양한 언어 지원◈ XML 지원

– 프레임웍 상에서 일관된 포맷으로 지원◈ 단절된 데이터 구조를 표준으로 사용

– 컨넥션 (Connection) 이 끊어진 상태에서 작업 , 소형 메모리 데이터베이스 모델 지원

▣ ADO.NET 관련 네임스페이스◈ System.Data◈ System.Data.Common◈ System.Data.Oledb◈ System.Data.SqlClient

ADO.NET 개요

Page 6: 17 장 . ADO.NET

c#

17 장 . ADO.NET

6 / 33

ADO.NET 의 기본 구조 1

DataAdapterConnectionDatabase

CommandDataReader

DataSet

연결지향

비연결지향

XML

.NET Data Provider

DataSet

Page 7: 17 장 . ADO.NET

c#

17 장 . ADO.NET

7 / 33

ADO.NET 의 기본 구조 2

7

공급자 (Provider)

Connection

Command

DataReader

DataAdapter

XML 문서

DataSetSqlClient

OleDbOracleClient

Odbc

SqlClientOleDb

OracleClientOdbc

Database

Page 8: 17 장 . ADO.NET

c#

17 장 . ADO.NET

8 / 33

Connection 과 데이터 공급자• SqlClient 공급자

▫ SQL Server 공급자 (SqlClient) 는 OLE 와 ODBC 와 같은 중간계층 없이 MS-SQL 전용으로 직접 연결되기 때문에 간단하며 효율적으로 동작한다 .

▫ Microsoft SQL Server 버전 7.0 이상에 연결한다 .

• OleDb 공급자▫ OLE DB 공급자는 OLE DB 를 사용해서 노출된 데이터 소스 및 Microsoft SQL

Server 버전 6.x 또는 그 이전 버전에 SQLOLEDB 즉 SQL Server 용 OLE DB 공급자를 통해 연결한다 .

• ODBC 공급자 (.NET Framework 2.0 에 추가된 공급자 )▫ ODBC 를 사용해서 노출된 데이터 소스에서 사용한다 .▫ System.Data.Odbc

• Oracle 공급자 (.NET Framework 2.0 에 추가된 공급자 )▫ 오라클 데이터 소스에서 사용한다 .( 오라클 클라이언트 소프트웨어 버전 8.1.7

이상에서 지원 )▫ System.Data.Oracle

Page 9: 17 장 . ADO.NET

c#

17 장 . ADO.NET

9 / 33

연결 문자열using System.Data.SqlClient;SqlConnection conn = new SqlConnection("Data Source=(local);Initial

Catalog=ADOTest; User ID=sa;Password=csharp777");conn.open();

using System.Data.OleDb;OleDbConnection con = new

OleDbConnection( @"Provider=Microsoft.Jet.OLEDB.4.0; Data Source=C:/NWind.mdb");

conn.open();

Page 10: 17 장 . ADO.NET

c#

17 장 . ADO.NET

10 / 33

연결 설정▣ SQL DB 연결 순서

◈ 1. 네임스페이스 명시– using System.Data.SqlClient;

◈ 2. Connection 객체 생성 ( 연결 프로퍼티 설정 )– SqlConnection conn;– conn = new SqlConnection("Server=localhost; user id=sa;password=csharp777;

database=ADOTest");◈ 3. Connecton 연결

– conn.Open();◈ 4. 작업수행 ( SQL 쿼리 작업 )◈ 5. 연결 닫기

– conn.Close();

▣ Connection 의 속성◈ conn.Database◈ conn.DataSource◈ conn.ServerVersion◈ conn.State◈ conn.WorkstationId

Page 11: 17 장 . ADO.NET

c#

17 장 . ADO.NET

11 / 33

SQL Server Management Studio 클릭

DB 생성 (ADOTest)

Page 12: 17 장 . ADO.NET

c#

17 장 . ADO.NET

12 / 33

연결 클릭

Page 13: 17 장 . ADO.NET

c#

17 장 . ADO.NET

13 / 33

새 데이터베이스 클릭

Page 14: 17 장 . ADO.NET

c#

17 장 . ADO.NET

14 / 33

1. 테이터베이스 이름 : ADOTest 입력2. 확인 클릭

Page 15: 17 장 . ADO.NET

c#

17 장 . ADO.NET

15 / 33

1. 데이터베이스 확장2. 추가된 ADOTest DB 확인

Page 16: 17 장 . ADO.NET

c#

17 장 . ADO.NET

16 / 33

sa 패스워드 변경

속성 클릭 (sa)

Page 17: 17 장 . ADO.NET

c#

17 장 . ADO.NET

17 / 33

sa 패스워드 변경1. 암호 입력 (csharp777)2. 확인 클릭

Page 18: 17 장 . ADO.NET

c#

17 장 . ADO.NET

18 / 33

연결 테스트/**SqlClient Connection 설정 테스트**/using System;using System.Data;using System.Data.SqlClient;class ConnectionTest{ public static void Main(string[] args) { string strConn = "server=brain;database=ADOTest;user id=sa;

password=csharp777"; SqlConnection conn = new SqlConnection(strConn);

conn.Open();// Open Connection Console.WriteLine("1. Database = " + conn.Database); Console.WriteLine("2. DataSource = " + conn.DataSource); Console.WriteLine("3. DataServerVersion = " + conn.ServerVersion); Console.WriteLine("4. State = " + conn.State); Console.WriteLine("5. WorkstationID = " + conn.WorkstationId); conn.Close();// Close Connection Console.WriteLine("6. State = " + conn.State); }

Page 19: 17 장 . ADO.NET

c#

17 장 . ADO.NET

19 / 33

sqlCommand 클래스▣ SqlCommand 클래스

◈ DB 에 필요한 명령을 전달하거나 그 결과를 받아올 때 사용하는 클래스

▣ SqlCommand 에서 사용할 수 있는 명령들◈ 단일 값 및 레코드 셋을 반환하는 SELECT, CREATE, ALERT, DROP

같은 DLL(Data Definition Language) 명령◈ GRANT, DENY, REVOKE 같은 DCL(Data Control Language) 명령◈ INSERT, UPDATE, DELETE 같은 DML(Data Modification Language)

명령

▣ SqlCommand 클래스 주요 함수◈ ExecuteNonQuery()

– SQL 문을 실행하고 처리된 행의 개수를 반환◈ ExecuteReader()

– 쿼리를 Connection 에 보내고 SqlDataReader 를 생성 ◈ ExecuteScalar()

– 쿼리를 실행하고 쿼리에서 반환된 결과 집합의 첫번째 행의 첫번째 열 반환 ◈ ExecuteXmlReader()

– 쿼리를 Connection 에 보내고 XmlReader 객체를 생성

Page 20: 17 장 . ADO.NET

c#

17 장 . ADO.NET

20 / 33

sqlCommand 의 ExecuteNonQuery▣ ExecuteNonQuery()

◈ 데이터베이스의 쿼리 (Query) 중 Select 명령을 제외한 대부분의 명령을 처리할 수 있다 .

▣ ExecuteNonQuery() 의 사용◈ Connection 생성 및 Open

– string conStr = "Server=localhost;user id=sa;password=csharp777;database=ADOTest";

– SqlConnection conn = new SqlConnection(conStr);– conn.Open();

◈ SqlCommnad 생성– string createQuery = "create table Address ( id int, name char(20), addr

char(40))";– SqlCommand comm = new SqlCommand(createQuery, conn);

◈ SqlCommand 실행– comm.ExecuteNonQuery();

◈ Connection Close– conn.Close();

Page 21: 17 장 . ADO.NET

c#

17 장 . ADO.NET

21 / 33

sqlCommand 의 ExecuteNonQuery( Address 테이블 생성후 자료 입력 )

/**

SqlCommand 의 ExecuteNonQuery()

**/

using System;

using System.Data;

using System.Data.SqlClient;

class CommandNonQueryTest

{

public static void Main()

{

string conStr = "Server=localhost;user id=sa;password=csharp777;database=ADOTest";

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, ' 김선달 ', ' 대전시 ')";

//1. Connection 생성과 Open

SqlConnection conn = new SqlConnection(conStr);

conn.Open();

//2. Command 생성

SqlCommand comm = new

SqlCommand(createQuery, conn);

SqlCommand comm1 = new SqlCommand(query1,

conn);

SqlCommand comm2 = new SqlCommand(query2,

conn);

SqlCommand comm3 = new SqlCommand(query3,

conn);

SqlCommand comm4 = new SqlCommand(query4,

conn);

SqlCommand comm5 = new SqlCommand(query5,

conn);

//3. Command 수행

comm.ExecuteNonQuery();

comm1.ExecuteNonQuery();

comm2.ExecuteNonQuery();

comm3.ExecuteNonQuery();

comm4.ExecuteNonQuery();

comm5.ExecuteNonQuery();

//4. Connection Close

conn.Close();

}

}

Page 22: 17 장 . ADO.NET

c#

17 장 . ADO.NET

22 / 33

결과 확인 새 쿼리 클릭

Page 23: 17 장 . ADO.NET

c#

17 장 . ADO.NET

23 / 33

결과 확인1. 쿼리문 입력

USE ADOTest;select * from dbo.Address;

2. 실행 클릭

Page 24: 17 장 . ADO.NET

c#

17 장 . ADO.NET

24 / 33

sqlCommand 의 Parameter(Insert 문장 )▣ SqlCommand 의 Parameter

◈ 반복적인 쿼리 작업이나 쿼리가 복잡할 경우에 주로 사용한다 .

▣ Parameter 변수를 선언하는 방법◈ string query ="Insert into Address values (@ID, @Name, @Address)";◈ SqlCommand comm = new SqlCommand(query, conn);

▣ Parameter 타입을 지정하는 예◈ comm.Parameters.Add("@ID", SqlDbType.TinyInt);◈ comm.Parameters.Add("@Name", SqlDbType.Char);◈ comm.Parameters.Add("@Address", SqlDbType.Char);

▣ Parameter 의 값 설정◈ comm.Parameters["@ID"].Value = 6;◈ comm.Parameters["@Name"].Value = "HongGilDDong";◈ comm.Parameters["@Address"].Value = "Seoul";

▣ SqlCommand 의 실행◈ comm.ExecuteNonQuery();

Page 25: 17 장 . ADO.NET

c#

17 장 . ADO.NET

25 / 33

sqlCommand 의 Parameter(Insert 문장 )

멤버 .NET Type 설명

BigInt Int64 64 비트 부호화 정수

Binary Byte[ ] 1~ 8,000 바이트 이진 데이터의 고정 길이 스트림

Bit Boolean 0,1 및 null 참조일 수 있는 부호 없는 숫자값

Char String 1~8,000 자 유니코드 제외 문자의 고정 길이 스트림

DateTime DateTime 정확성 3.33 밀리초 , 1753.1.1~9999.12.31 일 날짜 및 시간 데이터

Decimal Decimal -1038-1~1038-1 고정 전체 자릿수 및 소수 자릿수값

Float Double -1.79E+308~1.79E +308 부동 소수점 숫자

Image Byte[ ] 0~ 231 -1 바이트 이진 데이터의 가변 길이 스트림

Int Int32 32 비트 부호 있는 정수

MoneyDecimal

 정확성 통화 단위의 10000 분의 1 -263( 또는 -922,337,203,685,477.5808)~263-1 통화값

NChar String 1~4.000 자 유니코드 문자의 고정 길이 스트림

NText String 230 – 1 까지 유니코드 데이터의 가변 길이 스트림

NVarChar String 1~4.000 자 유니코드 문자의 가변 길이 스트림

Real Single -3.40E+38 ~3.40E +38 부동 소수점 숫자

SmallDateTime DateTime 정확성 1 초 , 1900.1.1~2079.6.6 일인 날짜 및 시간 데이터

SmallInt Int16 16 비트 부호 있는 정수

SmallMoney Decimal정확성이 통화 단위의 1000 분의 10 범위 -214,748.3648~+214,748.3647 까지인 통화값

Text String 최대 231-1 자 유니코드 제외 데이터의 가변길이 스트림

Timestamp DateTime yyyymmddhhmmss 형식의 날짜 및 시간 데이터

TinyInt Byte 8 비트 부호 없는 정수

UniqueIdentifier Guid GUID(Globally Unique IDentifier)

VarBinary Byte[ ] 1~8,000 바이트 이진 데이터의 가변 길이 스트림

VarChar String 1~8,000 문자 비유니코드 문자의 가변 길이 스트림

Variant ObjectSQL Server 값 Empty 및 Null, 숫자 , 문자열 , 이진 또는 날짜 데이터를 포함할 수 있는 특수 데이터 형식

Page 26: 17 장 . ADO.NET

c#

17 장 . ADO.NET

26 / 33

sqlCommand 의 Parameter(Insert 문장 )/**SqlCommand의 Parameter 이용 I**/using System;using System.Data;using System.Data.SqlClient;public class CommandParamTest{ public static void Main() { string conStr =

"Server=localhost;user id=sa;password=csharp777;database=ADOTest";

string query = "Insert into Ad-dress values (@ID, @Name, @Ad-dress)";

//1. Connection 생성과 Open SqlConnection conn = new Sql-

Connection(conStr); conn.Open(); //2. Command 생성 SqlCommand comm = new Sql-

Command(query, conn);

//3. Command의 Parameter Type설정 comm.Parameters.Add("@ID", SqlDb-

Type.TinyInt); comm.Parameters.Add("@Name",

SqlDbType.Char); comm.Parameters.Add("@Address",

SqlDbType.Char); //4. Command의 Parameter 값설정과 명령

실행1 comm.Parameters["@ID"].Value = 6; comm.Parameters["@Name"].Value =

"HongGilDDong"; comm.Parameters["@Address"].Value =

"Seoul"; comm.ExecuteNonQuery(); //5. Command의 Parameter 값설정과 명령

실행2 comm.Parameters["@ID"].Value = 7; comm.Parameters["@Name"].Value =

"MR.Kim"; comm.Parameters["@Address"].Value =

"Pusan"; comm.ExecuteNonQuery(); //6. Connection Close conn.Close(); }}

Page 27: 17 장 . ADO.NET

c#

17 장 . ADO.NET

27 / 33

결과 조회

Page 28: 17 장 . ADO.NET

c#

17 장 . ADO.NET

28 / 33

새 쿼리 클릭

비주얼 스튜디오에서

Page 29: 17 장 . ADO.NET

c#

17 장 . ADO.NET

29 / 33

SqlCommand 의 ExecuteReader▣ SqlCommand 의 ExecuteReader()

◈ Select 쿼리를 처리할 때 사용하는 함수

▣ SqlDataReader 를 얻기 위한 절차◈ 1. 네임스페이스 명시

– using System.Data.SqlClient;◈ 2. Connection 객체 생성 : 생성자에게 연결 정보 전달 , 연결 프로퍼티 설정

– SqlConnection conn = new SqlConnection(Server=localhost; user id=sa; password=; database=northwind");

◈ 3. Connecton 연결 – conn.Open();

◈ 4. Command 객체 생성 : 실행할 쿼리와 Connection 을 인수로 함– SqlCommand comm = new SqlCommand("select * from 테이블명 ", conn);

◈ 5. 데이터 읽어오기– SqlDataReader reader = comm.ExecuteReader();

◈ 6. 작업수행◈ 7. 연결 닫기

– conn.Close();

Connection

DatabaseSqlCommand (Select 문장 )

SqlDataReader

SqlCommand 의 SqlDataReader

ExecuteReader() 의 호출

Page 30: 17 장 . ADO.NET

c#

17 장 . ADO.NET

30 / 33

ExecuteReader() 예제/**ExecuteReader() 를 테스트하는 예제**/using System;using System.Data.SqlClient;

public class CommandReader{ public static void Main() { string conStr = "Server=localhost;user

id=sa;password=csharp777;database=ADOTest"; string query = "select * from Address"; SqlConnection conn = new SqlConnection(conStr); conn.Open(); SqlCommand comm = new SqlCommand(query, conn); SqlDataReader sr = comm.ExecuteReader(); while (sr.Read()) { Console.Write(sr.GetInt32(0) + "|"); Console.Write(sr.GetString(1).Trim() + "|"); Console.Write(sr.GetString(2)); Console.WriteLine(); } sr.Close(); conn.Close(); }}

Page 31: 17 장 . ADO.NET

c#

17 장 . ADO.NET

31 / 33

SqlCommand 의 Parameter(Select 문장 )▣ 데이터베이스 Connection 생성과 Open

◈ string conStr = "Server=localhost;user id=sa;password=csharp777;database=ADOTest";◈ string query = "select * from Address where addr=@addr1 or addr=@addr2";◈ SqlConnection conn = new SqlConnection(conStr);◈ conn.Open();

▣ Command 생성과 Parameter 타입 지정◈ SqlCommand comm = new SqlCommand(query, conn);◈ comm.Parameters.Add("@addr1", SqlDbType.Char);◈ comm.Parameters.Add("@addr2", SqlDbType.Char);

▣ Command 의 Parameter 값 설정◈ comm.Parameters["@addr1"].Value = " 서울시 ";◈ comm.Parameters["@addr2"].Value = " 대전시 ";

▣ 데이터 읽어오기◈ SqlDataReader sr = comm.ExecuteReader();◈ while(sr.Read()){◈ Console.WriteLine(sr.GetInt32(0)+"|"+ sr.GetString(1).Trim()+"|"+ sr.GetString(2) );◈ }

▣ SqlDataReader 와 Connection 닫기◈ sr.Close();◈ conn.Close();

Page 32: 17 장 . ADO.NET

c#

17 장 . ADO.NET

32 / 33

SqlCommand 의 Parameter(Select 문장 )/**

SqlCommand 의 파라미터 이용**/

using System;

using System.Data;

using System.Data.SqlClient;

public class CommandParamTest2

{

public static void Main()

{

string conStr = "Server=localhost;user id=sa;password=csharp777;database=ADOTest";

string query = "select * from Address where addr=@addr1 or addr=@addr2";

SqlConnection conn = new SqlConnection(conStr);

conn.Open();

SqlCommand comm = new SqlCommand(query, conn);

comm.Parameters.Add("@addr1", SqlDbType.Char);

comm.Parameters.Add("@addr2", SqlDbType.Char);

comm.Parameters["@addr1"].Value = " 서울시 ";

comm.Parameters["@addr2"].Value = " 대전시 ";

SqlDataReader sr = comm.ExecuteReader();

while (sr.Read())

{

Console.Write(sr.GetInt32(0) + "|");

Console.Write(sr.GetString(1).Trim() + "|");

Console.Write(sr.GetString(2));

Console.WriteLine();

}

sr.Close();

conn.Close();

}

}

Page 33: 17 장 . ADO.NET

c#

17 장 . ADO.NET

33 / 33

SqlCommand 를 이용한 XmlReader▣ Connection 생성과 Open

◈ string conStr = "Server=localhost;user id=sa;password=;database=northwind";◈ SqlConnection conn = new SqlConnection(conStr);◈ conn.Open();

▣ Command 생성 및 처리 그리고 XmlReader 얻기◈ string xquery = "select * from Address FOR XML AUTO, ELEMENTS";◈ SqlCommand xcomm = new SqlCommand(xquery, conn);◈ XmlReader reader = reader = xcomm.ExecuteXmlReader();

▣ 그 외의 작업◈ while (reader.Read()){◈ // 작업◈ } ◈ reader.Close();◈ conn.Close();

컬럼 이름을 태그의 이름을 사용해서 XML 데이터를 구축한다 .(RAW, AUTO, EX-PLICIT)

SqlConnection

DatabaseSqlCommand

SqlDataReader

XmlReader

SqlCommand 로 작업후 Reader 들

Page 34: 17 장 . ADO.NET

c#

17 장 . ADO.NET

34 / 33

SqlCommand 를 이용한 XmlReader/**

XMLReader 를 사용하는 예제 **/

using System;

using System.Data;

using System.Data.SqlClient;

using System.Xml;

class CommandXmlTest

{

public static void Main()

{

string conStr = "Server=localhost;user id=sa;password=csharp777;database=ADOTest";

string xquery = "select * from Address FOR XML AUTO, ELEMENTS";

SqlConnection conn = new SqlConnection(conStr);

conn.Open();

SqlCommand xcomm = new SqlCommand(xquery, conn);

XmlReader reader = null;

try

{

reader = xcomm.ExecuteXmlReader();

while (reader.Read())

{

switch (reader.NodeType)

{

case XmlNodeType.Element:

Console.Write("<{0}>", reader.Name);

break;

case XmlNodeType.Text:

Console.Write(reader.Value.Trim());

break;

case XmlNodeType.EndElement:

Console.WriteLine("</{0}>", reader.-Name);

break;

}

}

}

catch (Exception e)

{

Console.WriteLine(e.Message);

}

finally

{

reader.Close();

conn.Close();

}

}

}

Page 35: 17 장 . ADO.NET

DataSet 과 DataAdapter

Page 36: 17 장 . ADO.NET

c#

17 장 . ADO.NET

36 / 33

DataSet 과 DataAdapter

.NET 데이터 공급자

Connection

Command

DataReader

Transaction

Transaction

DataAdapterSelectCommand

InsertCommand

UpdateCommand

DeleteCommand

DataSet

DataTableCollection

DataTableDataRowCollection

DataColumnCollection

ConstraintCollection

DataRelationCollection

Database XML

Page 37: 17 장 . ADO.NET

c#

17 장 . ADO.NET

37 / 33

DataAdapterConnection

Database

Command DataReader

DataSet

연결지향

비연결지향

.Net 에서 이용되는 데이터 구조

Page 38: 17 장 . ADO.NET

c#

17 장 . ADO.NET

38 / 33

DataAdapter 속성과 함수▣ DataAdapter 속성

◈ DeleteCommand– 삭제 명령을 사용하는 Command 필드

◈ InsertCommand– 입력 명령을 사용하는 Command 필드

◈ SelectCommand– 조회 명령을 사용하는 Command 필드

◈ UpdateCommand– 수정 명령을 사용하는 Command 필드

▣ DataAdapter 주요 함수◈ Fill()

– 데이터 원본에 있는 데이터를 DataSet 의 DataTable 에 넣어준다 .◈ FillSchema()

– 데이터 원본의 스키마에 맞게 DataSet 에 DataTable 을 생성한다 .◈ Update()

– DataSet 의 DataTable 에서 변경된 데이터를 원본에 반영시킨다 .

DataAdapterSelectCommand

InsertCommand

UpdateCommand

DeleteCommand

DataSet

Fill()FillSchema

()

update()

Page 39: 17 장 . ADO.NET

c#

17 장 . ADO.NET

39 / 3339

DataSet 의 구성요소

.Net DataSet 구성요소

Constraint

DataColumn

DataRow

DataTable

DataRelation

DataTable

Constraint

DataColumn

DataRow

DataRelation

DataTable

Constraint

DataColumn

DataRow

DataRelation

DataTable

Constraint

DataColumn

DataRow

DataRelation

DataColumn

DataRow

DataColumn DataColumn

DataRow

DataRow

DataSet 의 개념상의 구성요소

DataSet

DataTable

DataColumnCollectionDataColumnCollectionDataRowCollection

DataColumnCollectionDataColumnCollectionDataTableCollection

DataTable

DataTable

DataTable

DataColumnCollectionDataColumnCollectionDataColumnCollection

Page 40: 17 장 . ADO.NET

c#

17 장 . ADO.NET

40 / 33

DataSet 의 계층구조DataSet

DataTable

DataColumnCollection

DataRowDataColumn

DataColumnCollectionDataColumnCollection DataColumnCollectionDataColumnCollectionDataRowCollection

DataColumnCollectionDataColumnCollectionDataTableCollection

Page 41: 17 장 . ADO.NET

c#

17 장 . ADO.NET

41 / 3341

DataSet 을 만드는 방법 I

1. Connection 생성 및 Open◈ string conStr = "Server=localhost;user id=sa;password=csharp777;database=ADOTest";◈ SqlConnection conn = new SqlConnection(conStr);◈ conn.Open();

2. DataAdapter 생성◈ SqlDataAdapter adapter = new SqlDataAdapter();

3. SqlCommand 할당◈ string query = "select * from Address";◈ adapter.SelectCommand = new SqlCommand(query, conn);

4. DataSet 생성◈ DataSet ds = new DataSet();

5. DataAdapter 를 이용해서 DataSet 채우기◈ adapter.Fill(ds);

6. 작업수행

7. 연결 닫기◈ conn.Close();

Page 42: 17 장 . ADO.NET

c#

17 장 . ADO.NET

42 / 33

DataSet 만들기/**DataAdapter 를 이용해서 DataSet 만들기 I**/using System;using System.Data;using System.Data.SqlClient;public class AdapterHandleTest{ public static void Main() { string conStr = "Server=localhost;user

id=sa;password=csharp777;database=ADOTest"; string query = "select * from Address"; //1. Connenction 생성과 Open SqlConnection conn = new SqlConnection(conStr); conn.Open(); //2. SqlDataAdapter 생성 SqlDataAdapter adapter = new SqlDataAdapter(); //3. Adapter 에 SelectCommand 할당 adapter.SelectCommand = new SqlCommand(query, conn); //4. DataSet 생성 DataSet ds = new DataSet(); //5. Adapter 를 통해서 DataSet 채우기 adapter.Fill(ds); //6. Connection 닫기 conn.Close(); }}

Page 43: 17 장 . ADO.NET

c#

17 장 . ADO.NET

43 / 3343

DataSet 으로 작업하기▣ Connenction 생성과 Open

◈ string conStr = "Server=localhost;user id=sa;password=csharp777;database=ADOTest";◈ SqlConnection conn = new SqlConnection(conStr);◈ conn.Open();

▣ SqlDataAdapter 생성◈ SqlDataAdapter adapter = new SqlDataAdapter();

▣ Adapter 에 SelectCommand 할당◈ string query = "select * from Address";

▣ adapter.SelectCommand = new SqlCommand(query, conn);▣ DataSet 생성

◈ DataSet ds = new DataSet();▣ Adapter 를 통해서 DataSet 채우기

◈ adapter.Fill(ds);▣ Connection 닫기

◈ conn.Close();

▣ 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]);◈ Console.WriteLine();◈ }

DataSet 의 계층구조DataSet

DataColumnCollection

DataRowDataColumn

DataColumnCollectionDataColumnCollection DataColumnCollectionDataColumnCollectionDataRowCollection

DataColumnCollectionDataColumnCollectionDataTableCollectionTables

ColumnsRows

DataTable

DataAdapter 를 생성할 때 디폴트 생성자를 사용한 후 sqlCommand 를 할당

Page 44: 17 장 . ADO.NET

c#

17 장 . ADO.NET

44 / 33

DataSet의 사용을 보여주는 예제

/**DataSet 의 사용을 보여주는 예제**/using System;using System.Data;using System.Data.SqlClient;public class DataSetHandleTest{ public static void Main() { string conStr = "Server=localhost;user

id=sa;password=csharp777;database=ADOTest"; string query = "select * from Address"; //1. Connenction 생성과 Open SqlConnection conn = new

SqlConnection(conStr); conn.Open(); //2. SqlDataAdapter 생성 SqlDataAdapter adapter = new Sql-

DataAdapter();

//3. Adapter 에 SelectCommand 할당 adapter.SelectCommand = new SqlCom-

mand(query, conn); //4. DataSet 생성 DataSet ds = new DataSet(); //5. Adapter 를 통해서 DataSet 채우기 adapter.Fill(ds); //6. Connection 닫기 conn.Close(); //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]); Console.WriteLine(); } }}

Page 45: 17 장 . ADO.NET

c#

17 장 . ADO.NET

45 / 33 45

DataSet 을 만드는 방법 II

▣ Connection 생성 및 Open◈ string conStr = "Server=localhost;user id=sa;password=;database=northwind";◈ SqlConnection conn = new SqlConnection(conStr);◈ conn.Open();

▣ DataSet 만들기◈ SqlDataAdapter adapter = new SqlDataAdapter("select * from Address", conn);◈ DataSet ds = new DataSet("MyAddressDataSet");//DataSet 의 이름◈ adapter.Fill(ds);// 테이블의 이름◈ conn.Close();

▣ 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]);◈ Console.WriteLine();◈ }

SqlDataAdapter adapter = new SqlDataAdapter();string query = "select * from Address";adapter.SelectCommand = new SqlCommand(query, conn);DataSet ds = new DataSet();

DataAdapter 에 SQL 쿼리와 Connection 을 매개 변수로 사용하는 방법

Page 46: 17 장 . ADO.NET

c#

17 장 . ADO.NET

46 / 33

DataSet 을 만드는 방법 2/**DataAdapter 를 이용해서 DataSet 만들기 II**/using System;using System.Data;using System.Data.SqlClient;public class AdapterHandleTest2{ public static void Main(string[] args) { string conStr = "Server=localhost;user id=sa;password=csharp777;database=ADOTest"; SqlConnection conn = new SqlConnection(conStr); conn.Open();

SqlDataAdapter adapter = new SqlDataAdapter("select * from Address", conn);

DataSet ds = new DataSet("MyAddressDataSet");//DataSet 의 이름 adapter.Fill(ds);// 테이블의 이름 conn.Close(); 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]); Console.WriteLine(); } }}

Page 47: 17 장 . ADO.NET

c#

17 장 . ADO.NET

47 / 3347

DataSet 의 Update()

▣ DataSet 에서 InsertCommand 명령을 수행하는 방법◈ DataSet 자체에 레코드를 삽입한다 .◈ DataAdapter 에 SqlCommand 를 지정한다 .◈ DataAdapter 를 이용해서 DataSet 을 데이터베이스로 업데이트한다 .

DataSet 의 InsertCommand 명령 수행

DataSet

DataTable

DataColumnCollectionDataColumnCollectionDataTableCollectionDataRow

Database

DataAdapter 에 SqlCommand 지정

(Insert 문장 ) 새로운 Row 삽입

12

3DataAdpater 를 이용해서 Update()

DataRow row = table.NewRow();row["id"] = "8";row["name"] = "Uncle";row["addr"] = "Ameria";table.Rows.Add(row);

Page 48: 17 장 . ADO.NET

1. SqlDataAdapter adapter = new SqlDataAdapter("select * from Address", conn);2. DataSet ds = new DataSet("MyAddressDataSet");//DataSet 의 이름3. adapter.Fill(ds, "Address");// 테이블의 이름4. conn.Close();5. DataTable table = ds.Tables["Address"];

6. //1. DataRow 생성하여 Row 를 삽입하기7. DataRow row = table.NewRow();8. row["id"] = "8";9. row["name"] = "Uncle";10. row["addr"] = "Ameria";11. table.Rows.Add(row);

12. //2. SqlCommand 지정하기13. conn.Open();14. string strSql="Insert into Address(id, name, addr)values(@id, @name, @addr)";15. adapter.InsertCommand = new SqlCommand(strSql, conn);16. adapter.InsertCommand.Parameters.Add("@id", SqlDbType.TinyInt, 0, "id");17. adapter.InsertCommand.Parameters.Add("@name", SqlDbType.Char, 20, "name");18. adapter.InsertCommand.Parameters.Add("@addr", SqlDbType.Char, 40, "addr");

19. //3. DataAdapter 를 이용하여 DataSet 업데이트하기20. adapter.Update(ds, "Address");21. conn.Close();

연결형으로 처리하는 것 고려모든 자료를 client 로 down 하여1 건을 입력하여 처리하는 것은 비효율적임