2009-09-16 14 views
56

Chcę utworzyć identyfikator GUID i zapisać go w DB.C# GUID i unikalny identyfikator SQL

W języku C# guid można utworzyć za pomocą Guid.NewGuid(). Tworzy 128-bitową liczbę całkowitą. SQL Server ma kolumnę uniqueidentifier, która zawiera ogromną liczbę szesnastkową.

Czy istnieje dobry/preferowany sposób, aby zachęty C# i SQL Server dobrze współgrały? (tj. utwórz GUID za pomocą Guid.New(), a następnie zapisz go w bazie danych, używając nvarchar lub jakiegoś innego pola ... lub utwórz heksidecymalną liczbę formularzy, których SQL Server spodziewa się w jakiś inny sposób)

+20

NIE używać nvarchar SQL Server, należy użyć uniqueidentifier. –

Odpowiedz

47

SQL oczekuje GUID jako ciągu. Następujące w C# zwraca ciąg Sql oczekuje.

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

Coś

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

to powinno wyglądać w SQL.

+30

Jeśli używasz SqlParameter, nie musisz konwertować identyfikatora GUID na ciąg znaków. –

+6

Aby być bardziej zrozumiałym dla wszystkich, nie sugeruję, że określony sql powinien być użyty, jak pokazano w języku C# z łączeniem ciągów. Sedno sprawy, jak sądzę, jest w jakiej formie wygląda LICENCJOBIORCA UNIQUEIDENTIFIER. Dosłownie wygląda jak struna, ale ze specjalnym formatem. Dwa fragmenty kodu demonstrują wygląd literału w dwóch językach. Zgadzam się z DLKG, że użycie sparametryzowanego zapytania i podanie guid jako wpisanego parametru jest zarówno bardziej wydajne, jak i zapobiega potencjalnym atakom SQL Injection. –

+1

I w Entity Framework, pierwszej metodzie bazy danych, typ danych SQL 'uniqueidentifier' (zalecany w komentarzu @TorHaugen) tłumaczy się na typ danych C# System.Guid, który jest tym, co OP zadał o –

4

Przechowuj go w bazie danych w polu z typem danych uniqueidentifier.

55

Oto snipit kod pokazujący jak wstawić Guid użyciu sparametryzowane zapytanie:

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 powinno być @guidValue –

+0

Naprawiono literówka, okrzyki. – DLKJ

+3

+1 za wykazanie prawidłowego sposobu wykonania, a nie tylko za dosłowną odpowiedź na pytanie. –

5

można przekazać wartość C# Guid bezpośrednio do SQL procedura przechowywana, określając SqlDbType .UniqueIdentifier.

Twoja metoda może wyglądać następująco (pod warunkiem, że jedynym parametrem jest 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(); 
    } 
}

Zobacz także: 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(); 
Powiązane problemy