2009-09-16 42 views
56

Voglio creare un GUID e memorizzarlo nel DB.C# guid e identificatore univoco SQL

In C# è possibile creare un guid utilizzando Guid.NewGuid(). Questo crea un intero a 128 bit. SQL Server ha una colonna uniqueidentifier che contiene un numero esadecimale enorme.

C'è un modo buono/preferito per far sì che i GU di C# e SQL Server funzionino bene insieme? (ad esempio, creare un guid utilizzando Guid.New() e quindi memorizzarlo nel database utilizzando nvarchar o qualche altro campo ... o creare un numero esadecimale del modulo che SQL Server si aspetta in qualche altro modo)

+20

NON utilizzare nvarchar di SQL Server, utilizzare uniqueidentifier. –

risposta

47

SQL si aspetta il GUID come una stringa. Quanto segue in C# restituisce una stringa che Sql si aspetta.

"'" + Guid.NewGuid().ToString() + "'" 

Qualcosa di simile

INSERT INTO TABLE (GuidID) VALUE ('4b5e95a7-745a-462f-ae53-709a8583700a') 

è quello che dovrebbe essere simile a SQL.

+30

Se si utilizza SqlParameter, non è necessario convertire il GUID in una stringa. –

+6

Per essere più chiaro a tutti, non sto suggerendo che lo sql specificato debba essere usato come dimostrato da C# con la concatenazione di stringhe. Il punto cruciale della domanda, credo, è quale forma assomiglia ad un LITERALE SQL UNIQUEIDENTIFIER. Il letterale ha l'aspetto di una stringa ma con un formato speciale. I due frammenti di codice dimostrano l'aspetto letterale in 2 lingue. Concordo con DLKG sul fatto che l'utilizzo di una query con parametri e il passaggio del guid come parametro tipizzato sia sia più performante sia come prevenzione di potenziali attacchi di SQL Injection. –

+1

E in Entity Framework, il primo metodo Database, un tipo di dati SQL "uniqueidentifier' (consigliato nel commento da @TorHaugen) si traduce in un tipo di dati C# System.Guid, che è quello che OP ha richiesto su –

4

Memorizzarlo nel database in un campo con un tipo di dati di identificatore univoco.

55

Ecco uno snipit di codice che mostra come inserire un GUID utilizzando una query parametrizzata:

using(SqlConnection conn = new SqlConnection(connectionString)) 
    { 
     conn.Open(); 
     using(SqlTransaction trans = conn.BeginTransaction()) 
     using (SqlCommand cmd = conn.CreateCommand()) 
     { 
      cmd.Transaction = trans; 
      cmd.CommandText = @"INSERT INTO [MYTABLE] ([GuidValue]) VALUE @guidValue;"; 
      cmd.Parameters.AddWithValue("@guidValue", Guid.NewGuid()); 
      cmd.ExecuteNonQuery(); 
      trans.Commit(); 
     } 
    } 
+1

guidValue deve essere @guidValue –

+0

Risolto il problema errore di battitura, evviva. – DLKJ

+3

+1 per dimostrare il modo corretto di farlo, piuttosto che rispondere alla domanda letteralmente. –

5

è possibile passare un valore di C# Guid direttamente a una stored procedure di SQL specificando SqlDbType .UniqueIdentifier.

Il vostro metodo può apparire come segue (a condizione che il vostro unico parametro è il GUID):

public static void StoreGuid(Guid guid) 
{ 
    using (var cnx = new SqlConnection("YourDataBaseConnectionString")) 
    using (var cmd = new SqlCommand { 
     Connection = cnx, 
     CommandType = CommandType.StoredProcedure, 
     CommandText = "StoreGuid", 
     Parameters = { 
      new SqlParameter { 
       ParameterName = "@guid", 
       SqlDbType = SqlDbType.UniqueIdentifier, // right here 
       Value = guid 
      } 
     } 
    }) 
    { 
     cnx.Open(); 
     cmd.ExecuteNonQuery(); 
    } 
}

Consulta anche: uniqueidentifier

0
// Create Instance of Connection and Command Object 
SqlConnection myConnection = new SqlConnection(GentEFONRFFConnection); 
myConnection.Open(); 
SqlCommand myCommand = new SqlCommand("your Procedure Name", myConnection); 
myCommand.CommandType = CommandType.StoredProcedure; 
myCommand.Parameters.Add("@orgid", SqlDbType.UniqueIdentifier).Value = orgid; 
myCommand.Parameters.Add("@statid", SqlDbType.UniqueIdentifier).Value = statid; 
myCommand.Parameters.Add("@read", SqlDbType.Bit).Value = read; 
myCommand.Parameters.Add("@write", SqlDbType.Bit).Value = write; 
// Mark the Command as a SPROC 

myCommand.ExecuteNonQuery(); 

myCommand.Dispose(); 
myConnection.Close(); 
Problemi correlati