2012-04-05 55 views
1

下面是該查詢:如何讓產生的UUID由MySQL爲C#變量

string query = @"INSERT INTO session (PK_Id, user_id, login_time, machine_ip, machine_fingerprint) 
          VALUES (UUID(), @UId, @LogInTime, @MIp, @MFingerPrint); 
       "; 

現在我需要這最後插入的ID後面,這是由MySQL生成的UUID。據我所知,UUIDs沒有select_last_insert_id()函數!我讀了php,你可以先將UUID()函數分配給一個變量,然後返回該值。但在C#中如何去做呢?

這樣的事情,但不完全:

string query = @"INSERT INTO session (PK_Id, user_id, login_time, machine_ip, machine_fingerprint) 
          VALUES (@UUID = SELECT UUID(), @UId, @LogInTime, @MIp, @MFingerPrint); 
       ";     //how to do this here? 

這裏更多的是我的代碼:

string query = @"INSERT INTO session (PK_Id, user_id, login_time, machine_ip, machine_fingerprint) 
       VALUES (@UUID = SELECT UUID(), @UId, @LogInTime, @MIp, @MFingerPrint); 
       "; 

try 
{ 
    if (_conn.State != ConnectionState.Open) 
     _conn.Open(); 
    MySqlCommand cmd = new MySqlCommand(query, _conn); 
    cmd.Parameters.AddWithValue("@UId", Utility.usr.Id); 
    cmd.Parameters.AddWithValue("@LogInTime", DateTime.Now); 
    cmd.Parameters.AddWithValue("@MIp", GetMachineIP()); 
    cmd.Parameters.AddWithValue("@MFingerPrint", GetHardwareFingerPrint()); 

    var s= Convert.ToString(cmd.ExecuteScalar()); //this returns an empty string :(
    //I need to get it to any .NET data type, string, or Guid or byte[] or anything. 

但我需要的s這個數據類型在另一個WHERE子句中使用的查詢像這樣:

string query = @"UPDATE session SET logout_time = @LogOutTime 
       WHERE user_id = @UId AND PK_Id = @SessionId"; 

try 
{ 
    if (_conn.State != ConnectionState.Open) 
     _conn.Open(); 
    MySqlCommand cmd = new MySqlCommand(query, _conn); 
    cmd.Parameters.AddWithValue("@UId", Utility.usr.Id); 
    cmd.Parameters.AddWithValue("@SessionId", s); 
    cmd.Parameters.AddWithValue("@LogOutTime", DateTime.Now); 
    cmd.ExecuteScalar(); 

這裏是U UID字段在同一個表中。所以基本上,我怎麼能在C#中獲得MySQL varbinary字段,以便通過在另一個查詢中指定WHERE來使用該類型來更新?

在MySQL表中,UUID字段是varbinary (我希望看到一些不是另一個php鏈接的解決方案,或者不要求我在數據庫中切換到char數據類型:))。

編輯:這裏的問題是我們已經在表中添加了大量由MySQL生成的UUID,所以我對將MySQL UUID更改爲.NET Guid有點擔心。如果這是唯一的解決方法,我會考慮這一點。只是這是我們第一次需要插入的UUID值,以便我可以在另一個查詢中更新另一個時間點。

一個小問題:.NET Guid與MySQL UUID完全一樣嗎?

+0

您是否嘗試過'Guid'類型? – PinnyM 2012-04-05 16:13:43

+0

@PinnyM試過哪裏?將GUID添加到UUID字段中或者將插入的UUID作爲GUID? – 2012-04-05 16:15:03

+0

要麼 - 見http://stackoverflow.com/questions/742099/store-guid-in-mysql-from-c-sharp – PinnyM 2012-04-05 16:15:39

回答

1

我想你可以用你的前面的實施繼續,而不必依賴於MS的Guid,但我擔心我太晚了:)

string query = @"INSERT INTO session (PK_Id, user_id, login_time, machine_ip, machine_fingerprint) 
          VALUES (UUID(), @UId, @LogInTime, @MIp, @MFingerPrint); 
       SELECT PK_Id FROM session WHERE [email protected] AND [email protected]; //or something similar which gives you the exact same id - UUID 
       "; 

try 
{ 
    if (_conn.State != ConnectionState.Open) 
     _conn.Open(); 
    MySqlCommand cmd = new MySqlCommand(query, _conn); 
    cmd.Parameters.AddWithValue("@UId", Utility.usr.Id); 
    cmd.Parameters.AddWithValue("@LogInTime", DateTime.Now); 
    cmd.Parameters.AddWithValue("@MIp", GetMachineIP()); 
    cmd.Parameters.AddWithValue("@MFingerPrint", GetHardwareFingerPrint()); 

    MySqlDataReader r = cmd.ExecuteReader(); 

    if (r.Read()) //ensure if it is read only once, else modify your `WHERE` clause accordingly 
    { 
     var s = (Guid)r[0]; 
    } 
    //or even (Guid)cmd.ExecuteScalar() would work 

現在你可以在更新這樣的查詢:

string query = @"UPDATE session SET logout_time = @LogOutTime 
         WHERE user_id = @UId AND PK_Id = @SessionId"; 

try 
{ 
    if (_conn.State != ConnectionState.Open) 
     _conn.Open(); 
    MySqlCommand cmd = new MySqlCommand(query, _conn); 
    cmd.Parameters.AddWithValue("@UId", Utility.usr.Id); 
    cmd.Parameters.AddWithValue("@SessionId", s.ToByteArray()); 
    cmd.Parameters.AddWithValue("@LogOutTime", DateTime.Now); 
    cmd.ExecuteNonQuery(); 

注意:在查詢之前,我已將Guid變量s轉換爲字節數組。這很重要,在WHERE子句中,可以是查詢中的UPDATESELECT語句。我會要求你從varbinary轉移到MySQL表中的二進制字段。

編輯:如果你的桌子會暴增大,那麼插入和選擇是一個糟糕的主意,因爲SELECT查詢是一個額外的查詢正在運行。在這種情況下,@PnynyM的選擇會更好。我真的不認爲MySQL或任何其他數據庫會有一種默認的方式來回饋那些不是數據庫生成的「自定義」插入的id。所以總之我建議你不要這樣做..

編輯2:請參見此answer獲取二進制值爲.NET數據類型。有時,根據MySQL .NET連接器版本,鑄件無法工作。

2

您可以使用Guid類型,它是UUID的MS實現。您應該知道,在將數據插入數據庫時​​,如果MySQL驅動程序不熟悉處理Guid,則可能需要將Guid轉換爲ByteArray。有關此示例,請參閱Store GUID in MySQL from C#

-1

您也可以使用sproc中的out參數完成此操作。見Nerf Anvil的回覆:

How to get OUT parameter from MySQL stored procedure幾乎是一個確切的例子。

cmd.Parameters [「outnextnoteid」]。Direction = ParameterDirection.Output;

...

nextNoteId =(int)的cmd.Parameters [ 「outnextnoteid」]。值;

+0

不幸的是它不是storeproc。和我的問題無關。我的問題是關於獲取,存儲和檢索二進制值 – 2012-04-05 17:00:47

+0

通常,您應該使用內聯SQL存儲過程。我假設你給我們的查詢來幫助我們理解,而不是顯示實際的代碼。 – 2012-04-05 17:02:11

+0

我提供了更多的參數化查詢正在運行的代碼和所有。很明顯,它不存儲過程。無論如何謝謝你在:) – 2012-04-05 17:05:31