2009-04-12 11 views
5

Cercando di persistere Guid in un db MySQL da C# (.NET). La colonna MySQL è di tipo BINARY (16). Qualche suggerimento su come mantenere il guid e in seguito ottenere il guid da a MySQL? Cerchi una risposta al codice qui :-)Store GUID in MySQL da C#

risposta

11

Capito. Ecco come ...

schema di database

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

Codice

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

non è necessario farlo in due query separate. Datareader da solo basterebbe che avrebbe fatto tutte le operazioni e, infine, restituire il valore letto – nawfal

+0

e in qualche modo questo non ha funzionato quando ho provato. vedi questo link: http://stackoverflow.com/questions/10032071/how-to-get-uuid-generated-by-mysql-into-ac-sharp-variable/10174083#10174083 – nawfal

+0

nota a riguardo: http: // stackoverflow.com/a/11236127/2241289 – user2241289

4

A quanto pare, il metodo GetGuid() in MySQL .NET Connector v5.2.6 + deve essere fissato in modo da poter use this example.

+2

Intendi connettore MySQL .Net v5.2.6 +. Destra? – xraminx

1

1) È possibile inserirlo come fa @Tim Skauge. Ma mentre selezionando la versione del connettore .Net è importante. Quando io avevo usato v 5.2.1, avevo bisogno di fare solo questo:

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

Qui il lettore stesso legge il valore binario a .NET Guid tipo. Puoi vederlo se controlli il tipo di r[0]. Ma con la versione più recente, ovvero 6.5.4, ho trovato che il tipo era byte[] .. cioè, ottiene il valore binario da db alla matrice di byte corrispondente. Quindi si esegue questa operazione:

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

È possibile leggere perché è così here in documentation. L'alternativa per leggere direttamente il tipo Guid e non come byte [] è avere questa riga: Old Guids=true nella stringa di connessione.

2) Inoltre si può fare questo subito a leggere il valore binario come stringa chiedendo MySQL per eseguire la conversione, ma nella mia esperienza questo metodo è più lento.

Inserire:

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

o

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

e selezionare:

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

L'unica cosa che dovete notare è che se si sta inserendo GUID da hex metodo allora si devo leggerlo con l'approccio unhex. Se li stai inserendo facendo affidamento sul metodo .NET ToByteArray(), devi leggere in modo simile. Altrimenti si otterranno letture non corrette poiché .NET ha un modo particolare di ordinare i byte secondo endianness. Catch something about it here in the context of inserting and reading Guids in .NET