[C#] C#에서 MySQL 연동 사용하기

MySQL Connector/Net 사용

C#에서 MySQL을 엑세스하기 위해서는 일반적으로 MySQL을 위한 ADO.NET 드라이버인 MySQL Connector/Net을 사용하는데, 이 MySQL Connector/Net은 MySQL 웹사이트에서 무료 다운 받아 설치할 수 있다. 드라이버를 설치한 후에 C# 프로젝트에서 MySql.Data.dll를 참조한 후 MySql.Data.MySqlClient 네임스페이스를 참조하면, MySQL버젼의 ADO.NET 클래스들 (예: MySqlConnection, MySqlCommand, MySqlDataReader 등)을 이용할 수 있다.

 

[dropshadowbox align=”none” effect=”lifted-both” width=”100%” height=”” background_color=”#ffffff” border_width=”1″ border_color=”#dddddd” ]

using MySql.Data.MySqlClient;

MySqlConnection conn = new MySqlConnection(strConn);

[/dropshadowbox]

MySQL 데이타베이스 연결

MySQL 데이타베이스를 연결하기 위해서는 MySqlConnection 클래스를 사용한다. 이 클래스를 생성할 때, Connection String을 넣어 주어야 하는데, 여기에는 Server명, DB명, 사용자명, 암호등을 지정해 준다. 아래 예는 로컬 MySQL 서버에 root 사용자명과 암호명 123을 사용하여 test 데이타베이스에 접속하는 예이다.

[dropshadowbox align=”none” effect=”lifted-both” width=”100%” height=”” background_color=”#ffffff” border_width=”1″ border_color=”#dddddd” ]

string strConn= “Server=localhost;Database=test;Uid=root;Pwd=123;”;
MySqlConnection conn = new MySqlConnection(strConn);

conn.Close();

[/dropshadowbox]

MySQL 데이타 INSERT, UPDATE, DELETE 

데이타의 삽입, 삭제, 갱신등은 MySqlCommand에 해당 SQL문을 지정하여 실행한다. 일반적인 절차는 MySqlConnection을 사용해 서버 연결을 한 후, MySqlCommand에 INSERT, UPDATE, DELETE 등의 SQL문을 지정한 후 실행한다. 아래 예제는 한 ROW를 INSERT한후 이를 UPDATE하는 예이다.

[csharp]

private static void InsertUpdate()
{
string strConn = "Server=localhost;Database=test;Uid=root;Pwd=zzz;";

using (MySqlConnection conn = new MySqlConnection(strConn))
{
conn.Open();
MySqlCommand cmd = new MySqlCommand("INSERT INTO Tab1 VALUES (2, ‘Tom’)", conn);
cmd.ExecuteNonQuery();

cmd.CommandText = "UPDATE Tab1 SET Name=’Tim’ WHERE Id=2";
cmd.ExecuteNonQuery();
}
}

 

[/csharp]

MySQL 데이타 읽기 

MySQL의 데이타를 가져오기 위해서는 MySqlCommand/MySqlDataReader 혹은 MySqlDataAdapter를 사용한다. MySqlDataReader는 연결모드로 데이타를 서버에서 가져오는 반면, MySqlDataAdapter는 한꺼번에 클라이언트 메모리로 데이타를 가져온후 연결을 끊는다. MySqlDataAdapter에서 가져온 데이타는 주로 DataSet 객체 안에 메모리상의 테이블 형태로 존재하는데, 이를 각종 컨트롤들에게 바인딩시킬 수 있다.

[csharp]
private static void SelectUsingReader()
{
string connStr = "Server=localhost;Database=test;Uid=root;Pwd=zzz;";

using (MySqlConnection conn = new MySqlConnection(connStr))
{
conn.Open();
string sql = "SELECT * FROM Tab1 WHERE Id>=2";

//ExecuteReader를 이용하여
//연결 모드로 데이타 가져오기
MySqlCommand cmd = new MySqlCommand(sql, conn);
MySqlDataReader rdr = cmd.ExecuteReader();
while (rdr.Read())
{
Console.WriteLine("{0}: {1}", rdr["Id"], rdr["Name"]);
}
rdr.Close();
}
}

private static void SelectUsingAdapter()
{
DataSet ds = new DataSet();
string connStr = "Server=localhost;Database=test;Uid=root;Pwd=zzz;";

using (MySqlConnection conn = new MySqlConnection(connStr))
{
//MySqlDataAdapter 클래스를 이용하여
//비연결 모드로 데이타 가져오기
string sql = "SELECT * FROM Tab1 WHERE Id>=2";
MySqlDataAdapter adpt = new MySqlDataAdapter(sql, conn);
adpt.Fill(ds, "Tab1");
}

foreach (DataRow r in ds.Tables[0].Rows)
{
Console.WriteLine(r["Name"]);
}
}

[/csharp]

한글 깨짐 현상이 있을 경우..
C# 과 mysql 연동시 한글깨짐 현상

DATABASE=AnyKeeperDBMS;SERVER=61.96.223.78;Connect Timeout=30;USER id=cnt;pwd=cnt;CHARSET=utf8
마지막에 CHARSET=utf8 추가 (DataBase 언어set이 utf8로 정의 되어있을 경우)

DB 쿼리


모든데이터 가져오기
SELECT * FROM member
SELECT m_code, m_name, m_id, M_sex, M_age, m_email FROM member
—————————————————————————
특정 컬럼 데이터 조회
SELECT m_name, m_code, m_sex FROM member
—————————————————————————
특정 레코드(로우) 가져오기
SELECT m_name, m_code, m_sex FROM member
where m_code=4
—————————————————————————
코드가 5보다 작은 사람들 모두의 회원코드, 이름, 성별 가져오기
SELECT m_name, m_code, m_sex FROM member
where m_code<5
—————————————————————————
회원중 아이디가 jungwon인 사람의 이름, 코드, 성별 가져오기
SELECT m_name, m_code, m_sex FROM member
where m_name=’jungwon’
—————————————————————————
회원 코드가 14보다 작은 친구들중 나이가 28살인 친구들의 이름, 아이디, 성별 가져오기
SELECT m_name, m_id, m_sex, m_age FROM member
where m_code<14 AND m_age=28
—————————————————————————
10살부터 20살 까지인 사람 가져오기
SELECT m_name, m_id, m_sex, m_age FROM member
where m_age>=10 AND m_age <=20
같다 where m_age BETWEEN 10 AND 20
—————————————————————————
‘김’ 자로 시작하는 친구 검색
SELECT m_name, m_id, m_sex FROM member
where m_name LIKE ‘김*’
—————————————————————————
나이가 27 28 29인 사람만 뽑기
SELECT m_name, m_id, m_age FROM member
where m_age =27 OR m_age= 28 OR m_age=29
같다  where m_age IN(27,28,29)
—————————————————————————
데이터 정렬
SELECT m_name, m_id, m_age FROM member
ORDER BY m_age ASC
—————————————————————————
두개 이상의 컬럼으로 데이터 정렬
SELECT m_name, m_id, m_age, m_day FROM member
ORDER BY m_age ASC DESC, m_day DESC
—————————————————————————
나이 평균
SELECT AVG(m_age) FROM member
갯수세기(null 값은 세지 않음)
SELECT COUNT(m_email)FROM member
중복되는 값을 한번씩만 보여준다.
SELECT DISTINCT(m_age) FROM member
—————————————————————————
서브쿼리
SELECT m_name, m_id, m_age FROM member
WHERE m_age>Select AVG(m_age form member)
서브쿼리 정렬
SELECT m_name, m_id, m_age FROM member
WHERE m_age > Select AVG(m_age from member)
ORDER BY m_age DESC
—————————————————————————
데이터 삽입하기
INSERT INTO member
(m_id, m_name, m_sex, m_age, m_email)
VALUES
(‘nforce’, ‘김정원’, ‘남’, 28,’nforce7050@nate.com’)
—————————————————————————
업데이트
UPDATE member
SET m_email = ‘sbs787@nate.com’  // 바꿀 내용을 입력한다.
WHERE m_name=’김정원’  //table에 있는 것을 그대로 입력
—————————————————————————
전체 바꾸기
UPDATE member
SET m_age = m_age + 1
—————————————————————————
삭제하기
DELETE FROM member
WHERE m_age = 28 // 해당 라인이 삭제된다.




[출처] SQL 쿼리(query) 내용|작성자 범프

VC++에서 ADO 사용 예제및 설명

ADO를 VC++에서 사용하는 방법을 간단하게 알아보자


 


1) 먼저, 테스트용의 mdb 파일을 작성합니다.



Access나, 그 외의 툴을 사용해 mdb 파일을 작성합니다. (적당한 툴이 없을 때는, WSH등을 사용해 작성하면 좋습니다.)
내용은 table1를 작성해서 필드로 field1(텍스트), field2(텍스트)를 작성합니다.
작성한 테이블에, 레코드를 1건 만들어 둡니다.


 


2) adotest.udl 파일을 작성합니다.


udl 파일을 만드는 방법은 메모장 같은 텍스트에디터 파일을 비운상태에서, “xxx.udl” 형태로 파일명을 지정한후, 바탕화면에 저장합니다.


이제, 바탕화면에서, “xxx.udl”를 선택후, 우측버튼을 클릭해서, 속성메뉴를 선택합니다. 이제, 아래순으로 진행 나갑니다.


 


3) ADO에서 사용할 provider(공급자)를 선택합니다.


 


