C#에서 MySQL 데이터베이스 연결
1. MySQL 참조 추가
MySQL을 설치한 후 기본 디렉토리인 C:Program Files (x86)MySQLConnector NET 8.0에서 MySQLData.dll 파일을 찾습니다.
Visual Studio에서 프로젝트에 이 DLL을 참조로 추가합니다.
2. 네임스페이스 추가
using MySql.Data.MySqlClient;
3. 연결 문자열 구성
private static MySqlConnection connection = null;
private static void OpenConnection()
{
string connString = "server=127.0.0.1;port=3306;database=test;user=root;password=root;";
connection = new MySqlConnection(connString);
}
설명:
server: 데이터베이스 서버 IP 주소port: MySQL 포트 번호 (기본값: 3306)database: 사용할 데이터베이스 이름user: 관리자 계정password: 계정 비밀번호
4. CRUD (생성, 읽기, 갱신, 삭제) 연산
데이터 삽입 (Create)
private static void InsertRecord()
{
try
{
connection.Open();
// 고정 값 사용 예
// string sql = "INSERT INTO users(username, password) VALUES('takil', '789')";
// 날짜 포함 예
// string sql = "INSERT INTO users(username, password, registerdate) VALUES('taksil', '789789', '2015-05-09')";
string sql = "INSERT INTO users(username, password, registerdate) VALUES('wilhelm', '78889', '" + DateTime.Now + "')";
MySqlCommand cmd = new MySqlCommand(sql, connection);
int affectedRows = cmd.ExecuteNonQuery();
Console.WriteLine("영향을 받은 행 수: {0}", affectedRows);
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
finally
{
connection?.Close();
}
}
데이터 삭제 (Delete)
private static void DeleteRecord()
{
try
{
connection.Open();
string sql = "DELETE FROM users WHERE username = 'takil'";
MySqlCommand cmd = new MySqlCommand(sql, connection);
int affectedRows = cmd.ExecuteNonQuery();
Console.WriteLine("영향을 받은 행 수: {0}", affectedRows);
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
finally
{
connection?.Close();
}
}
데이터 갱신 (Update)
private static void UpdateRecord()
{
try
{
connection.Open();
string sql = "UPDATE users SET username = 'wqrwq', password = '123' WHERE id = 5";
MySqlCommand cmd = new MySqlCommand(sql, connection);
int affectedRows = cmd.ExecuteNonQuery();
Console.WriteLine("영향을 받은 행 수: {0}", affectedRows);
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
finally
{
connection?.Close();
}
}
데이터 조회 (Read)
private static void ReadRecords()
{
try
{
connection.Open();
string sql = "SELECT * FROM users";
// 특정 열만 선택: string sql = "SELECT id, username, registerdate FROM users";
MySqlCommand cmd = new MySqlCommand(sql, connection);
MySqlDataReader reader = cmd.ExecuteReader();
while (reader.Read())
{
// 인덱스로 접근
// Console.WriteLine(reader[0].ToString() + " " + reader[1].ToString() + " " + reader[2].ToString());
// 타입 변환 후 접근
// Console.WriteLine(reader.GetInt32(0) + " " + reader.GetString(1) + " " + reader.GetString(2));
// 열 이름으로 접근 (권장)
Console.WriteLine(reader.GetInt32("id") + " " + reader.GetString("username") + " " + reader.GetString("password"));
}
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
finally
{
connection?.Close();
}
}
// 전체 레코드 수 조회
private static void ReadCount()
{
try
{
connection.Open();
string sql = "SELECT COUNT(*) FROM users";
MySqlCommand cmd = new MySqlCommand(sql, connection);
// MySqlDataReader 사용 예
// MySqlDataReader reader = cmd.ExecuteReader();
// reader.Read();
// int totalCount = Convert.ToInt32(reader[0]);
// Console.WriteLine("전체 레코드 수: {0}", totalCount);
// ExecuteScalar 사용 (권장)
object result = cmd.ExecuteScalar();
int totalCount = Convert.ToInt32(result);
Console.WriteLine("전체 레코드 수: {0}", totalCount);
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
finally
{
connection?.Close();
}
}
사용자 인증 (보안 쿼리 예제)
private static bool ValidateUser(string username, string password)
{
try
{
connection.Open();
// 취약한 방식: string sql = "SELECT * FROM users WHERE username = '" + username + "' AND password = '" + password + "'";
// 매개변수화된 쿼리 (SQL 인젝션 방지)
string sql = "SELECT * FROM users WHERE username = @param1 AND password = @param2";
MySqlCommand cmd = new MySqlCommand(sql, connection);
cmd.Parameters.AddWithValue("@param1", username);
cmd.Parameters.AddWithValue("@param2", password);
MySqlDataReader reader = cmd.ExecuteReader();
if (reader.Read())
{
return true;
}
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
finally
{
connection?.Close();
}
return false;
}