2009-04-12 64 views
5

嘗試在C#(.NET)的MySQL數據庫中保留Guid's。 MySQL列的類型是BINARY(16)。任何關於如何堅持guid並且後來從MySQL獲得guid的消息?尋找代碼的答案在這裏:-)在C#中存儲MySQL中的GUID

回答

11

想通了。以下是如何...

數據庫模式

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

你不需要在兩個單獨的查詢中做到這一點。 Datareader本身就足夠了,它可以完成所有操作,並最終返回讀取值 – nawfal 2012-04-16 12:14:33

+0

,並且當我嘗試時,它不起作用。看到這個鏈接:http://stackoverflow.com/questions/10032071/how-to-get-uuid-generated-by-mysql-into-ac-sharp-variable/10174083#10174083 – nawfal 2012-04-16 12:41:22

4

顯然,在MySQL .NET連接器v5.2.6 +的GetGuid()方法應該是固定的,所以你可以use this example

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類型而不是字節[]的替代方法是在連接字符串中包含以下行: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