adotest.udl 파일의 property(속성)을 통해,
프로바이더(공급자) 탭에서, ADO에서 사용하는 프로바이더를 선택합니다.
(여기에서는, mdb 파일을 사용하므로,
Microsoft Jet 3.51 OLE DB Provider,
Microsoft Jet 4.0 OLE DB Provider
등을 선택합니다.)


 


4) 데이터베이스명을 입력합니다.


 


접속 탭에서,
데이타베이스명을 입력 합니다.또는 선택합니다
여기서 지정하는 것은, db1.mdb 입니다.


 


5) 접속 테스트를 실행해봅니다.



접속 테스트 버튼을 눌러서, 접속 테스트를 실행해 봅니다.
성공하면, 준비는 완료,  이제 OK버튼을 누르고, 속성을 닫습니다.


 


6) vc++에서 ADO를 사용합니다.


 


가) StdAfx.h 파일을 열어서,맨 마지막줄의
#end if
보다 바로 위에,
#import “C:\Program Files\Common Files\System\ado\msado15.dll” no_namespace rename(“EOF”, “adoEOF”)
을 기술합니다. 환경에 따라서는 변경할 필요가 있을 수도 있습니다.


 


아래는, StdAfx.h의 소스 입니다.


—– 시작 —–


// stdafx.h : 표준의 시스템 인클루드 파일,

//


#if !defined(AFX_STDAFX_H__7EE7EAAB_0239_11D5_9E98_00105A8056E8__INCLUDED_)
#define AFX_STDAFX_H__7EE7EAAB_0239_11D5_9E98_00105A8056E8__INCLUDED_


#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000


#define VC_EXTRALEAN // Windows 헤더로부터 대부분 사용되지 않는 스탭을 제외합니다.


#include <afxwin.h> // MFC 의 코어 및 표준 컴퍼넌트
#include <afxext.h> // MFC 의 확장 부분
#include <afxdtctl.h> // MFC 의 Internet Explorer 4 코먼 컨트롤 서포트
#ifndef _AFX_NO_AFXCMN_SUPPORT
#include <afxcmn.h> // MFC 의 Windows 코먼 컨트롤 서포트
#endif // _AFX_NO_AFXCMN_SUPPORT


 


#import “C:\Program Files\Common Files\System\ado\msado15.dll” no_namespace rename(“EOF”, “adoEOF”)


#endif // !defined(AFX_STDAFX_H__7EE7EAAB_0239_11D5_9E98_00105A8056E8__INCLUDED_)


—– 끝 —–


 


나) ado를 사용할 클래스(ADOTEST.h/ADOTEST.cpp) 에서…


public 멤버변수로, 다음을 추가 합니다.


BOOL m_IsConnectionOpen;
_ConnectionPtr m_pConnection;

_ConnectionPtr는, COM를 사용하기 쉽게 해 주고 있는 것 같고,
다양한 연산자를 오버라이드(override) 하고 있습니다.
그러니까, m_pConnection는, “->” 등을 사용할 수도 있습니다. 또한, “.” 을 사용한 경우는, 실체의 멤버가 보이고,
“->”을 사용한 경우는, COM의 멤버에 접근할수 있습니다.


아래는, ADOTEST.h의 소스


 


// ADOTEST.h : ADOTEST


#if !defined(AFX_ADOTEST_H__7EE7EAA7_0239_11D5_9E98_00105A8056E8__INCLUDED_)
#define AFX_ADOTEST_H__7EE7EAA7_0239_11D5_9E98_00105A8056E8__INCLUDED_


