c# - 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();
这就是问题所在——我从数据库中读取的字节数是94507! DataRow 的调试器屏幕
看起来它翻了一番:47253 * 2 = 94506
最令人困惑的是——还有一个带有 bytea 列的表,以及几乎相同的写入和读取文件的代码——而那部分没有这个问题。
任何帮助深表感谢!
UPD。发现了同样的问题,但也没有解决方案https://www.postgresql.org/message-id/CA%2BUJrGYaKH4Nj07LMFyxDxEKK5B%2BZNuxu2p1RZH8Ft0spJ%2Bv9Q%40mail.gmail.com
解决方案
终于找到了解决方案(感谢jdweng)。Postgresql 有两种导出字节数组数据的方法。为了为我启用正确的命令,我执行了以下命令(在数据库服务器上): ''' ALTER DATABASE your-db-name SET BYTEA_OUTPUT TO 'escape'; '''
推荐阅读
- python - How to know when a pynput Listener is stopped?
- python - Sudoku Alogirthm 无法按预期工作
- django - 使用 Django CustomUser 的 ForeignKey 给出属性错误
- ios - 从另一个类调用 Barcodescanner,无法检索数据?
- php - 将流派 ID 与名称匹配 - TMDB
- spring - 多个嵌套实体上的 Spring JPA 双向关系
- c# - 不将数据列表返回到 ASP.NET Core MVC 中的索引视图中
- javascript - 在reactjs中插入项目并显示消息之前的条件
- php - 无法使用 codeingiter 中的 imap 库连接到 hostgator
- google-sheets - 通过 Google 表单数据搜索