2018년 10월 3일 수요일

C#에서 데이터 베이스에 연결하고, 쿼리를 실행하는 방법 (Mssql, .net)

개념은 잘 알고 있어도 막상 필요할때 코드를 작성할려면 매서드와 순서가 잘 기억나지 않는 애들이죠 ^^

저도 기억이 나질 않을때를 대비할겸 이번엔 C#에서 디비 연동과 쿼리 실행 부분에 대해서 알아보겠습니다.

(DB는 MSSQL을 기준으로 작성합니다만 윈도우 인증 부분을 제외하면 똑같으니 상관 없겠죠)

1. DB 연동
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
32
33
34
35
using System.Data.SqlClient;
//DB connection
SqlConnection sqlConnection = null;
//IP
string strDBIP = "127.0.0.1";
//ID
string strDBID = "user";
//PW
string strDBPW = "12345";
//DB
string strDBName = "dbName";
//DB 인스턴스 생성
public SqlConnection connSql()
{
   sqlConnection = new SqlConnection("server =" + strDBIP + "; uid =" + strDBID + "; pwd =" + strDBPW + "; database =" + strDBName);
   
   //윈도우 인증 계정일 경우엔
   sqlConnection = new SqlConnection("Server= localhost; Database= dbName Integrated Security = True;");
   
   //DB 오픈
   if (sqlConnection != null && sqlConnection.State == ConnectionState.Closed)
   {
       sqlConnection.Open();
   }
       return sqlConnection;
   }
}
//DB 연동
sqlConnection = connSql();

공통 파일에 위와 같은 매서드를 만들어 두고 35#와 같이 사용하여 디비와 연결할때 사용합니다.


2. 파라미터가 없는 일반 조회 쿼리
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
//조회 결과 데이터셋
DataSet Lds = new DataSet();
//쿼리
string srQuery = "SELECT * FROM TABLE;";
//DB 연결
SqlConnection sqlConnection = connSql();
//조회 요청
try
{
   SqlConnection sqlConnection = connSql();
   SqlDataAdapter Ldap = new SqlDataAdapter(srQuery, sqlConnection);
   //조회결과 저장
   Ldap.Fill(Lds);
}
catch (Exception exe)
{
   Console.WriteLine("조회 도중 에러 발생 : " + exe.Message);
}

1번의 방법으로 DB 인스턴스를 생성한 다음 15#의 SqlDataAdapter를 통해 쿼리를 실행한 다음 실행 결과를 18#에서 데이터셋에 담습니다.

조회 결과를 사용할땐
1
Lds.Tables[0].Rows[i][j].ToString().Trim();

요렇게 꺼내어 입맛에 맞는 형으로 변환시켜 사용합니다.

위에서 i부분은 조회 결과 열의 해당하고

j는 행에 해당합니다.

만약에 조회 결과가 2X2 형식인



이와 같다면 1행의 1열 데이터인 1을 사용할려면


1
Lds.Tables[0].Rows[0][0].ToString().Trim();

이렇게 0,0을 넣으시면 되고

2행의 2열 데이터인 4을 사용할려면


1
Lds.Tables[0].Rows[1][1].ToString().Trim();

1,1을 넣으시면 됩니다.



2. 실행 결과가 성공, 실패로 돌아오게 되는 추가, 삭제 쿼리 실행하는 방법

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
//쿼리 파라미터가 2개 들어가는 INSERT 쿼리
string srQuery = "INSERT INTO TABLE (COLSUMN1 ,COLUMN2) VALUES (@p1 ,@p2);";
//DB 연결
SqlConnection sqlConnection = connSql();
//저장 요청
try
{
   SqlConnection sqlConnection = connSql();
   SqlCommand commS = new SqlCommand(srQuery, sqlConnection);
   commS.Parameters.AddWithValue("@p1", "변수1");
   commS.Parameters.AddWithValue("@p2", "변수2");
                
   //쿼리 실행
   commS.ExecuteNonQuery();
}
catch (Exception exe)
{
   Console.WriteLine("저장 중 에러 발생 : " + exe.Message);
}

이번엔 값을 반환하는 SqlDataAdapter 대신 결과를 반환하는 SqlCommand을 사용하여 파라미터를 추가한 다음 쿼리를 실행합니다.

쿼리 실행 결과 자체로도 성공, 실패 여부를 알 수 있지만 위와 같이 그냥 TRY/CATCH문으로 해결하였습니다.

삭제도 쿼리만 다를 뿐 방식은 동일하며 조회도 조회 결과가 필요 없을 경우 위와 같은 방법으로 사용해도 상관 없습니다.



3. 파라미터가 있는 조회 쿼리

이번엔 쿼리 실행 결과 값도 필요하면서 파라미터도 넣어야 하는 상황인데요.

뭔가 어려울꺼 같지만 실제로는 1번에서 사용한 SqlDataAdapter 클래스에 파라미터를 넣는 매서드가 있어서 매우 간단히 해결할 수 있습니다 ^^

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
//조회 결과 데이터셋
DataSet Lds = new DataSet();
//쿼리 파라미터가 2개 들어가는 SELECT 쿼리
string srQuery = "SELECT * FROM TABLE WHERE COLUMN1 = @P1 AND COLUMN2 = @P2;";
//DB 연결
SqlConnection sqlConnection = connSql();
//조회 요청
try
{
   SqlConnection sqlConnection = connSql();
   SqlDataAdapter Ldap = new SqlDataAdapter(srQuery, sqlConnection);
   Ldap.SelectCommand.Parameters.Add(new SqlParameter("@P1", "변수1"));
   Ldap.SelectCommand.Parameters.Add(new SqlParameter("@P2", "변수2"));
                
   //조회결과 저장
   Ldap.Fill(Lds);
}
catch (Exception exe)
{
   Console.WriteLine("조회 중 에러 발생 : " + exe.Message);
}

1번의 방식에서 쿼리를 실행하기 전에 SelectCommand.Parameters.Add() 매서드를 통해 원하는 파라미터를 순서대로 지정해서 넣어주시면 됩니다.

잘못된 내용이나 궁금한점은 언제든 남겨주세요 ㅎㅎ
Share:

댓글 3개:

  1. DB오픈과 DB연동의 차이를 알 수 있을까요 ?

    답글삭제
  2. 감사합니다만 한가지만 더 알고 싶네요. DB연결 부분에 '35#와 같이 사용하여 디비와 연결할때 사용합니다. ' 라고 하셨는데 35#은 뭔가요 ? 혹시 게시물 중 하나인가요? 맞다면 출처라도 부탁드리겠습니다. 감사합니다 !

    답글삭제
  3. C# mssql을 통해서
    여러유저가 로그인하여 일기를 쓸수 있는 프로그램을 구현해보고 싶습니다.
    로그인폼/일기장폼

    답글삭제