C#GUID和SQL Uniqueidentifier


67

我想创建一个GUID并将其存储在数据库中。

在C#中,可以使用Guid.NewGuid()创建一个guid。这将创建一个128位整数。SQL Server有一个uniqueidentifier列,其中包含一个巨大的十六进制数。

有没有一种使C#和SQL Server guid一起正常工作的好/首选方法?(即使用Guid.New()创建一个guid,然后使用nvarchar或其他某些字段将其存储在数据库中……或通过其他方法创建SQL Server期望的十六进制形式的形式)


21
不要使用nvarchar,请使用uniqueidentifier。
Tor Haugen

Answers:


56

SQL期望GUID为字符串。C#中的以下代码返回Sql期望的字符串。

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

就像是

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

在SQL中应该是这样。


33
如果使用SqlParameter,则不必将GUID转换为字符串。
Pierre-Alain Vigeant

6
为了让大家都更清楚,我不建议指定的sql应该按照C#的字符串连接使用。我认为,问题的症结在于SQL UNIQUEIDENTIFIER LITERAL是什么样的形式。文字看起来像一个字符串,但具有特殊格式。这两个代码段演示了两种语言文字的外观。我同意DLKG的观点,即使用参数化查询并将guid作为类型化参数传递不仅性能更高,而且还可以防止潜在的SQL Injection攻击。
Peter Oehlert

4
在实体框架(数据库的第一种方法)中,uniqueidentifierSQL数据类型(@TorHaugen在注释中建议)转换为System.GuidC#数据类型,这就是OP的要求
Red Pea 2015年

那么System.Guid如何生成数据库中尚未存在的标识符?虽然,可能性很小...是否可以检查唯一性?
phil123456 '12

65

这是显示如何使用参数化查询插入GUID的代码片段:

    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应该为@guidValue
Peter

4
+1用于演示执行操作的正确方法,而不是仅仅按字面意义回答问题。
克里斯蒂安·海特

很有用。我试图解析数据库中的字符串等。这很好。干杯,
〜ck

这适用于插入,但不适用于WHERE子句。它尝试将guidc#中的小写字母uniqueidentifier与大写字母进行比较,但不匹配。
Edwin Stoteler,2015年

8

您可以通过指定将C#Guid值直接传递到SQL存储过程SqlDbType.UniqueIdentifier

您的方法可能如下所示(假设您唯一的参数是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();
    }
}

另请参阅:SQL Server 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();
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.