C# 如何将MySQL生成的UUID转换成C变量

C# 如何将MySQL生成的UUID转换成C变量,c#,mysql,.net-2.0,uuid,varbinary,C#,Mysql,.net 2.0,Uuid,Varbinary,以下是查询: string query = @"INSERT INTO session (PK_Id, user_id, login_time, machine_ip, machine_fingerprint) VALUES (UUID(), @UId, @LogInTime, @MIp, @MFingerPrint); "; 现在我需要返回最后插入的id,它是MySQL生成的UUID。据我所知,UUI

以下是查询:

string query = @"INSERT INTO session (PK_Id, user_id, login_time, machine_ip, machine_fingerprint) 
                             VALUES (UUID(), @UId, @LogInTime, @MIp, @MFingerPrint);
                ";
现在我需要返回最后插入的id,它是MySQL生成的UUID。据我所知,UUID没有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. 
但我需要在查询中的另一个WHERE子句中使用这种数据类型的s,如下所示:

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();
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();
这里@SessionId是同一个表中的UUID字段。因此,基本上,我如何在C中获取MySQL varbinary字段,以便通过指定在另一个查询中的位置来使用该类型进行更新

在MySQL表中,UUID字段是varbinary,我希望看到的解决方案不是另一个php链接,也不是要求我切换到数据库中的char数据类型:

编辑:这里的问题是我们已经在表中添加了大量由MySQL生成的UUID,所以我有点担心将MySQL UUID更改为.NET Guid。如果这是唯一的解决办法,我会考虑的。只是这是我们第一次需要返回插入的UUID值,以便我可以在另一个查询中更新另一个时间点


子问题:.NET Guid与MySQL UUID完全相同吗?

您可以使用Guid类型,它是UUID的MS实现。您应该知道,在将数据插入数据库时,如果MySQL驱动程序不熟悉处理Guid,则可能需要将Guid转换为ByteArray。请参阅以获取此示例。

我认为您可以继续使用早期的实现,而不必依赖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 login_time=@LogInTime AND machine_fingerprint=@MFingerPrint; //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);
    cmd.Parameters.AddWithValue("@LogOutTime", DateTime.Now);
    cmd.ExecuteScalar();
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子句中,无论是查询中的UPDATE语句还是SELECT语句,这一点都很重要。我想让您从varbinary移到MySQL表中的binary字段

编辑:如果您的表将急剧增大,那么插入和选择是一个坏主意,因为SELECT查询是正在运行的另一个查询。在这种情况下,@PinnyM的选择更好。我真的不认为MySQL或任何其他数据库会有一种默认的方式来返回不是数据库生成的自定义插入ID。总之,我建议你不要这么做


Edit2:请参见此获取.NET数据类型的二进制值。有时,根据MySQL.NET连接器版本,强制转换不起作用。

您是否尝试过Guid类型?@PinnyM在何处尝试过?要将Guid添加到UUID字段中或将插入的UUID作为Guid获取,请参见@PinnyM,我已经看到了该链接。这里的问题是我们已经在表中添加了大量由MySQL生成的UUID,现在我不认为切换到Guid是可以的。只是这是我们第一次需要返回值,以便我可以在另一个查询中进行更新。因此,除了解决办法,我问的问题难道没有解决办法吗?我将更新我的答案我要说的是,C中的UUID表示是Guid-无需更改数据库。