【问题标题】:Store GUID in MySQL from C#从 C# 在 MySQL 中存储 GUID
【发布时间】:2010-10-19 00:45:13
【问题描述】:

试图通过 C# (.NET) 将 Guid 持久化到 MySQL 数据库中。 MySQL 列的类型为 BINARY(16)。关于如何持久化 guid 并稍后将 guid 从 MySQL 取回的任何建议?在这里寻找代码答案:-)

【问题讨论】:

    标签: c# mysql


    【解决方案1】:

    想通了。这是如何...

    数据库架构

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

    【讨论】:

    • 您无需在两个单独的查询中执行此操作。单独的 Datareader 就足够了,它可以执行所有操作并最终返回读取值
    • 当我尝试时不知何故这不起作用。看到这个链接:stackoverflow.com/questions/10032071/…
    【解决方案2】:

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

    【讨论】:

    • 您的意思是 MySQL .Net 连接器 v5.2.6+。对吗?
    【解决方案3】:

    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 方法插入Guid,那么您必须通过unhex 方法阅读它。如果您依赖 .NET 的 ToByteArray() 方法插入它们,那么您必须以类似方式阅读。否则,您将读取不正确的 guid,因为 .NET 有一种根据字节序对字节进行排序的特殊方式。 Catch something about it here in the context of inserting and reading Guids in .NET

    【讨论】:

      猜你喜欢
      • 2010-09-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多