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
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));
}
}
}
A quanto pare, il metodo GetGuid()
in MySQL .NET Connector v5.2.6 + deve essere fissato in modo da poter use this example.
Intendi connettore MySQL .Net v5.2.6 +. Destra? – xraminx
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
- 1. Assegnazione di un GUID in C#
- 2. Semplice generazione di GUID in C
- 3. valore predefinito di GUID in per una colonna in mysql
- 4. Store php datetime nel database mysql
- 5. inserendo millisecondo in mysql da C#
- 6. tardiva in C# per Word di controllo in XAML/Store
- 7. MySQL auto-store datetime per ogni riga
- 8. Tipo di dati to Store latitudine/longitudine in Mysql
- 9. C# guid e identificatore univoco SQL
- 10. Genera GUID da una stringa che non è in formato guid
- 11. Come convertire un GUID in una stringa in C#?
- 12. Una classe Guid dattiloscritto?
- 13. Quale colonna di MySQL tornerà come System.Guid in C#
- 14. Converti GUID in varchar (32)
- 15. Creare un GUID casuale in C# entro un intervallo specificato
- 16. Perché Guid NON è un oggetto in C#?
- 17. Creare un GUID casuale protetto da crittografia in .NET
- 18. Convertire da Oracle RAW (16) a .NET GUID
- 19. Come leggere e stampare i dati da mysql in C#
- 20. Come convalidare Guid in .net
- 21. Guid Byte Order in .NET
- 22. Posso visualizzare GUID in windbg?
- 23. Come convertire Guid [] in String?
- 24. Qual è il tipo GUID?
- 25. iPhone store image da imageview a file
- 26. PowerShell - Elimina certificato da Computer Store
- 27. GUID leggibile dall'uomo
- 28. Parametri acquisto iTunes Music Store
- 29. Riferimenti a GUID
- 30. Modificare il mio componente GUID in wix?
non è necessario farlo in due query separate. Datareader da solo basterebbe che avrebbe fatto tutte le operazioni e, infine, restituire il valore letto – nawfal
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
nota a riguardo: http: // stackoverflow.com/a/11236127/2241289 – user2241289