Хранить GUID в MySQL из C # - PullRequest
       19

Хранить GUID в MySQL из C #

6 голосов
/ 12 апреля 2009

Попытка сохранить Guid в базе данных MySQL из C # (.NET). Столбец MySQL имеет тип BINARY (16). Любые предположения о том, как сохранить guid и позже вернуть guid из MySQL? Ищите код ответа здесь: -)

Ответы [ 3 ]

12 голосов
/ 12 апреля 2009

Разобрался. Вот как ...

Схема базы данных

CREATE TABLE `test` (                                            
     `id` BINARY(16) NOT NULL,                                      
     PRIMARY KEY  (`id`)                                            
)

код

string connectionString = string.Format("Server={0};Database={1};Uid={2};pwd={3}", "server", "database", "user", "password");

Guid orgId = Guid.NewGuid();
Guid fromDb = Guid.Empty;

using (MySqlConnection conn = new MySqlConnection(connectionString))
{
    conn.Open();

    using (MySqlCommand cmd = new MySqlCommand("INSERT INTO test (id) VALUES (?id)", conn))
    {
        cmd.Parameters.Add("id", MySqlDbType.Binary).Value = orgId.ToByteArray();
        cmd.ExecuteNonQuery();
    }

    using (MySqlCommand cmd = new MySqlCommand("SELECT id FROM test", conn))
    {
        using (MySqlDataReader r = cmd.ExecuteReader())
        {
            r.Read();
            fromDb = new Guid((byte[])r.GetValue(0));
        }
    }
}
4 голосов
/ 12 апреля 2009

Очевидно, метод GetGuid() в MySQL .NET Connector v5.2.6 + должен быть исправлен, чтобы вы могли использовать этот пример .

1 голос
/ 21 мая 2012

1) Вы можете вставить его так, как это делает @Tim Skauge. Но при выборе версии .Net разъем важно. Когда я использовал v 5.2.1, мне нужно было сделать только это:

using (MySqlCommand cmd = new MySqlCommand("SELECT id FROM test", conn))
{
    using (MySqlDataReader r = cmd.ExecuteReader())
    {
        r.Read();
        Guid id = (Guid)r[0];
    }
}

Здесь читатель сам считывает двоичное значение в .NET Guid тип. Вы можете увидеть это, если вы проверите тип r[0]. Но с более новой версией, то есть 6.5.4, я обнаружил, что типом является byte[] .. т.е. он получает двоичное значение из db в соответствующий ему байтовый массив. Итак, вы делаете это:

using (MySqlCommand cmd = new MySqlCommand("SELECT id FROM test", conn))
{
    using (MySqlDataReader r = cmd.ExecuteReader())
    {
        r.Read();
        Guid id = new Guid((byte[])r[0]);
    }
}

Вы можете прочитать, почему это так здесь, в документации . Альтернатива прямому чтению типа Guid, а не байта [], заключается в том, чтобы иметь следующую строку: Old Guids=true в строке подключения.

2) Кроме того, вы можете сделать это прямо сейчас, чтобы прочитать двоичное значение как строку, попросив MySQL выполнить преобразование, но, по моему опыту, этот метод медленнее.

Вставка:

using (var c = new MySqlCommand("INSERT INTO test (id) VALUES (UNHEX(REPLACE(@id,'-','')))", conn))
{
    c.Parameters.AddWithValue("@id", Guid.NewGuid().ToString());
    c.ExecuteNonQuery();
}

или

using (var c = new MySqlCommand("INSERT INTO test (id) VALUES (UNHEX(@id))";, conn))
{
    c.Parameters.AddWithValue("@id", Guid.NewGuid().ToString("N"));
    c.ExecuteNonQuery();
}

И выберите:

using (MySqlCommand cmd = new MySqlCommand("SELECT hex(id) FROM test", conn))
{
    using (MySqlDataReader r = cmd.ExecuteReader())
    {
        r.Read();
        Guid id = new Guid((string)r[0]);
    }
}

Единственное, что вам нужно заметить, это то, что если вы вставляете Guids методом hex, то вы должны прочитать его методом unhex. Если вы вставляете их, опираясь на метод .NET ToByteArray(), вы должны читать аналогично. В противном случае вы получите неправильные инструкции, поскольку в .NET есть особый способ упорядочения байтов в соответствии с порядком байтов. Поймайте что-нибудь об этом здесь в контексте вставки и чтения Guids в .NET

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...