#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000


#ifndef __AFXWIN_H__
 #error include ‘stdafx.h’ before including this file for PCH
#endif


#include “resource.h”  


 


class CADOTESTApp : public CWinApp
{
public:
 BOOL m_IsConnectionOpen;
 _ConnectionPtr m_pConnection;

 
 CADOTESTApp();


 // ClassWizard
 //{{AFX_VIRTUAL(CADOTESTApp)
 public:
 virtual BOOL InitInstance();
 //}}AFX_VIRTUAL


 //{{AFX_MSG(CADOTESTApp)
 
 //}}AFX_MSG
 DECLARE_MESSAGE_MAP()
};



/////////////////////////////////////////////////////////////////////////////


//{{AFX_INSERT_LOCATION}}


#endif // !defined(AFX_ADOTEST_H__7EE7EAA7_0239_11D5_9E98_00105A8056E8__INCLUDED_)


 


다) BOOL CADOTESTApp::InitInstance()에, ADO를 사용하는 코드를 기술합니다.


아래는, ADOTEST.cpp의 소스


 


BOOL CADOTESTApp::InitInstance()
{
 // OLE/COM 라이브러리를 초기화
 AfxOleInit();


 // ① 데이터베이스를 열기


 //  이후, 데이터베이스를 계속 사용하는 경우에는 계속 열어둡니다.


 


 // ADO의 Connection 객체 사용
 HRESULT hr;
 hr = m_pConnection.CreateInstance( __uuidof( Connection ) );
 if (SUCCEEDED(hr))
 {
   //데이터 베이스 연결을 udl 파일로 사용


   hr = m_pConnection->Open(
   _bstr_t(L”File Name=c:\\adotest.udl;”),
   _bstr_t(L””),
   _bstr_t(L””),
   adModeUnknown);
  if (SUCCEEDED(hr))
  {
     ::AfxMessageBox(“데이터베이스 연결됨”);
     m_IsConnectionOpen = TRUE;
  }
 }


 /*
 // RecordSet을 얻기
 if (m_IsConnectionOpen)
 {
  _RecordsetPtr pRecordSet;
  _bstr_t bstrQuery(“SELECT * FROM TABLE1”);
  _variant_t vRecsAffected(0L);


  pRecordSet = m_pConnection->Execute(bstrQuery,&vRecsAffected,adOptionUnspecified);


  if (!pRecordSet->GetadoEOF())
  {
   char DebugBuf[1024];
   _variant_t vFirstName;
   _variant_t vLastName;
   char szFirstName[1024];
   char szLastName[1024];
   while (!pRecordSet->GetadoEOF())
   {
    // RecordSet에서


    vFirstName = pRecordSet->GetCollect(L”Field1″);
    vLastName = pRecordSet->GetCollect(L”Field2″);
    strcpy(szFirstName,(_bstr_t)vFirstName);
    strcpy(szLastName,(_bstr_t)vLastName);
    sprintf(DebugBuf,”%s”,szFirstName);
    AfxMessageBox(DebugBuf);
    sprintf(DebugBuf,”%s”,szLastName);
    AfxMessageBox(DebugBuf);
    pRecordSet->MoveNext();
   }
  }
  pRecordSet->Close();
  pRecordSet = NULL;
 }
 */


 


 /*
 // INSERT 문
 if (m_IsConnectionOpen)
 {
  _bstr_t bstrQuery(“INSERT INTO TABLE1 (field1,field2) values (‘8′,’9’)”);
  _variant_t vRecsAffected(0L);
  m_pConnection->BeginTrans();
  m_pConnection->Execute(bstrQuery,&vRecsAffected,adOptionUnspecified);
  m_pConnection->CommitTrans();
 }
 */


 


 /*
 // UPDATE 문
 if (m_IsConnectionOpen)
 {
  _bstr_t bstrQuery(“UPDATE TABLE1 SET field1=’10’,field2=’11’ where field1=’1′”);
  _variant_t vRecsAffected(0L);
  m_pConnection->BeginTrans();
  m_pConnection->Execute(bstrQuery,&vRecsAffected,adOptionUnspecified);
  m_pConnection->CommitTrans();
 }
 */


 


 /*
 // DELETE 문
 if (m_IsConnectionOpen)
 {
  _bstr_t bstrQuery(“DELETE FROM TABLE1 WHERE FIELD1=’10′”);
  _variant_t vRecsAffected(0L);
  m_pConnection->BeginTrans();
  m_pConnection->Execute(bstrQuery,&vRecsAffected,adOptionUnspecified);
  m_pConnection->CommitTrans();
 }
 */


 


 // 데이터 베이스를 닫습니다.


 if (m_IsConnectionOpen)
 {
  ::AfxMessageBox(“데이터베이스를 닫습니다.”);
  m_IsConnectionOpen = FALSE;
  m_pConnection->Close();
 }


 


 // 리소스 해제


 m_pConnection = NULL;


 AfxMessageBox(“완료.”);


 return FALSE;
}


 


