C#中的guid和SQL中的uniqueidentifier

80

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

在C#中,可以使用Guid.NewGuid()来创建一个128位整数的GUID。SQL Server具有uniqueidentifier列,该列保存巨大的十六进制数。

是否有一种好的/首选的方法使C#和SQL Server的GUID相互配合?(即使用Guid.New()创建GUID,然后使用nvarchar或其他字段将其存储在数据库中...或者通过其他方式创建SQL Server期望的形式的十六进制数)


22
请使用 uniqueidentifier,而不是 nvarchar。 - Tor Haugen
5个回答

72

下面是一个代码片段,展示了如何使用参数化查询插入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 Oehlert
4
展示正确的做法比只是逐字回答问题更值得点赞。+1 - Christian Hayter
非常有用。我正在尝试解析数据库中的字符串等等...这很好用。干杯,~ck - Hcabnettek
这适用于插入但不适用于 WHERE 子句。它试图将 C# 中的小写 guid 与大写的 uniqueidentifier 进行比较,而这两者不匹配。 - Edwin Stoteler

62

SQL期望GUID作为字符串。以下C#代码返回一个字符串,这个字符串是符合SQL期望的。

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

类似于什么东西

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

这是在SQL中应该看起来的样子。


40
如果您使用SqlParameter,就不需要将GUID转换为字符串。 - Pierre-Alain Vigeant
7
为了让大家更清楚,我并不是建议使用C#中的字符串拼接来演示所指定的SQL语句。我认为问题的关键是SQL UNIQUEIDENTIFIER文本的形式是什么样子。该文本看起来像一个字符串,但具有特殊的格式。这两个代码片段展示了该文本在两种语言中的形式。我同意DLKG的观点,使用参数化查询并将guid作为类型参数传递既可以提高性能,还可以防止潜在的SQL注入攻击。 - Peter Oehlert
4
在Entity Framework的Database First方法中,一个uniqueidentifier的SQL数据类型(由@TorHaugen在评论中推荐)会被翻译为System.Guid的C#数据类型,这也是OP所问的。 - Nate Anderson
那么,System.Guid如何生成一个在数据库中不存在的标识符?尽管可能性很小...是否有唯一性检查? - phil123456

11
您可以通过指定SqlDbType.UniqueIdentifier,直接将C# Guid值传递给SQL存储过程。
您的方法可能如下所示(假设您的参数只有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",
                <b>SqlDbType = SqlDbType.UniqueIdentifier</b>, // right here
                Value = guid
            }
        }
    })
    {
        cnx.Open();
        cmd.ExecuteNonQuery();
    }
}

另请参阅:SQL Server 的 {{link1:uniqueidentifier}}。


5

将其存储在数据类型为 uniqueidentifier 的字段中。


2
// 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();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接