1

クエリは次のとおりです。

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() 関数はありません!! そして、最初に UUID() 関数を変数に割り当ててから、その値を返すことができるphpを読みました。しかし、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();

@"SessionId"同じテーブルの UUID フィールドを次に示します。基本的に、C# で MySQL varbinary フィールドを取得して、その型を使用して別のクエリで WHERE を指定して更新できるようにするにはどうすればよいでしょうか?

MySQLテーブルでは、UUIDフィールドはvarbinaryです(別のphpリンクではない、またはデータベースでcharデータ型に切り替えるように求めていない解決策を期待しています:))。

編集:ここでの問題は、MySQL によって生成された多数の UUID が既にテーブルに追加されていることです。そのため、MySQL UUID を .NET Guid に変更することに少し不安があります。それが唯一の回避策である場合、私はそれを検討します。別の時点で別のクエリで更新できるように、挿入された UUID 値を元に戻す必要があったのはこれが初めてです。

サブ質問: .NET Guid は MySQL UUID とまったく同じですか?

4

2 に答える 2

2

GuidUUID の MS 実装であるタイプを使用できます。MySQL ドライバーが Guid の処理に慣れていない場合は、データを DB に挿入するときに、Guid を ByteArray に変換する必要があることに注意してください。この例については、「C# から MySQL に GUID を格納する」を参照してください。

于 2012-04-05T16:31:36.607 に答える
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 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

これで、次のように update でクエリを実行できます。

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();

注: ここでは、sクエリを実行する前に Guid 変数をバイト配列に変換しています。WHEREこれは、それであれ、クエリでのステートメントでUPDATEあれ、重要です。SELECTvarbinary から MySQL テーブルのバイナリ フィールドに移動してください。

編集:テーブルが劇的に大きくなる場合、SELECTクエリは追加のクエリが実行されるため、挿入と選択はお勧めできません。その場合、@ PinnyM の選択の方が優れています。MySQL やその他のデータベースには、データベースが生成したものではない「カスタム」挿入 ID を返すデフォルトの方法があるとは本当に思いません。要するに、これに行かないことをお勧めします..

Edit2 :バイナリ値を .NET データ型に取得するには、この回答を参照してください。MySQL .NET コネクタのバージョンによっては、キャストが機能しない場合があります。

于 2012-04-16T12:29:21.727 に答える