티스토리 뷰

반응형

프로그래밍을 하게되면

필수적으로 같이 따라올수밖에 없는것이 바로

데이터베이스(DB)라고 할 수있다.

물론 DB연결없이 프로그래밍을 할 수 없는것은 아니지만

DB와 연동하는 프로그래밍은 훨씬 더 다양하고

큰 규모의 프로그램을 작성할 수 있기 때문에 필수라고 할 수 있다.

그래서 오늘은

C#에서 데이터베이스를 어떻게 연결하는지 그리고 쿼리는 어떻게 실행하는지에 대해서 정리를 해보려고한다.

우선

ADO를 이용한 DB접속방법부터.

아, 참고로 언어는 C#, DB는 SQL Server(MS-SQL)임을 먼저 밝힌다.

ADO는 ActiveX Data Object의 줄임말로 DB에 접근하기 위해서 필요한 컴포넌트로

마이크로소프트에서 제작하고 제공하는 인터페이스라고 할 수있다.

VB나 asp또는 .net을 사용해본 경험이 있다면

ADO를 사용해서 Connection, Command, Recordset등의 개체를 사용한 경험이 있을지도 모르겠다.

C#응용프로그램에서 ADO를 사용하기 위해서는 다음과 같은 코드가 필요하다.

using System;
using System.Data;
using System.Data.SqlClient;

 

 

 

 

 

그리고 DB에 연결하기위한 연결문구를 작성해야 하는데

OLE DB연결의 경우와 SqlClient연결의 경우 문구가 조금 다르다.

참고로 OLE DB란

DB의 종류는 다양하고 그에따라 연결문구가 다를경우에 프로그래밍을 하기에 복잡해지는 문제를 해결하기위해

마이크로소프트에서 제작한 통일된 표준 인터페이스이다.

SqlClient도 OLE DB와 마찬가지로 DB에 접근하기 위한 Provider(공급자)로 이해하면되고...

다른 공급자로는 ODBC, OracleClient도 있긴한데.. 어차피 사용자 입장에서는 내용을 몰라도 사용할 수 있기 때문에

OLE DB, SqlClient, ODBC 등은 DB에 접근하고 명령어를 실행할 수 있도록 해주는 것 정도로 알고 넘어가면 된다.

얘기가 잠깐 딴길로 빠졌는데... 다시 돌아와서

//OleDb 연결의 경우
Provider=SQLOLEDB.1;User ID=sa;Initial Catalog=pubs;Data Source=(local)

//SqlClient 연결의 경우
User ID=sa;Initial Catalog=pubs;Data Source=(local)

연결문구는 위를 참고하면 되겠다.

그냥 쓱~ 봐도 대충 알겠지만

User ID는 사용자 계정이고 Catalog는 DB명, Data Source는 서버주소를 의미한다.

참고로 서버주소가 local이 아닌경우에는 192.168.xxx.xxx와 같이 IP주소가 될수도 있으니

자신의 환경에 맞게 셋팅하면된다.

연결문구를 string형 변수하나 생성해서 저장해주고

다음과 같이 Connection객체를 하나 생성해주고 연결할 수 있다.

SqlConnection objConn = new SqlConnection(sConnectionString);
objConn.Open();

이렇게 하면 연결이 되는데

연결이 되었지는 여부는 다음과 같이 확인할 수도 있으니 참고.

if (objConn.State == ConnectionState.Open)
{
	MessageBox.Show("연결성공")
}
else
{
	MessageBox.Show("연결실패")
}

연결이 된것이 확인되었다면 이제 Sql문을 실행시켜야 하는데

이때 Command 또는 OleDbCommand 개체를 사용해서 Sql문을 장착(?)하게 된다. ㅎㅎ

string sSQL = "INSERT INTO Employee " + 
  "(emp_id, fname, minit, lname, job_id, job_lvl, pub_id, hire_date) " + 
  "VALUES ('MSD12923F', 'Duncan', 'W', 'Mackenzie', 10, 82,'0877','2001-01-01')";
SqlCommand objCmd = new SqlCommand(sSQL,objConn);

Command객체에 쿼리문을 장착했다면

objCmd.ExecuteNonQuery();

위와 같은 명령문을 사용해서 쿼리문 실행이 가능하다.

 

 

 

 

 

