본문 바로가기

C#.NET

[:::::비연결 Database 접근방법:::::]

데이터베이스 연동

[:::::비연결 Database 접근방법:::::]

 비연결 DataBase 접근방법의 발생 배경:

DataSet과 DataAdapter는 Web Programming 작업에 가장 큰 문제가 되는 DataBase의 과부하 문제에 대한 해결책으로 제시되는 .Net의 새로운 Architecture이다.

 

연결기반

 

  

비연결기반

 

 

 

 

DataAdapter 

연결지향방식의 'Command' Level에 존재하면서 'Connection'으로부터 DataSet을얻어내는 명령을 실행하는 역할을 담당한다. 또한 Database로부터 DataSet에 값을 채우거나 필요로 할 때 데이터베이스로 업데이트가 가능하다. 또한 이를 사용한 작업을 통해 Dataset을 추출할 수 있다.

DataSet 

DataAdapter로부터 얻어진 결과물로서, ADO.NET의 비연결 접근방법의 핵심이다. 메모리에 구현된 완벽한 데이터베이스이며 서버의 DB에 대한 복사본으로 DataSet의 구현이 가능하다. 구성요소는 DataTable들의 집합으로 이루어져 있고, 다시 DataTable들은 아래 그림과 같이 (행, 열, 제약조건, 관계)로 구성되어진다.

DataAdapter와 DataSet의 관계

DataAdapter실행 후에는 DataSet이라는 결과를 도출하고 데이터베이스와 연결을 끊은 상태에서 DataSet만으로 필요한 작업을 수행.

 

다시말해서 DataSet만으로 DB작업을 수행. 변경한 DataSet의 내용을 데이터베이스에 업데이트하므로 모든 작업이 종료됨.

 

DataSet Insatance Model's Main Classes

DataSet

  • 전체 DataSet을 담을 수 있으며, 하나 이상의 테이블 또는 전체 DB를 담을 수 있다.

DataTable

  • 하나의 테이블 정보를 담을 수 있다.

DataRow

  • 테이블에서 하나의 행에 해당하는 정보를 담고 있다.

DataColumn

  • 테이블에서 하나의 열에 해당하는 정보를 담고 있다.

DataRelation

  • 두 테이블 사이에 관계를 담고 있다.

Constraint

  • 테이블에서 값을 제어하는 규약을 담고 있다.

 

 

DataAdapter의 속성과 주요 함수

속성

Delete Command 

레코드를 데이터 집합으로부터 삭제할SQL문이나 저장 프로시저를 가져오거나 설정

Insert Command 

새로운 레코드를 데이터 소스에 삽입할 SQL문이나 저장 프로시져를 가져오거나 설정

Select Command 

데이터 소스에서 레코드를 선택하는데 사용

Update Command 

데이터 소스에서 레코드를 업데이트하는데 사용

주요 함수(메서드)

Fill() 

데이터 원본에 있는 데이터를 DataSet의 DataTable에 넣어준다. 또한 Connection 객체가 닫혀 있을 경우에는 DB와 순간적으로 연결하여 데이터를 채우고 Close한다. 하지만 Connection 객체가 열려 있는 상태에서는 데이터를 채우고 명시적으로 Close()해 주어야 한다.

FillSchema() 

테이블의 스키마 정보를 DataSet으로 전송. (= 테이블 정보를 가져와 DataSet의 DataTable만 생성= 테이블 내의 데이터는 제외한다.) Constraint 조건이나, DataType이 String이라면 문자열의 길이 등의 정보를 알 수 있다.

 

Connection 상태에 따라 다른 처리를 가지는데

Connection이 닫힌 경우 : DB와의 연결을 순간적으로 열어 Data를 채우고 다시 닫는다.

Connection이 열린 경우 : DB와의 연결을 유지한 상태에서 Data를 채워주며, 닫기 위해서는 명시적으로 닫아야 한다.

Update() 

DataSet으로 작업하면 DataSet 내의 DataTable의 데이터만 변경되므로 실제 DB서버의 내용이 변경되는 것은 아니다. 그러므로 DataSet의 DataTable에서 변경된 데이터를 원본에 반영하고자 할 때 사용한다.

 

 

