4

私は C# を使用して、さまざまなデータベース用の製品の具体的なプロバイダー実装を作成しています。詳細に入ることなく、列の 1 つはバイト配列型です (postgres の bytea - blob よりも bytea が選択されたため)。唯一の問題は、挿入された値と同じ値が返されないことです。Int32 ("0") を挿入すると、([0,0,0,0] ではなく) 8 [92 および 8x 48] が得られます。8バイトの値「0」のASCII表現ではなく、挿入した純粋なバイトを返す、パフォーマンスに優れたソリューションが必要です。

Npgsql を使用してデータを取得しています。誰かがc#の解決策を知っていれば、私も喜んでそれを学びます。

編集: Postgres 9.0、.Net 3.5

簡素化

コマンド クエリ: - 内部では挿入ステートメントのみを実行します。

select InsertOrUpdateEntry(:nodeId, :timeStamp, :data)

データ パラメータ:

byte [] value = BitConverter.GetBytes((int)someValue);

パラメータは次のように割り当てられます

command.Parameters.Add(new NpgsqlParameter("data", NpgsqlDbType.Bytea) 
{ Value = value });

ステートメントを選択:

select * from Entries

入力したバイト配列と同じです。元に戻したいです。よろしくお願いします。

入力: 0 0 0 0
現在の出力: 92 48 48 48 48 48 48 48 48
期待される出力: 0 0 0 0

4

2 に答える 2

5

Npgsql にはNpgsqlDataReader、挿入された行を取得するためのクラスがあります。

NpgsqlConnection conn = new NpgsqlConnection(connStr);
conn.Open();

NpgsqlCommand insertCmd =
    new NpgsqlCommand("INSERT INTO binaryData (data) VALUES(:dataParam)", conn);
NpgsqlParameter param = new NpgsqlParameter("dataParam", NpgsqlDbType.Bytea);

byte[] inputBytes = BitConverter.GetBytes((int)0);
Console.Write("Input:");
foreach (byte b in inputBytes)
    Console.Write(" {0}", b);
Console.WriteLine();

param.Value = inputBytes;
insertCmd.Parameters.Add(param);
insertCmd.ExecuteNonQuery();

NpgsqlCommand selectCmd = new NpgsqlCommand("SELECT data FROM binaryData", conn);
NpgsqlDataReader dr = selectCmd.ExecuteReader();
if(dr.Read())
{
    Console.Write("Output:");
    byte[] result = (byte[])dr[0];
    foreach(byte b in result)
        Console.Write(" {0}", b);
    Console.WriteLine();
}

conn.Close();

C# アプリの結果:

Input: 0 0 0 0
Output: 0 0 0 0

pgAdmin からの結果:

"\000\000\000\000"

編集:

あなたが得る理由の説明を見つけました:

92 48 48 48 48 48 48 48 48

コードを以前のバージョン Npgsql2.0.10-bin-ms.net3.5sp1.zipでチェックしたところ、上記の結果が得られました (もちろん pgAdmin は を返します\000\000\000\000)。そのため、このバグのない別のバージョンを使用するのが最善だと思います。

回答: 2.0.10 よりも新しいバージョンの Npgsql を使用しています

于 2011-08-23T12:12:32.303 に答える