2009-09-16 33 views
56

Quiero crear un GUID y almacenarlo en el DB.C# guid y SQL uniqueidentifier

En C# se puede crear un guid usando Guid.NewGuid(). Esto crea un entero de 128 bits. SQL Server tiene una columna uniqueidentifier que contiene un gran número hexadecimal.

¿Existe alguna manera buena/preferida para hacer que las guías C# y SQL Server funcionen bien juntas? (es decir, crea un guid usando Guid.New() y luego guárdalo en la base de datos usando nvarchar o algún otro campo ... o crea un número hexadecimal de la forma que espera SQL Server por algún otro medio)

+20

NO utilice nvarchar de SQL Server, use uniqueidentifier. –

Respuesta

47

SQL está esperando el GUID como una cadena. Lo siguiente en C# devuelve una cadena Sql está esperando.

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

Algo así como

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

es lo que debe ser similar en SQL.

+30

Si usa SqlParameter, no tiene que convertir el GUID en una cadena. –

+6

Para ser más claro para todos, no estoy sugiriendo que el sql especificado se use como se demostró desde C# con la concatenación de cadenas. El quid de la cuestión, creo, es a qué forma se parece un SQL UNIQUEIDENTIFIER LITERAL. El literal se ve como una cadena pero con un formato especial. Los dos fragmentos de código demuestran cómo se ve el literal en 2 idiomas. Estoy de acuerdo con DLKG en que usar una consulta parametrizada y pasar el guid como un parámetro tipado es tanto más eficaz como que previene posibles ataques de inyección SQL. –

+1

Y en Entity Framework, el primer método de la base de datos, un tipo de datos SQL 'uniqueidentifier' (recomendado en el comentario de @TorHaugen) se traduce en un tipo de datos' System.Guid' C#, que es lo que OP preguntó acerca de –

4

Guárdelo en la base de datos en un campo con un tipo de datos de uniqueidentifier.

55

Aquí hay una snipit código que muestra cómo insertar un GUID mediante una consulta definido en los parámetros:

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 debe ser @guidValue –

+0

error tipográfico, aplausos. – DLKJ

+3

+1 para demostrar la forma correcta de hacerlo, en lugar de solo contestar la pregunta literalmente. –

5

Puede pasar un valor de C# Guid directamente a un procedimiento almacenado de SQL especificando SqlDbType .UniqueIdentifier.

Su método puede tener este aspecto (con la condición de que su único parámetro es el 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(); 
    } 
}

Consulte también: 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(); 
Cuestiones relacionadas