DataAdapter를 이용하여 DataSet을 생성하는 과정

  • NameSpace 명시

          Using System.Data;

          Using System.Data.SqlClient;

  • 연결문자열 설정 및 Connection 객체 생성 및 열기

String strConn='server=.\\SQLEXPRESS; user id=sa; password=dba007$; database=mytest";

  • DataAdapter생성

          SqlDataAdapter sda=new SqlDataAdapter();

  • DataAdapter에 적당한 SqlCommand 설정

          String strqry="SELECT * FROM mytest";

          Sda.SelectCommand=new SqlCOmmand(strqry,Conn);

  • DataSet 생성

          DataSet ds=new DataSet();

  • DataAdapter를 이용하여 DataSet 채우기

          Sda.Fill(ds);

  • 연결닫기

          Conn.Close();

  • DataSet으로 필요한 작업 수행

 

 



5_15_DataSetEx1 

using System;

using System.Collections.Generic;

using System.Text;

using System.Data;

using System.Data.SqlClient;

 

namespace __15_DataSetEx1

{

class Program

{

static void Main(string[] args)

{

try

{

//연결문자열설정

string strConn = "server=VMWIN2003; database=mytest; user id=sa; password=dba007$";

 

//Connection객체생성및Open

SqlConnection Conn = new SqlConnection(strConn);

Conn.Open();

 

//SqlDataAdapter 생성

SqlDataAdapter sda = new SqlDataAdapter();

 

//SqlDataAdapter에SelectCommand명령할당

sda.SelectCommand = new SqlCommand("SELECT * FROM ExecuteNonQuery", Conn);

 

//DataSet 생성(DataSet is Collection of DataTalbe )

DataSet ds = new DataSet();

 

//SqlDataAdapter를이용하여생성한DataSet에데이터채우기

sda.Fill(ds);

 

//연결닫기

Conn.Close();

 

/* -- -- -- -- -- -- -- */

//Memory에존재하는지여부확인하기

DataTable table = ds.Tables[0];

 

DataRowCollection rows = table.Rows;

 

//DataRow의DataTable의데이터행(Record)를표시.

foreach (DataRow dr in rows)

{

for (int i = 0; i < table.Columns.Count; i++)

Console.Write("{0}" + "\t", dr[i]);

Console.WriteLine();

}

}

catch(Exception E)

{

Console.WriteLine(E.ToString());

}

Console.Read();

}

}

}

 

 



DataSet을 이용해서 새로운 데이터 INSERT하기

 

DataAdapter로부터 얻어진 DataSet에 데이터를 변경하여 실제 SQL2005SERVER에 변경된 내용이 적용되도록 하자.

 

이 때 사용되는 DataAdapter 속성은 Insert Command이다.

 

주요처리 순서

  • DataSet 자체에 레코드를 삽입
  • DataSet에 SqlCommand를 지정
  • DataAdapter를 이용해서 DataSet을 SQL2005Server에 Update한다.

 

5_15_InsertCommandEx1

using System;

using System.Collections.Generic;

using System.Text;

using System.Data;

using System.Data.SqlClient;

 

namespace __15_InsertCommandEx1

