从C#在MySQL中存储GUID

时间:2009-04-12 17:47:26

标签: c# mysql

尝试将Guid存放在来自C#(.NET)的MySQL数据库中。 MySQL列的类型为BINARY(16)。有关如何坚持guid以及后来从MySQL获取guid的任何消息?在这里寻找代码答案: - )

3 个答案:

答案 0 :(得分:12)

想出来。这是怎么......

数据库架构

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

答案 1 :(得分:4)

显然,应修复MySQL .NET Connector v5.2.6 +中的GetGuid()方法,以便use this example

答案 2 :(得分:1)

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

您可以阅读原因here in documentation。直接读取Guid类型而不是byte []的替代方法是在连接字符串中包含以下行: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]);
    }
}

您需要注意的一件事是,如果您通过hex方法插入Guids,那么您必须通过unhex方法阅读它。如果你依靠.NET的ToByteArray()方法插入它们,那么你必须阅读类似的内容。否则你会得到不正确的guid读取,因为.NET有一种特殊的方式来根据字节顺序排序字节。 Catch something about it here in the context of inserting and reading Guids in .NET