2009-04-12 3 views
5

Essayez de persister Guid dans une base de données MySQL à partir de C# (.NET). La colonne MySQL est de type BINARY (16). Toute sugestion sur la façon de persister le guid et plus tard obtenir le guid de MySQL? Vous cherchez une réponse de code ici :-)Stockez GUID dans MySQL à partir de C#

Répondre

11

figured it out. Voici comment ...

schéma de base de données

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

Code

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

vous ne devez pas le faire dans deux requêtes distinctes. Datareader seul suffirait à faire toutes les opérations et finalement retourner la valeur lue – nawfal

+0

et de toute façon cela n'a pas fonctionné quand j'ai essayé. voir ce lien: http://stackoverflow.com/questions/10032071/how-to-get-uuid-generated-by-mysql-into-ac-sharp-variable/10174083#10174083 – nawfal

+0

note sur: http: // stackoverflow.com/a/11236127/2241289 – user2241289

4

Apparemment, la méthode GetGuid() dans MySQL .NET Connector v5.2.6 + doit être fixé afin que vous puissiez use this example.

+2

Vous voulez dire le connecteur MySQL .Net v5.2.6 +. Droite? – xraminx

1

1) Vous pouvez l'insérer comme @Tim Skauge. Mais tout en sélectionnant la version du connecteur .Net est important. Quand je l'avais utilisé v 5.2.1, je devais faire ce que:

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

Ici, le lecteur lit lui-même la valeur binaire .NET de type Guid. Vous pouvez le voir si vous vérifiez le type de r[0]. Mais avec la version plus récente, à savoir, 6.5.4, j'ai trouvé le type à byte[] .. par exemple, il obtient la valeur binaire de db à son tableau d'octets correspondant. Alors vous faites ceci:

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

Vous pouvez lire pourquoi est-il si here in documentation. L'alternative à lire le type Guid directement et non octet [] est d'avoir cette ligne: Old Guids=true dans votre chaîne de connexion.

2) De plus, vous pouvez le faire tout de suite pour lire la valeur binaire en tant que chaîne en demandant à MySQL de faire la conversion, mais dans mon expérience, cette méthode est plus lente.

Insérer:

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

ou

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

et sélectionnez:

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

La seule chose que vous devez noter est que si vous insérez Guids par hex méthode vous a pu le lire par l'approche unhex. Si vous les insérez en utilisant la méthode ToByteArray() de .NET, vous devez lire de la même manière. Sinon, vous obtiendrez des erreurs de lecture car .NET a une façon particulière de classer les octets en fonction de l'endianness. Catch something about it here in the context of inserting and reading Guids in .NET

Questions connexes