2009-09-16 12 views
56

GUIDを作成してDBに格納します。C#guidとSQL uniqueidentifier

C#では、Guid.NewGuid()を使用してguidを作成できます。これにより、128ビットの整数が作成されます。 SQL Serverには、巨大な16進数を保持するuniqueidentifier列があります。

C#とSQL ServerのGUIDをうまく組み合わせるための良い方法がありますか? (Guid.New()を使用してguidを作成し、それをnvarcharまたは他のフィールドを使用してデータベースに格納するか、SQL Serverが他の手段で期待している形式の16進数を作成してください)

+20

UNIQUEIDENTIFIER使用し、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のようなものです。リテラルは文字列のように見えますが、特別な形式です。 2つのコードスニペットは、2つの言語でリテラルがどのように見えるかを示しています。 私はDLKGに同意します。パラメータ化されたクエリを使用し、GUIDを型付きパラメータとして渡すことは、SQLインジェクション攻撃の可能性を回避するだけでなく、より効果的です。 –

+1

そして、Entity Frameworkのデータベースの最初のメソッドでは、@ uniqueHeugenのコメントで推奨される 'uniqueidentifier' SQLデータ型は、OPが尋ねるものである' System.Guid' C#データ型に変換されます –

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

あなたはSqlDbType .UniqueIdentifierを指定することで、SQLストアド・プロシージャに直接C#GUID値を渡すことができます。

あなたの方法は、(あなたの唯一のパラメータに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(); 
関連する問題