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