我想创建一个GUID并将其存储在数据库中。
在C#中,可以使用Guid.NewGuid()创建一个guid。这将创建一个128位整数。SQL Server有一个uniqueidentifier列,其中包含一个巨大的十六进制数。
有没有一种使C#和SQL Server guid一起正常工作的好/首选方法?(即使用Guid.New()创建一个guid,然后使用nvarchar或其他某些字段将其存储在数据库中……或通过其他方法创建SQL Server期望的十六进制形式的形式)
我想创建一个GUID并将其存储在数据库中。
在C#中,可以使用Guid.NewGuid()创建一个guid。这将创建一个128位整数。SQL Server有一个uniqueidentifier列,其中包含一个巨大的十六进制数。
有没有一种使C#和SQL Server guid一起正常工作的好/首选方法?(即使用Guid.New()创建一个guid,然后使用nvarchar或其他某些字段将其存储在数据库中……或通过其他方法创建SQL Server期望的十六进制形式的形式)
Answers:
SQL期望GUID为字符串。C#中的以下代码返回Sql期望的字符串。
"'" + Guid.NewGuid().ToString() + "'"
就像是
INSERT INTO TABLE (GuidID) VALUE ('4b5e95a7-745a-462f-ae53-709a8583700a')
在SQL中应该是这样。
uniqueidentifier
SQL数据类型(@TorHaugen在注释中建议)转换为System.Guid
C#数据类型,这就是OP的要求
这是显示如何使用参数化查询插入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();
}
}
WHERE
子句。它尝试将guid
c#中的小写字母uniqueidentifier
与大写字母进行比较,但不匹配。
您可以通过指定将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
// 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();