www.jangjeonghun.tistory.com

Download Report

Transcript www.jangjeonghun.tistory.com

C#
17장. ADO.NET
17장. ADO.NET
DB 사용하기 위한 방법(초기)
SQL 서버
오라클
DBLib
OCI
SQL 서버용 응
용 프로그램
c#
ORACLE 응용
프로그램
2 / 33
17장. ADO.NET
DB 사용하기 위한 방법
ODBC
OLE DB
ADO
ADO.NET
ODBC : 열린 접속 환경 제공
C 언어 위주의 함수 호출 구조
OLE DB : COM 프로토콜에 기반하며 메일이나 파일 시스템 등 비관계형
데이터에도 접속할 수 있는 방법 제공
기능적으로 완벽하였으나, 너무 복잡함
ADO : OLE DB를 쉽게 쓸 수 있도록 래핑한 것(성능에 문제 발생)
ActiveX Data Objects
ADO.NET : ADO 가 닷넷 환경에 맞게 업그레이드 된 것
c#
3 / 33
17장. ADO.NET
ADO.NET 구조
응용 프로그램
c#
ADO.NET
SQL Server
Provider
SQL 서버
ORACLE
Provider
오라클
ODBC
Provider
MySQL
OLE DB
Provider
Access
4 / 33
17장. ADO.NET
ADO.NET 개요
▣
ADO.NET
◈
▣
ADO(ActiveX Data Objects) + .NET
ADO.NET의 개선 사항
닷넷 기반의 다양한 언어 지원
◈ XML 지원
◈
– 프레임웍 상에서 일관된 포맷으로 지원
◈
단절된 데이터 구조를 표준으로 사용
– 컨넥션(Connection)이 끊어진 상태에서 작업, 소형 메모리 데이터베이스 모델 지
원
▣
ADO.NET 관련 네임스페이스
◈
System.Data
◈ System.Data.Common
◈ System.Data.Oledb
◈ System.Data.SqlClient
c#
5 / 33
17장. ADO.NET
ADO.NET 의 기본 구조 1
.NET Data Provider
Command
연결지향
Database
DataReader
Connection
DataAdapter
비연결지향
DataSet
XML
DataSet
c#
6 / 33
17장. ADO.NET
ADO.NET 의 기본 구조 2
XML 문서
Connection
공급자(Provider)
Database
SqlClient
OleDb
OracleClient
Odbc
Command
DataSet
DataReader
DataAdapter
7
c#
7 / 33
17장. ADO.NET
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
c#
8 / 33
17장. ADO.NET
연결 문자열
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();
c#
9 / 33
17장. ADO.NET
연결 설정
▣
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
c#
10 / 33
17장. ADO.NET
DB 생성(ADOTest)
SQL Server Management Studio 클릭
c#
11 / 33
17장. ADO.NET
연결 클릭
c#
12 / 33
17장. ADO.NET
새 데이터베이스 클릭
c#
13 / 33
17장. ADO.NET
1. 테이터베이스 이름 : ADOTest 입력
2. 확인 클릭
c#
14 / 33
17장. ADO.NET
1. 데이터베이스 확장
2. 추가된 ADOTest DB 확인
c#
15 / 33
17장. ADO.NET
sa 패스워드 변경
속성 클릭(sa)
c#
16 / 33
17장. ADO.NET
sa 패스워드 변경
1. 암호 입력(csharp777)
2. 확인 클릭
c#
17 / 33
17장. ADO.NET
연결 테스트
/**
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);
}
c#
18 / 33
17장. ADO.NET
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 객체를 생성
c#
19 / 33
17장. ADO.NET
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();
c#
20 / 33
17장. ADO.NET
sqlCommand 의 ExecuteNonQuery
( Address 테이블 생성후 자료 입력)
/**
//1. Connection 생성과 Open
SqlCommand의 ExecuteNonQuery()
SqlConnection conn = new SqlConnection(conStr);
**/
conn.Open();
using System;
using System.Data;
//2. Command 생성
using System.Data.SqlClient;
SqlCommand comm = new SqlCommand(createQuery, conn);
class CommandNonQueryTest
SqlCommand comm1 = new SqlCommand(query1, conn);
{
public static void Main()
SqlCommand comm2 = new SqlCommand(query2, conn);
{
SqlCommand comm3 = new SqlCommand(query3, conn);
string conStr = "Server=localhost;user
id=sa;password=csharp777;database=ADOTest";
SqlCommand comm4 = new SqlCommand(query4, conn);
string createQuery =
SqlCommand comm5 = new SqlCommand(query5, conn);
"create table Address ( id int, name char(20), addr
char(40))";
//3. Command 수행
string query1 = "Insert into Address values (1, '김삿갓', '서울시')";
comm.ExecuteNonQuery();
string query2 = "Insert into Address values (2, '홍길동', '부산시')";
string query3 = "Insert into Address values (3, '춘향이', '광주시')";
comm1.ExecuteNonQuery();
string query4 = "Insert into Address values (4, '개똥이', '대구시')";
comm2.ExecuteNonQuery();
string query5 = "Insert into Address values (5, '김선달', '대전시')";
comm3.ExecuteNonQuery();
comm4.ExecuteNonQuery();
comm5.ExecuteNonQuery();
//4. Connection Close
conn.Close();
}
c#
}
21 / 33
17장. ADO.NET
결과 확인
c#
새 쿼리 클릭
22 / 33
17장. ADO.NET
결과 확인
c#
1. 쿼리문 입력
USE ADOTest;
select * from dbo.Address;
2. 실행 클릭
23 / 33
17장. ADO.NET
sqlCommand의 Parameter(Insert문장)
▣
SqlCommand의 Parameter
◈
▣
Parameter 변수를 선언하는 방법
◈
◈
▣
comm.Parameters["@ID"].Value = 6;
comm.Parameters["@Name"].Value = "HongGilDDong";
comm.Parameters["@Address"].Value = "Seoul";
SqlCommand의 실행
◈
c#
comm.Parameters.Add("@ID", SqlDbType.TinyInt);
comm.Parameters.Add("@Name", SqlDbType.Char);
comm.Parameters.Add("@Address", SqlDbType.Char);
Parameter의 값 설정
◈
◈
◈
▣
string query ="Insert into Address values (@ID, @Name, @Address)";
SqlCommand comm = new SqlCommand(query, conn);
Parameter 타입을 지정하는 예
◈
◈
◈
▣
반복적인 쿼리 작업이나 쿼리가 복잡할 경우에 주로 사용한다.
comm.ExecuteNonQuery();
24 / 33
멤버
17장. ADO.NET
.NET Type
BigInt
Int64
Binary
Byte[ ]
설명
64비트 부호화 정수
1~ 8,000바이트 이진 데이터의 고정 길이 스트림
sqlCommand의 Parameter(Insert문장)
Boolean
Char
String
DateTime
DateTime
Decimal
Decimal
-1038-1~1038-1 고정 전체 자릿수 및 소수 자릿수값
Float
Double
-1.79E+308~1.79E +308 부동 소수점 숫자
Image
Byte[ ]
0~ 231 -1바이트 이진 데이터의 가변 길이 스트림
Int
Int32
Money
c#
0,1 및 null 참조일 수 있는 부호 없는 숫자값
Bit
Decimal
1~8,000자 유니코드 제외 문자의 고정 길이 스트림
정확성 3.33밀리초, 1753.1.1~9999.12.31일 날짜 및 시간 데이터
32비트 부호 있는 정수
정확성 통화 단위의 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
SmallInt
Int16
SmallMoney
Decimal
Text
String
Timestamp
DateTime
TinyInt
Byte
8비트 부호 없는 정수
UniqueIdentifier
Guid
GUID(Globally Unique IDentifier)
VarBinary
Byte[ ]
VarChar
String
1~8,000문자 비유니코드 문자의 가변 길이 스트림
Variant
Object
SQL Server 값 Empty 및 Null, 숫자, 문자열, 이진 또는 날짜 데이터를 포함할 수 있는 특수 데이터 형
식
정확성 1초, 1900.1.1~2079.6.6일인 날짜 및 시간 데이터
16비트 부호 있는 정수
정확성이 통화 단위의 1000분의 10
범위 -214,748.3648~+214,748.3647까지인 통화값
최대 231-1자 유니코드 제외 데이터의 가변길이 스트림
yyyymmddhhmmss 형식의 날짜 및 시간 데이터
1~8,000바이트 이진 데이터의 가변 길이 스트림
25 / 33
17장. ADO.NET
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=A
DOTest";
string query = "Insert into Address
values (@ID, @Name, @Address)";
//1. Connection 생성과 Open
SqlConnection conn = new
SqlConnection(conStr);
conn.Open();
//2. Command 생성
SqlCommand comm = new
SqlCommand(query, conn);
c#
//3. Command의 Parameter Type설정
comm.Parameters.Add("@ID",
SqlDbType.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();
}
}
26 / 33
17장. ADO.NET
결과 조회
c#
27 / 33
17장. ADO.NET
비주얼 스튜디오에서
새 쿼리 클릭
c#
28 / 33
17장. ADO.NET
SqlCommand의 ExecuteReader
▣
SqlCommand의 ExecuteReader()
◈
▣
Select 쿼리를 처리할 때 사용하는 함수
SqlDataReader를 얻기 위한 절차
◈
SqlCommand의 SqlDataReader
Connection
Database
1. 네임스페이스 명시
SqlCommand (Select 문장)
ExecuteReader()의
호출
SqlDataReade
r
– 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();
c#
29 / 33
17장. ADO.NET
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();
c#
30 / 33
17장. ADO.NET
SqlCommand의 Parameter(Select문장)
▣
데이터베이스 Connection 생성과 Open
◈
◈
◈
◈
▣
Command 생성과 Parameter 타입 지정
◈
◈
◈
▣
SqlDataReader sr = comm.ExecuteReader();
while(sr.Read()){
Console.WriteLine(sr.GetInt32(0)+"|"+ sr.GetString(1).Trim()+"|"+ sr.GetString(2) );
}
SqlDataReader와 Connection 닫기
◈
◈
c#
comm.Parameters["@addr1"].Value = "서울시";
comm.Parameters["@addr2"].Value = "대전시";
데이터 읽어오기
◈
◈
◈
◈
▣
SqlCommand comm = new SqlCommand(query, conn);
comm.Parameters.Add("@addr1", SqlDbType.Char);
comm.Parameters.Add("@addr2", SqlDbType.Char);
Command의 Parameter 값 설정
◈
◈
▣
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();
sr.Close();
conn.Close();
31 / 33
17장. ADO.NET
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();
}
c#
32 / 33
17장. ADO.NET
SqlCommand를 이용한 XmlReader
▣
Connection 생성과 Open
◈
string conStr = "Server=localhost;user id=sa;password=;database=northwind";
◈ SqlConnection conn = new SqlConnection(conStr);
컬럼 이름을 태그의 이름을 사용
◈ conn.Open();
해서 XML 데이터를 구축한
다.(RAW, AUTO, EXPLICIT)
▣
Command 생성 및 처리 그리고 XmlReader 얻기
◈
string xquery = "select * from Address FOR XML AUTO, ELEMENTS";
◈ SqlCommand xcomm = new SqlCommand(xquery, conn);
◈ XmlReader reader = reader = xcomm.ExecuteXmlReader();
▣
그 외의 작업
◈
◈
◈
◈
◈
c#
while (reader.Read()){
//작업
}
reader.Close();
conn.Close();
SqlCommand로 작업후 Reader들
SqlConnection
Database
SqlDataReader
SqlCommand
XmlReader
33 / 33
17장. ADO.NET
SqlCommand를 이용한 XmlReader
/**
try
XMLReader를 사용하는 예제
{
**/
reader = xcomm.ExecuteXmlReader();
using System;
while (reader.Read())
using System.Data;
{
using System.Data.SqlClient;
switch (reader.NodeType)
using System.Xml;
{
class CommandXmlTest
case XmlNodeType.Element:
{
Console.Write("<{0}>", reader.Name);
public static void Main()
break;
{
case XmlNodeType.Text:
string conStr = "Server=localhost;user
id=sa;password=csharp777;database=ADOTest";
Console.Write(reader.Value.Trim());
break;
string xquery = "select * from Address FOR XML AUTO,
ELEMENTS";
case XmlNodeType.EndElement:
Console.WriteLine("</{0}>", reader.Name);
SqlConnection conn = new SqlConnection(conStr);
break;
conn.Open();
}
SqlCommand xcomm = new SqlCommand(xquery, conn);
XmlReader reader = null;
}
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
finally
{
reader.Close();
conn.Close();
c#
}
34 / 33
DataSet과 DataAdapter
17장. ADO.NET
DataSet 과 DataAdapter
DataSet
.NET 데이터 공급자
Connection
Transaction
Command
Transaction
DataReader
DataAdapter
SelectCommand
InsertCommand
DataTable
DataRowCollection
DataColumnCollection
UpdateCommand
DeleteCommand
Database
c#
DataTableCollection
ConstraintCollection
DataRelationCollection
XML
36 / 33
17장. ADO.NET
.Net에서 이용되는 데이터 구조
Command
DataReader
연결지향
Database
DataSet
Connection
DataAdapter
비연결지향
c#
37 / 33
17장. ADO.NET
DataAdapter 속성과 함수
▣
DataAdapter 속성
◈
DeleteCommand
– 삭제 명령을 사용하는 Command 필드
◈
InsertCommand
– 입력 명령을 사용하는 Command 필드
◈
SelectCommand
– 조회 명령을 사용하는 Command 필드
◈
UpdateCommand
update()
DataAdapter
SelectCommand
InsertCommand
DataSet
UpdateCommand
DeleteCommand
– 수정 명령을 사용하는 Command 필드
▣
DataAdapter 주요 함수
◈
Fill()
FillSchema()
Fill()
– 데이터 원본에 있는 데이터를 DataSet의 DataTable에 넣어준다.
◈
FillSchema()
– 데이터 원본의 스키마에 맞게 DataSet에 DataTable을 생성한다.
◈
Update()
– DataSet의 DataTable에서 변경된 데이터를 원본에 반영시킨다.
c#
38 / 33
17장. ADO.NET
DataSet의 구성요소
.Net DataSet 구성요소
DataTable
DataTable
DataTable
DataRow
DataRow
DataColumn
DataRow
DataTable
Constraint
DataColumn
DataRow
DataRelation
Constraint
DataColumn
DataRelation
Constraint
DataColumn
Constraint
DataRelation
DataRelation
DataSet의 개념상의 구성요소
DataSet
DataColumnCollection
DataColumnCollection
DataColumnCollection
DataColumnCollection
DataColumnCollection
DataRowCollection
DataColumnCollection
DataColumnCollection
DataTableCollection
DataColumn
DataTable
DataTable
DataTable
DataColumn
DataColumn
DataRow
DataRow
DataTable
DataRow
39
c#
39 / 33
17장. ADO.NET
DataSet의 계층구조
DataSet
DataColumnCollection
DataColumnCollection
DataTableCollection
DataTable
c#
DataColumnCollection
DataColumnCollection
DataColumnCollection
DataColumnCollection
DataColumnCollection
DataRowCollection
DataColumn
DataRow
40 / 33
17장. ADO.NET
DataSet을 만드는 방법 I
1.
Connection 생성 및 Open
◈
◈
◈
2.
DataAdapter 생성
◈
3.
◈
string query = "select * from Address";
adapter.SelectCommand = new SqlCommand(query, conn);
DataSet 생성
◈
5.
SqlDataAdapter adapter = new SqlDataAdapter();
SqlCommand 할당
◈
4.
string conStr = "Server=localhost;user id=sa;password=csharp777;database=ADOTest";
SqlConnection conn = new SqlConnection(conStr);
conn.Open();
DataSet ds = new DataSet();
DataAdapter를 이용해서 DataSet 채우기
◈
adapter.Fill(ds);
6.
작업수행
7.
연결 닫기
◈
conn.Close();
41
c#
41 / 33
17장. ADO.NET
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();
c# }
42 / 33
17장. ADO.NET
DataSet으로 작업하기
▣
Connenction 생성과 Open
◈
◈
◈
▣
DataSet의 계층구조
adapter.Fill(ds);
DataSet
Connection 닫기
◈
▣
DataSet ds = new DataSet();
Adapter를 통해서 DataSet 채우기
◈
▣
string query = "select * from Address";
adapter.SelectCommand = new SqlCommand(query, conn);
DataSet 생성
◈
▣
SqlDataAdapter adapter = new SqlDataAdapter();
Adapter에 SelectCommand 할당
◈
▣
▣
string conStr = "Server=localhost;user id=sa;password=csharp777;database=ADOTest";
SqlConnection conn = new SqlConnection(conStr);
conn.Open();
SqlDataAdapter 생성
◈
▣
DataAdapter를 생성할 때 디폴트 생성자를
사용한 후 sqlCommand를 할당
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();
}
Tables
DataColumnCollection
DataColumnCollection
DataTableCollection
DataTable
DataColumnCollection
DataColumnCollection
DataColumnCollection
DataColumnCollection
DataColumnCollection
DataRowCollection
DataColumn
DataRow
Rows
Columns
43
c#
43 / 33
17장. ADO.NET
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 SqlDataAdapter();
c#
//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();
//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();
}
}
}
44 / 33
17장. ADO.NET
DataSet을 만드는 방법 II
▣
Connection 생성 및 Open
◈
◈
◈
▣
DataAdapter에 SQL 쿼리와 Connection을
매개 변수로 사용하는 방법
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);//테이블의 이름
SqlDataAdapter adapter = new SqlDataAdapter();
◈ conn.Close();
◈
▣
DataSet으로 작업하기
◈
◈
◈
◈
◈
◈
◈
c#
string query = "select * from Address";
adapter.SelectCommand = new SqlCommand(query,
conn);
DataSet ds = new 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();
}
45 / 33
45
17장. ADO.NET
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();
}
c# }
46 / 33
17장. ADO.NET
DataSet의 Update()
▣
DataSet에서 InsertCommand 명령을 수행하는 방법
◈
◈
◈
DataSet 자체에 레코드를 삽입한다.
DataAdapter에 SqlCommand를 지정한다.
DataAdapter를 이용해서 DataSet을 데이터베이스로 업데이트한다.
DataSet의 InsertCommand 명령 수행
DataSet
DataAdapter에
SqlCommand 지정
(Insert 문장)
DataColumnCollection
DataColumnCollection
DataTableCollection
2
1
DataTable
새로운 Row 삽입
Database
DataAdpater를 이용해서 Update()
DataRow
3
DataRow row =
table.NewRow();
row["id"] = "8";
row["name"] = "Uncle";
row["addr"] = "Ameria";
table.Rows.Add(row);
47
c#
47 / 33
2.
3.
4.
5.
SqlDataAdapter adapter = new SqlDataAdapter("select * from Address", conn);
DataSet ds = new DataSet("MyAddressDataSet");//DataSet의 이름
adapter.Fill(ds, "Address");//테이블의 이름
conn.Close();
DataTable table = ds.Tables["Address"];
6.
7.
8.
9.
10.
11.
//1. DataRow 생성하여 Row를 삽입하기
DataRow row = table.NewRow();
row["id"] = "8";
연결형으로 처리하는 것 고려
row["name"] = "Uncle";
모든 자료를 client로 down하여
row["addr"] = "Ameria";
1건을 입력하여 처리하는 것은 비효율적임
table.Rows.Add(row);
12.
13.
14.
15.
16.
17.
18.
//2. SqlCommand 지정하기
conn.Open();
string strSql="Insert into Address(id, name, addr)values(@id, @name, @addr)";
adapter.InsertCommand = new SqlCommand(strSql, conn);
adapter.InsertCommand.Parameters.Add("@id", SqlDbType.TinyInt, 0, "id");
adapter.InsertCommand.Parameters.Add("@name", SqlDbType.Char, 20, "name");
adapter.InsertCommand.Parameters.Add("@addr", SqlDbType.Char, 40, "addr");
19.
20.
21.
//3. DataAdapter를 이용하여 DataSet 업데이트하기
adapter.Update(ds, "Address");
conn.Close();
1.