Fal*_*con 4 c# postgresql bytearray binary-data npgsql
我一直在使用C#为不同数据库的产品编写具体的提供程序实现.W/out进入细节,其中一列是字节数组类型(postgres中的bytea - 由于首选项bytea是在blob上选择的).唯一的问题是,它不会返回插入的相同值.当我插入Int32("0")时,我得到8 [92和8x 48](而不是[0,0,0,0]).我需要一个性能明智的解决方案,它将返回我插入的纯字节,而不是8个字节上的值"0"的ASCII表示.
我正在使用Npgsql来检索数据.如果有人知道c#的解决方案,我也很乐意学习它.
编辑: Postgres 9.0,.Net 3.5
简单化
命令查询: - 内部只执行插入语句
select InsertOrUpdateEntry(:nodeId, :timeStamp, :data)
Run Code Online (Sandbox Code Playgroud)
数据参数:
byte [] value = BitConverter.GetBytes((int)someValue);
Run Code Online (Sandbox Code Playgroud)
参数分配如下
command.Parameters.Add(new NpgsqlParameter("data", NpgsqlDbType.Bytea)
{ Value = value });
Run Code Online (Sandbox Code Playgroud)
选择陈述:
select * from Entries
Run Code Online (Sandbox Code Playgroud)
我输入的字节数组相同,我想回去.我将衷心感谢您的帮助.
输入:0 0 0 0
电流输出:92 48 48 48 48 48 48 48 48
预期输出:0 0 0 0
在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();
Run Code Online (Sandbox Code Playgroud)
来自C#app的结果:
Input: 0 0 0 0
Output: 0 0 0 0
Run Code Online (Sandbox Code Playgroud)
来自pgAdmin的结果:
"\000\000\000\000"
Run Code Online (Sandbox Code Playgroud)
编辑:
我找到了解释你为什么得到:
92 48 48 48 48 48 48 48 48
Run Code Online (Sandbox Code Playgroud)
我用以前的版本 检查了我的代码Npgsql2.0.10-bin-ms.net3.5sp1.zip并得到了上面的结果(当然pgAdmin返回\000\000\000\000),所以我认为你能做的最好的是使用没有这个bug的另一个版本.
解答: Npgsql的用户更高版本比2.0.10更高