// www.codein.co.kr

MS SQL Server Express(2005)에서 사용자 추가 & 데이터베이스 생성


SQL Server Management Studio를 실행하자.


그러면 서버에 연결 대화상자가 나타난다. 일단 인증 항목에서 Windows 인증과 SQL Server 인증이 있는데 SQL Server 인증을 사용하기위해 (만약 SQL Server 인증 사용이 설정되어 있지 않다면…) 설정하는 것 부터 시작하자. Windows 인증에 연결 버튼을 클릭하자.




서버 항목에 (1번 항목) 마우스 오른쪽 버튼을 누르고 메뉴 항목에서 2번 항목에서 속성을 클릭한다. 그러면 서버 속성 대화상자가 나타난다.


여기서 서버 인증 항목에서 SQL Server 및 Windows 인증 모드를 선택하고 확인을 누르자. 그러면 다음과 같이 대화상자가 나타난다.


확인을 클릭하자. 일단 서버를 다시 시작하기전에 SQL Server 인증으로 로그인 할 수 있도록 sa 로그인을 가능하도록 하자.


게체 탐색기에서 보안->로그인->sa 항목을 마우스 오른쪽 클릭하여 메뉴에서 속성을 클릭하자. 그러면 로그인 속성 – sa 대화상자가 나타난다.


만약 암호를 다시 설정하고 싶으면 1번 항목을 선택하고 2번 항목에서 암호를 다시 입력하자. 다음에 SQL Server 인증으로 로그인이 되도록 설정하자.


항목에서 1번 상태 항목을 선택하고 2번, 3번을 선택한다. 그리고 확인을 누르자.


1번 데이터베이스 항목을 마우스 오른쪽 버튼 클릭하여 메뉴에서 2번 항목 다시 시작을 선택하자.


그리고 나타난 대화상자에서 예를 선택하자. 그렇면 데이터메이스가 다시 시작된다. 자 그렇면 새로운 데이터베이스 QuadraThreeDMap을 생성해보자.


개체 탐색기에서 데이터베이스를 마우스 오른쪽 버튼을 눌러 메뉴에서 항목에서 새 데이터베이스를 선택하자. 그렇면 새 데이터베이스 대화상자가 나타난다.


일단 1번 일반 항목에서 2번 데이터베이스 이름에 QuadraThreeDMap을 입력하여 확인 버튼을 누르자. 그러면 다음과 같이 데이터베이스가 추가된다.


자 인제 Quadra 사용자를 추가하자.


보안 항목에서 로그인 항목에 마우스 오른쪽 클릭해서 메뉴에서 새 로그인 항목을 선택한다. 그러면 로그인 – 신규 대화상자가 나타난다.


대화상자에서 일반 항목을 선택한후, 로그인 이름을 Quadra라고 입력하고, 3번 처럼 SQL Server 인증을 선택한 후 암호을 입력하고 편의를 위해 암호 만료 강제 적용 체크를 없애자. 또, 4번 항목에서 기본 데이터베이스와 기본 언어를 각각 QuadraThreeDMap과 Korean으로 하자.

다음에 사용자 매핑 항목을 선택하고, 2번 항목처럼 db_owner를 선택하고 3번 처럼 체크를 하고 확인을 누른다. 자 사용자 추가와 데이터베이스 추가를 마쳤다. 마지막으로 사용자에게 권한을 주어야 한다.


데이터베이스 속성에서 사용 권한을 위와 같이 주면 된다. 인제 모두 마쳤으므로, 확인을 위해 다시 데이터베이스 연결을 해보자.


파일 메뉴에서 개체 탐색기 연결…을 선택하자.


서버에 연결 대화상자에서 인증, 로그인, 암호를 입력하고 연결 버튼을 누르자.


끝…