2

GUIDがf5cc4100-f1b4-4af6-9e9e-224b0eb74166あり、ADO.NETコネクタを使用してMySQLデータベースに挿入しています。

私は2つの方法でそれを行うことができます:

1)バイト配列を.NETコネクタにフィードします

string query = "insert into test (pk_id) values (@id)";
using (var c = new MySqlCommand(query, conn))
{
    c.Parameters.AddWithValue("@id", new Guid("f5cc4100-f1b4-4af6-9e9e-224b0eb74166").ToByteArray());
    c.ExecuteNonQuery();
}

2)MySQL標準関数を使用して、16進数を2進数の文字列に変換します。

string query = "insert into test (pk_id) values (UNHEX(@id))";
using (var c = new MySqlCommand(query, conn))
{
    c.Parameters.AddWithValue("@id", "f5cc4100-f1b4-4af6-9e9e-224b0eb74166".Replace("-", "");
    c.ExecuteNonQuery();
}

私が直面している問題は、上記の2つの方法で、同じGUIDがわずかに異なる文字順序で挿入されることです。

挿入されたGUIDを次のように選択し直す場合:

string query = "select PK_id from test";
using (var c = new MySqlCommand(query, conn))
{
    using (var r = c.ExecuteReader())
    {
        while (r.Read())
        {
            var k = new Guid((byte[])r[0]);
        }
    }
}

私は行き来f5cc4100-f1b4-4af6-9e9e-224b0eb741660041ccf5-b4f1-f64a-9e9e-224b0eb74166ます。しかし、私がこのように読んでいる場合:

string query = "select hex(PK_id) from test";
using (var c = new MySqlCommand(query, conn))
{
    using (var r = c.ExecuteReader())
    {
        while (r.Read())
        {
            var k = new Guid((string)r[0]);
        }
    }
}

取得0041ccf5-b4f1-f64a-9e9e-224b0eb74166f5cc4100-f1b4-4af6-9e9e-224b0eb74166ます。

つまり、GUIDをバイト配列として挿入する場合は、それらをそのように読み取り、バイト配列としてキャストして、正しいGUIDを取得する必要があります。また、16進数のGUID文字列の時点でGUIDを挿入する場合はUNHEX、同等の関数を使用してdbから読み取る必要がありHEXます。

  1. 上記の2つの方法で書き込みと読み取りが異なるのはなぜですか?

  2. 2つの間でGUIDを処理するためのより適切な方法は何でしょうか?

4

2 に答える 2

1

元の投稿者が私のコメント (リンクのみ) を回答として投稿するよう求めたので、ここに表示されます。

SO: .NET の Guid バイト オーダー

MSDN: System.Guid .ToByteArray が最初の 4 バイトをスワップ

SO: C#: Guid.ToString(“n”) が、同じ GUID のバイト配列から生成された 16 進文字列と同じでないのはなぜですか?

Guidとの間で変換するときに、のさまざまなコンポーネントが持つエンディアンが明確に文書化されていないようByte[]です。

于 2012-06-24T14:00:02.987 に答える
1

ニールセンは質問の一部に答えます。どちらを使用するかに関して、良い選択をするものは何もありません。どちらでもいいです。db の値を後で .NET の世界の外で読み取る必要がある場合は、MySQL の hexing と unhexing の方が適しています。私のテストでは、hexing と unhexing に関連するわずかな (非常にわずかな) パフォーマンスの低下があります。それがあなたにとって重要な場合は、そのままにしてくださいToByteArray()

于 2012-06-27T23:22:55.887 に答える