{

class Program

{

static void Main(string[] args)

{

try

{

//연결 문자열

string strconn = "server=VMWIN2003; database=mytest; user id=sa; password=dba007$";

 

//Connection

SqlConnection Conn = new SqlConnection(strconn);

Conn.Open();

 

//SqlDataAdapter 생성

SqlDataAdapter sda = new SqlDataAdapter("SELECT * FROM ExecuteNonQuery", Conn);

 

//DataSet 생성

DataSet ds = new DataSet("testDataset");

 

//생성된 DataSet ds에 sda을 이용해서 채우기

sda.Fill(ds);

 

//Disconnection

Conn.Close();

 

/* -- -- -- -- -- */

//결과값 확인

DataTable table = ds.Tables[0];

Console.WriteLine("==========Before Insert of Data==========");

DataRowCollection rows = table.Rows;

 

//DataRow 데이터 행을 나타냄

foreach (DataRow dr in rows)

{

for (int i = 0; i < table.Columns.Count; i++)

Console.Write("{0}", dr[i] + "\t");

Console.WriteLine();

}

 

//Data행을 DataSet에 Insert하기

DataRow row = table.NewRow();

row["name"] = "씨댕스키";

row["tel"] = "0123456789";

 

//지정된 값을 사용하여 레코드를 만들고 그 값을 DataTable인 table에 추가

table.Rows.Add(row);

 

//connection

Conn.Close();

 

//update를 위해 명령문자열 생성하기

string strqry = "INSERT INTO ExecuteNonQuery VALUES(@name,@tel)";

 

//Command Matching 시키기

sda.InsertCommand = new SqlCommand(strqry, Conn);

 

//Parameter 추가

sda.InsertCommand.Parameters.Add("@name", SqlDbType.VarChar, 12, "name");

sda.InsertCommand.Parameters.Add("@tel", SqlDbType.VarChar, 15, "Tel");

 

//DataAdapter를 이용하여 SQL2005 Server에 변경된 내용을 적용.

sda.Update(ds);

 

//Disconnect

Conn.Close();

 

/* -- -- -- -- -- */

//Insert된 결과를 현재 Memory에 존재하는지 ds로부터 확인

Console.WriteLine("==========After Insert of Data==========");

foreach (DataRow dr in rows)

{

for (int i = 0; i < table.Columns.Count; i++)

Console.Write("{0}", dr[i] + "\t");

Console.WriteLine();

}

}

catch (Exception E)

{

Console.WriteLine(E.ToString());

}

Console.Read();

}

}

}

 



 

using System;

using System.Collections.Generic;

using System.Text;

using System.Data;

using System.Data.SqlClient;

 

namespace __15_UpdateCommandEx1

{

class Program

{

static void Main(string[] args)

{

try

{

// 연결문자열

string strConn = "server=VMWIN2003;database=mytest;user id=sa;password=dba007$";

 

// 연결객체생성및오픈

SqlConnection Conn = new SqlConnection(strConn);

Conn.Open();

 

// SqlDataAdapter 생성

SqlDataAdapter Dadapter = new SqlDataAdapter("SELECT * FROM ExecuteNonQuery", Conn);

 

// Command 객체(Object)

Dadapter.UpdateCommand = new SqlCommand("UPDATE ExecuteNonQuery SET name=@name WHERE Tel=@Tel", Conn);

 

// 파라미터설정

Dadapter.UpdateCommand.Parameters.Add("@name", SqlDbType.VarChar, 12, "name");

Dadapter.UpdateCommand.Parameters.Add("@Tel", SqlDbType.VarChar, 15, "Tel");

 

// DataSet 생성

DataSet Dset = new DataSet();

 

// DataSet 에데이터채우기

Dadapter.Fill(Dset, "ExecuteNonQuery");

Conn.Close();

 

// --- --- --- ---

//Memory에있는Data로구성된DataTable의DataType을나타내는Row Class

DataRow row = Dset.Tables["ExecuteNonQuery"].Rows[0];

row["name"] = "쑤댕쓰키";

row["Tel"] = "0123456789";

 

//실제적용되어지는것을확인하기위해

 

Conn.Open();

int intreturn;

intreturn = Dadapter.Update(Dset, "ExecuteNonQuery"); // 성공한행수를반환

Conn.Close();

 

if (intreturn > 0)

{

Console.WriteLine("성공적으로Update가{0}개수행되었습니다.", intreturn);

}

else

{

Console.WriteLine("Update가실패하였습니다, 확인해주세요");

}

 

}

catch (SqlException se)

{

Console.WriteLine(se.ToString());

}

Console.ReadLine();

}

}

}

'C#.NET' 카테고리의 다른 글

OleDb를 이용한 DataBase연결  (0) 2009.05.14
DataBase Access 기술동향  (0) 2009.05.13
Transaction 이용하기  (0) 2009.05.13
MSSQL LOCK  (0) 2009.05.13
:::::[트랜잭션(Transaction)]:::::  (0) 2009.05.13
Stored Procedure를 이용한 DB Handling  (1) 2009.05.13
클래스 소멸자와 Garbage Collector  (0) 2009.05.08
클래스 멤버로의 접근제한하기  (0) 2009.05.08
NotifyIcon  (0) 2009.05.08
트리뷰(TreeView)  (0) 2009.05.07