sql >> データベース >  >> RDS >> PostgreSQL

Postgres bytea列がバイト配列ではなく文字列(char配列)を返しています

    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のユーザー



    1. JDBCのQUERYWHERE句で変数名を指定する

    2. OracleでDecodeを使用する方法

    3. ドロップダウンボックスで選択したアイテムを設定するにはどうすればよいですか

    4. データベース設計における不十分な慣行