我想创建一个GUID并将其存储在数据库中。
在C#中,可以使用Guid.NewGuid()创建guid。这会创建一个128位整数。 SQL Server有一个uniqueidentifier列,它包含一个巨大的十六进制数。
是否有一种好的/首选的方法可以使C#和SQL Server guids一起发挥良好的作用? (即使用Guid.New()创建一个guid,然后使用nvarchar或其他字段将其存储在数据库中......或者通过其他方式创建SQL Server期望的表单的一些十六进制数字)
答案 0 :(得分:62)
这是一段代码片段,展示了如何使用参数化查询插入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 :(得分:50)
SQL期望GUID为字符串。 C#中的以下内容返回Sql期待的字符串。
"'" + Guid.NewGuid().ToString() + "'"
像
这样的东西INSERT INTO TABLE (GuidID) VALUE ('4b5e95a7-745a-462f-ae53-709a8583700a')
是它在SQL中应该是什么样子。
答案 2 :(得分:7)
您可以通过指定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",
SqlDbType = SqlDbType.UniqueIdentifier, // right here
Value = guid
}
}
})
{
cnx.Open();
cmd.ExecuteNonQuery();
}
}
另请参阅:SQL Server的uniqueidentifier
答案 3 :(得分:4)
将其存储在数据库中的数据类型为uniqueidentifier的字段中。
答案 4 :(得分: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();