2009-09-16 28 views
56

我想创建一个GUID并将其存储在数据库中。C#guid和SQL uniqueidentifier

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

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

+20

不要使用nvarchar的,使用唯一标识符。 –

回答

47

SQL期待GUID作为一个字符串。 C#中的以下内容将返回Sql所期望的字符串。

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

喜欢的东西

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

是它应该是什么样子的SQL。

+30

如果使用SqlParameter,则不必将GUID转换为字符串。 –

+6

为了让大家更清楚,我并不是建议使用C#中的字符串连接来说明指定的sql。我相信问题的症结在于SQL UNIQUEIDENTIFIER LITERAL的外观。文字看起来就像一个字符串,但具有特殊的格式。这两个代码片段展示了两种语言的文字外观。 我同意DLKG,使用参数化查询并将guid作为类型化参数传递,既具有更高的性能,又能防止潜在的SQL注入攻击。 –

+1

而在Entity Framework中,数据库优先方法,'uniqueidentifier' SQL数据类型(推荐在@TorHaugen中注释)转换为System.Guid的C#数据类型,这就是OP询问的关于 –

4

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

55

这里展示了如何使用parametrised查询插入一个GUID代码snipit:

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 –

+0

修复了错字,欢呼声。 – DLKJ

+3

+1用于演示正确的方法,而不仅仅是直接回答问题。 –

5

您可以直接通过一个C#的GUID值通过指定SqlDbType .UniqueIdentifier存储过程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", 
       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(); 
相关问题