C# MySQL 연결 가이드

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;
}

태그: MySQL C# ADO.NET CRUD SQL 인젝션 방지

6월 29일 16:45에 게시됨