C # guid и SQL уникальный идентификатор - PullRequest
61 голосов
/ 17 сентября 2009

Я хочу создать GUID и сохранить его в БД.

В C # guid может быть создан с помощью Guid.NewGuid (). Это создает 128-битное целое число. SQL Server имеет столбец уникального идентификатора, который содержит огромное шестнадцатеричное число.

Есть ли хороший / предпочтительный способ заставить руководства C # и SQL Server хорошо играть вместе? (т.е. создайте guid с помощью Guid.New (), а затем сохраните его в базе данных с помощью nvarchar или какого-либо другого поля ... или создайте некоторое шестнадцатеричное число в форме, которую SQL Server ожидает каким-либо другим способом)

Ответы [ 5 ]

62 голосов
/ 17 сентября 2009

Вот фрагмент кода, показывающий, как вставить 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();
        }
    }
50 голосов
/ 17 сентября 2009

SQL ожидает GUID в виде строки. Следующее в C # возвращает строку, которую ожидает Sql.

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

Что-то вроде

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

так должно выглядеть в SQL.

7 голосов
/ 17 февраля 2011

Вы можете передать значение C # Guid непосредственно в хранимую процедуру SQL, указав <a href="http://msdn.microsoft.com/en-us/library/system.data.sqldbtype.aspx" rel="nofollow noreferrer">SqlDbType</a>.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",
                <b>SqlDbType = SqlDbType.UniqueIdentifier</b>, // right here
                Value = guid
            }
        }
    })
    {
        cnx.Open();
        cmd.ExecuteNonQuery();
    }
}

См. Также: SQL Server uniqueidentifier

4 голосов
/ 17 сентября 2009

Сохраните его в базе данных в поле с типом данных uniqueidentifier.

0 голосов
/ 11 апреля 2012
// 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();
...