Skip to content

Instantly share code, notes, and snippets.

@jacking75
Last active May 2, 2023 04:58
Show Gist options
  • Save jacking75/51a1c96f4efa1b7a27030a7410f39bc6 to your computer and use it in GitHub Desktop.
Save jacking75/51a1c96f4efa1b7a27030a7410f39bc6 to your computer and use it in GitHub Desktop.
MySqlConnector 간단 정리

개요

  • MySqlConnector: High Performance MySQL Library for .NET
  • 공식 문서
  • 비동기:진짜 비동기 IO로 최대 쓰루풋을 실현
  • 고속: 빠른 속도와 저 메모리 사용으로 최적화 되어 있다.
  • 신뢰성: Oracle의 ConnectorNET의 많은 버그를 수정하였고, 모든 ADO.NET 기능 테스트에 합격
  • Leading Edge: .NET Core를 지원한 최초의 MySQL 라이브러리
  • Open: MIT 라이센스. 개발은 GitHub 상에서 하고 있으며 로드맵, issue, PR이 공개 되어 있다
  • MySqlConnector는 MySQL 서버, MariaDB, Percona 서버, Amazon Aurora、Azure Database for MySQL, Google Cloud SQL for MySQL 등을 위한 ADO.NET 데이터 프로바이더이다. DbConnection, DbCommand, DbDataReader, DbTransaction 기능을 제공하고, 관리된 코드로 데이터 베이스 쿼리와 갱신에 필요한 클래스를 제공한다.

사용하기

Nuget 에서 MySqlConnector를 설치한다.

using (var connection = new MySqlConnection("Server=myserver;User ID=mylogin;Password=mypass;Database=mydatabase"))
{
    connection.Open();

    using (var command = new MySqlCommand("SELECT field FROM table;", connection))
    using (var reader = command.ExecuteReader())
        while (reader.Read())
            Console.WriteLine(reader.GetString(0));
}

비동기 버전으로 사용하기

var connString = "Server=myserver;User ID=mylogin;Password=mypass;Database=mydatabase";

using (var conn = new MySqlConnection(connString))
{
    await conn.OpenAsync();

    // Insert some data
    using (var cmd = new MySqlCommand())
    {
        cmd.Connection = conn;
        cmd.CommandText = "INSERT INTO data (some_field) VALUES (@p)";
        cmd.Parameters.AddWithValue("p", "Hello world");
        await cmd.ExecuteNonQueryAsync();
    }

    // Retrieve all rows
    using (var cmd = new MySqlCommand("SELECT some_field FROM data", conn))
    using (var reader = await cmd.ExecuteReaderAsync())
        while (await reader.ReadAsync())
            Console.WriteLine(reader.GetString(0));
}

ip 주소로 연결하기

public class AppDb : IDisposable
{
    public readonly MySqlConnection Connection;

    public AppDb()
    {
        Connection = new MySqlConnection("host=127.0.0.1;port=3306;user id=mysqltest;password=Password123;database=mysqldb;");
    }

    public void Dispose()
    {
        Connection.Close();
    }
}

public async Task AsyncMethod()
{
    using (var db = new AppDb())
    {
        await db.Connection.OpenAsync();
        // db.Connection is open and ready to use
    }
    // db.Connection was closed by AppDb.Dispose
}

public void SyncMethod()
{
    using (var db = new AppDb())
    {
        db.Connection.Open();
        // db.Connection is open and ready to use
    }
    // db.Connection was closed by AppDb.Dispose
}

연결 옵션
How to Connect to MySQL from .NET Core
Use with ASP.NET Core Web API

Logging

다양한 로그 라이브러리와 연동이 가능하다.
이 글을 보기 바란다.

연결 규칙

MySqlConnection 오브젝트는 1번에 1개의 조작만을 할 수 있다. 복수의 스레드에서 공유해서 동시에 사용할 수 없다.
아래 코드처럼 사용하면 안 된다.

using (var connection = new MySqlConnection("..."))
{
    await connection.OpenAsync();
    await Task.WhenAll( // don't do this
        connection.ExecuteAsync("SELECT 1;"),
        connection.ExecuteAsync("SELECT 2;"),
        connection.ExecuteAsync("SELECT 3;"));
}

또 MySqlDataReader가 열려 있는 동안 같은 스레드에서 재 이용할 수 없다.
아래 코드처럼 사용하면 안 된다.

using (var connection = CreateOpenConnection())
using (var command = new MySqlCommand("SELECT id FROM ...", connection))
using (var reader = command.ExecuteReader())
{
    while (reader.Read())
    {
        var idToUpdate = reader.GetValue(0);
        connection.Execute("UPDATE ... SET ..."); // don't do this
    }
}

DateTime 저장

MySQL은 C#의 DateTime 또는 DateTimeOffset 값으로 정보를 저장할 수 없으므로 MySQL DATETIME 또는 TIMESTAMP 컬럼에 DateTime 및 DateTimeOffset 값을 저장하고 싶을 때는 주의해야 한다.

자세한 설명은 여기

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment