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 등)을 이용할 수 있다.
using MySql.Data.MySqlClient;
MySqlConnection conn = new MySqlConnection(strConn);
MySqlConnection conn = new MySqlConnection(strConn);
MySQL 데이타베이스 연결
MySQL 데이타베이스를 연결하기 위해서는 MySqlConnection 클래스를 사용한다. 이 클래스를 생성할 때, Connection String을 넣어 주어야 하는데, 여기에는 Server명, DB명, 사용자명, 암호등을 지정해 준다. 아래 예는 로컬 MySQL 서버에 root 사용자명과 암호명 123을 사용하여 test 데이타베이스에 접속하는 예이다. (주: 한글 데이타 사용시 아래 [MySQL 한글 깨짐 현상 막기] 참조)
string strConn= "Server=localhost;Database=test;Uid=root;Pwd=123;";
MySqlConnection conn = new MySqlConnection(strConn);
...
conn.Close();
MySqlConnection conn = new MySqlConnection(strConn);
...
conn.Close();
MySQL 데이타 INSERT, UPDATE, DELETE
데이타의 삽입, 삭제, 갱신등은 MySqlCommand에 해당 SQL문을 지정하여 실행한다. 일반적인 절차는 MySqlConnection을 사용해 서버 연결을 한 후, MySqlCommand에 INSERT, UPDATE, DELETE 등의 SQL문을 지정한 후 실행한다. 아래 예제는 한 ROW를 INSERT한후 이를 UPDATE하는 예이다.
예제
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();
}
}
{
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();
}
}
MySQL 데이타 읽기
MySQL의 데이타를 가져오기 위해서는 MySqlCommand/MySqlDataReader 혹은 MySqlDataAdapter를 사용한다. MySqlDataReader는 연결모드로 데이타를 서버에서 가져오는 반면, MySqlDataAdapter는 한꺼번에 클라이언트 메모리로 데이타를 가져온후 연결을 끊는다. MySqlDataAdapter에서 가져온 데이타는 주로 DataSet 객체 안에 메모리상의 테이블 형태로 존재하는데, 이를 각종 컨트롤들에게 바인딩시킬 수 있다.
예제
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"]);
}
}
{
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"]);
}
}
MySQL 한글 깨짐 현상 막기
MySQL 데이타베이스를 사용할 때 한글이 깨지는 현상이 발생할 수 있다. 이런 경우는 두 가지를 먼저 체크해 본다. 첫째는 먼저 해당 Database가 utf8 으로 셋팅되어 있는지 확인하는 것으로 아래와 같이 information_schema.SCHEMATA을 SELECT하여 확인할 수 있다. 두번째는 한글 입력(INSERT)이 깨지지 않도록 하기 위해서 MySQL 연결 문자열에 Charset=utf8 를 추가해 준다.
예제
// 1. DB가 디폴트로 UTF8 Collation을 갖는지 체크
SELECT schema_name, default_character_set_name
FROM information_schema.SCHEMATA
// 2. MySQL Connector/Net 연결문자열 (Charset)
string cn = "Server=localhost;Database=db;Uid=u;Pwd=p;Charset=utf8";
SELECT schema_name, default_character_set_name
FROM information_schema.SCHEMATA
// 2. MySQL Connector/Net 연결문자열 (Charset)
string cn = "Server=localhost;Database=db;Uid=u;Pwd=p;Charset=utf8";