73 votes

C# guid et SQL uniqueidentifier

Je veux créer un GUID et le stocker dans la base de données.

En C#, un guide peut être créé en utilisant Guid.NewGuid(). Cela crée un entier de 128 bits. Le serveur SQL a une colonne uniqueidentifier qui contient un grand nombre hexadécimal.

Existe-t-il un moyen efficace/préféré pour que les guides C# et SQL Server fonctionnent bien ensemble ? (c'est-à-dire créer un guid en utilisant Guid.New() puis le stocker dans la base de données en utilisant nvarchar ou un autre champ... ou créer un nombre hexadécimal de la forme attendue par SQL Server par un autre moyen).

22 votes

N'utilisez PAS nvarchar, utilisez uniqueidentifier.

69voto

DLKJ Points 463

Voici un extrait de code montrant comment insérer un GUID à l'aide d'une requête paramétrée :

    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 votes

GuidValue devrait être @guidValue

4 votes

+1 pour avoir démontré la manière correcte de le faire, plutôt que de simplement répondre à la question de manière littérale.

0 votes

Très utile. J'essayais d'analyser une chaîne de caractères etc... dans la base de données. Cela fonctionne très bien. Merci, ~ck

58voto

Peter Oehlert Points 6351

SQL s'attend à ce que le GUID soit une chaîne de caractères. Ce qui suit en C# retourne une chaîne de caractères attendue par Sql.

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

Quelque chose comme

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

est ce à quoi cela devrait ressembler en SQL.

38 votes

Si vous utilisez SqlParameter, vous n'avez pas à convertir le GUID en chaîne de caractères.

7 votes

Pour être plus clair pour tout le monde, je ne suggère pas que le sql spécifié devrait être utilisé comme démontré à partir de C# avec la concaténation des chaînes. Le cœur de la question, je crois, est de savoir à quoi ressemble un SQL UNIQUEIDENTIFIER LITERAL. Le littéral ressemble à une chaîne de caractères mais avec un format spécial. Les deux extraits de code montrent à quoi ressemble un littéral dans deux langues. Je suis d'accord avec DLKG pour dire que l'utilisation d'une requête paramétrée et le passage du guid en tant que paramètre typé est à la fois plus performant et permet de prévenir les attaques potentielles par injection SQL.

4 votes

Et dans Entity Framework, la première méthode de la base de données, une uniqueidentifier Le type de données SQL (recommandé dans le commentaire de @TorHaugen) se traduit par un fichier de type System.Guid Type de données C#, ce qui est la question posée par le PO.

9voto

canon Points 14870

Vous pouvez passer une valeur C# Guid directement à une procédure stockée SQL en spécifiant [SqlDbType](http://msdn.microsoft.com/en-us/library/system.data.sqldbtype.aspx).UniqueIdentifier .

Votre méthode peut ressembler à ceci (à condition que votre seul paramètre soit le 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();
    }
}

Voir aussi : La fonction <a href="https://msdn.microsoft.com/en-us/library/ms187942.aspx" rel="nofollow noreferrer"><code>uniqueidentifier</code></a>

5voto

mjv Points 38081

Il existe un type SQL pour cela : uniqueidentifier.

4voto

Jay Riggs Points 30783

Stockez-le dans la base de données dans un champ dont le type de données est uniqueidentifier.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X