首页 > 解决方案 > C# postgresql dataAdapter 将 byteArray 中的字节数加倍?

问题描述

我有一些旧版应用程序:

两个 .NET4.5 Windows 应用程序和一个 PostgreSQL 9.2 数据库(目前在 WinXP 32 位虚拟机上运行)

第一个应用程序通过以下方式将一些文件保存到数据库中:

NpgsqlConnection conn = new NpgsqlConnection(CONN_STRING);
conn.Open();
pgsqlParameter cl_code = new NpgsqlParameter("@cl_code", NpgsqlTypes.NpgsqlDbType.Varchar);
NpgsqlParameter mes_text = new NpgsqlParameter("@mes_text", NpgsqlTypes.NpgsqlDbType.Varchar);
NpgsqlParameter file_name = new NpgsqlParameter("@file_name", DbType.String);
NpgsqlParameter data = new NpgsqlParameter("@data", NpgsqlTypes.NpgsqlDbType.Bytea);

NpgsqlCommand addComm = new NpgsqlCommand("insert into communication (createtime,channel,client_code,message,file_name,data, sent) " +
"VALUES (current_timestamp,'Email', @cl_code, @mes_text,@file_name,@data, false);", conn);

cl_code.Value = client["code"];
mes_text.Value = String.Format("Заказ {0}({1}) отправлен в производство", order["clientid"], order["id"]);
file_name.Value = Path.GetFileName(filepath);
data.Value = File.ReadAllBytes(filepath);

addComm.Parameters.Add(cl_code);
addComm.Parameters.Add(mes_text);
addComm.Parameters.Add(file_name);
addComm.Parameters.Add(data);

addComm.ExecuteNonQuery();
conn.Close();

示例文件的确切大小为47253字节: 文件大小

这正是存储在数据库中的内容:

数据库中的大小

第二个应用程序尝试从数据库中读取文件,如下所示:

messages.Clear();
conn.Open();

NpgsqlDataAdapter dataAdapter1 = new NpgsqlDataAdapter();
                           
NpgsqlParameter cust = new NpgsqlParameter("@client_code", DbType.String);                                                        
NpgsqlCommand command = new NpgsqlCommand("select * from communication WHERE channel = 'Email' AND sent = false and client_code = @client_code;", conn);

 
 cust.Value = customer["code"];
 command.Parameters.Add(cust);
 dataAdapter1.SelectCommand = command;

 messages = new DataTable();
 dataAdapter1.Fill(messages);
 conn.Close();

这就是问题所在——我从数据库中读取的字节数是94507DataRow 的调试器屏幕

看起来它翻了一番:47253 * 2 = 94506

最令人困惑的是——还有一个带有 bytea 列的表,以及几乎相同的写入和读取文件的代码——而那部分没有这个问题。

任何帮助深表感谢!

UPD。发现了同样的问题,但也没有解决方案https://www.postgresql.org/message-id/CA%2BUJrGYaKH4Nj07LMFyxDxEKK5B%2BZNuxu2p1RZH8Ft0spJ%2Bv9Q%40mail.gmail.com

标签: c#postgresqlwinforms

解决方案


终于找到了解决方案(感谢jdweng)。Postgresql 有两种导出字节数组数据的方法。为了为我启用正确的命令,我执行了以下命令(在数据库服务器上): ''' ALTER DATABASE your-db-name SET BYTEA_OUTPUT TO 'escape'; '''


推荐阅读