Quiero crear un GUID y almacenarlo en la base de datos.

En C# un guid pueden ser creados usando Guid.NewGuid(). Esto crea un 128 bits con signo. SQL Server tiene una columna uniqueidentifier que tiene un enorme número hexadecimal.

Hay una buena/mejor manera de hacer C# y SQL Server guid jugar bien juntos? (es decir, crear un guid utilizando Guid.New() y, a continuación, guarde en la base de datos mediante nvarchar o algún otro campo … o crear algunos hexadecimal el número de la forma en que SQL Server está esperando por algún otro medio)

  • NO utilice nvarchar, uso uniqueidentifier.
InformationsquelleAutor Daniel | 2009-09-16

5 Comentarios

  1. 51

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

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

    Algo como

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

    es lo que debe verse como en SQL.

    • Si utiliza SqlParameter, usted no tiene que convertir el GUID en una cadena.
    • Para ser más claro para todos, no estoy sugiriendo que el sql especificada debe ser utilizado como se ha demostrado desde C# con la concatenación de cadenas. El quid de la cuestión, creo yo, es ¿en qué forma un SQL UNIQUEIDENTIFIER LITERAL aspecto. El literal parece a una cadena, pero con un formato especial. Los dos fragmentos de código de demostrar lo que el literal parece en 2 idiomas. Estoy de acuerdo con DLKG que mediante una consulta parametrizada y pasar el guid como un tipo de parámetro es tanto más eficiente, así como la prevención de posibles ataques de Inyección de SQL.
    • Y en el Marco de la Entidad, Base de datos de primer método, un uniqueidentifier tipo de datos SQL (como se recomienda en el comentario de @TorHaugen) se traduce a un System.Guid C# tipo de datos, que es lo que le preguntó acerca de OP
  2. 63

    Aquí un código snipit que muestra cómo insertar un Guid utilizando una consulta parametrizada:

        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();
            }
        }
    • guidValue deben ser @guidValue
    • Corregido el error, saludos.
    • +1 para demostrar la forma correcta de hacerlo, en lugar de sólo responder a la pregunta literalmente.
    • Muy útil. Yo estaba tratando de analizar una cadena etc… dentro de la base de datos. Esto funciona muy bien. Saludos, ~ck
    • Esto funciona para la inserción, pero no para un WHERE cláusula. Se trata de comparar la minúscula guid de c# a la a mayúscula uniqueidentifier y que no coincide.
  3. 7

    Puede pasar a C# Guid valor directamente a un Procedimiento Almacenado de SQL especificando SqlDbType.UniqueIdentifier.

    Su método puede tener este aspecto (siempre 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();
        }
    }

    Ver también: SQL Server uniqueidentifier

  4. 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();

Dejar respuesta

Please enter your comment!
Please enter your name here