위의 예제는 insert, update, delete문등 결과 반환값이 없는 쿼리문을

어떻게 실행하는지에 대해서 정리한 것이고

반환값이 있는 select를 사용하는 방법은 비슷하지만 조금 다르다.

우선 Connection 개체를 사용해서 DB와 연결하는 부분까지는 동일하게 진행된다.

그런데 select의 경우에는 쿼리를 실행하고 끝나는게 아니라 반환값을 읽어와야하기 때문에

SqlDataReader란 객체를 사용해서 쿼리를 실행한 반환값을 받도록 해야한다.

SqlCommand com = new SqlCommand();
string sSQL = "SELECT EmployeeID, LastName FROM Employees"
com.CommandText = sSQL;

SqlDataReader sr = com.ExecuteReader();

// 참고로
// 위 insert문 사용예제처럼
// SqlCommand objCmd = new SqlCommand(sSQL,objConn);
// 이런식으로 사용해도 똑같다.

뭐... 따로 설명하지 않아도 될거 같긴하데

Command객체를 하나 생성하고 CommandText에 Sql문을 하나 장전한 후에

ExecuteReader로 Sql문을 실행한 반환값을 SqlDataReader로 받도록 하는 것이다.

자.. 정상적으로 select쿼리가 실행되었다면 다음 Step.

while (sr.Read())
{
	MessageBox.Show("select 결과 : EmployeeID" + sr["Emplyee"] + ", LastName : " + sr["LastName"]);   
}

while문은 SqlDataReader가 반환받은 값을 전부 읽을 때까지 반복하라는 의미이고

반환값은

sr["컬럼명"]

의 형식으로 가져올 수 있다.

여기까지 했으면 DB연결과 기본적인 쿼리사용에 대해서는 어느정도 정리가 된 거 같은데

매번 프로그래밍을 할 때 조금만 더 디테일에 신경을 쓴다면 훨씬 성장할 수 있지않겠냐는 생각으로

조금 더 덧붙이자면

1. 객체를 사용했다면 사용이 끝난 후 다시 반환하는 습관을 들이기.

이 부분은 Connection, SqlDataReader등 new 키워드를 사용해서 메모리에 탑재한 객체를 사용이 끝난 후

다시 반환하는 부분을 명시하는 것을 말한다.

요즘은 C#도 가비지 컬렉터가 상당히 좋아져서 사용한 자원을 알아서 다시 반환한다고는 하지만

그래도 개발자 본인이 사용한 객체에 대해서 사용히 끝난후 반환한다는 것은 기본이라고 생각한다.

예전에는 상당히 중요한 내용이었으나... 요즘은 어떤지 모르겠다만..

어쨌든 new와 close는 한몸(?)이라고 생각하고 잘 챙겼으면 한다.

※ 근데... 사용이 끝나지도 않았는데 close를 해서 오류가 발생하지 않도록 이것도 신경써야함...

2. DB연결, Sql문작성 및 실행을 하는 부분은

프로그램 작성이 디자인 타임이든 런타임이든 에러가 빈번하게 발생하기 마련이다.

디자인 타임에러라면 괜찮지만(?)

런타임 에러가 발생한다면 제작된 프로그램을 사용하는 유저 입장에서

갑자기 응용프로그램이 강제종료 된다던지 하는 불행한 사태가 발생할 수 있고

프로그래머 입장에서도 왜 에러가 발생하는지에 대한 오류보고를 받기가 어렵기 때문에

디버깅이 어려워질 수 있다는 점이 있다.

따라서 try catch finally 문을 사용하는 것,

그리고 런타임 에러 발생시 응용프로그램이 강제종료된다던지 하는 부분을 에러처리하고

어떤 종류의 에러가 발생했는지도 표시하는 것에 익숙해지도록 하는 것.

여기에 신경을 쓴다면 좀 더 고급스러운 프로그래밍을 할 수 있을거라고 생각한다.

※java의 경우에는 try catch문을 사용하지 않으면 오류가 발생하도록 되어있는데

C#의 경우에는 어떤지 잘 모르겠지만... 오류가 안나는거 같아서 덧붙여본다.

그럼 오늘은 이만 끝 즐프~!

 

반응형
댓글
반응형
05-19 00:16
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함