使用NPGSQL将csv文件内容写入PostgreSQL失败

4
我将使用NPGSQL 3.2.5版本帮助将CSV文件内容写入PostgreSQL表中。
我的CSV文件内容如下:
id, value
1, 89
2, 286
3, 80
4, 107

我使用以下命令来写入:
Using writer = conn.BeginTextImport("COPY tbl_test (id,value) FROM 'C:/temp/test.csv' DELIMITER ',' CSV HEADER")

当我运行我的代码时,数值将被写入数据库,但命令会抛出以下错误信息:
Received unexpected backend message CompletedResponse. Please file a bug.

当我直接在SQL Shell中运行命令时,一切正常,因此问题似乎是由NPGSQL产生的。
这是我在SQL Shell中使用的命令:
\COPY tbl_test(id,value) FROM 'C:/temp/test.csv' DELIMITER ',' CSV HEADER;

有其他人遇到过这个消息吗?

我认为添加一些实际CSV文件的行是个好主意。 - Davide Alberani
默认的分隔符在文本格式中是制表符,在CSV中是逗号,因此您可能需要指定分号作为分隔符:DELIMITER ';' - Łukasz Kamiński
我已经尝试过这个,结果一样,但是我已经编辑了我的问题。我甚至将分隔符从';'改为','。 - Manfred Singer
比较您的shell命令和NPGSQL,我假设您在shell中使用psql,在NPGSQL中使用远程COPY - 您的服务器上是否存在此路径?.. C:/temp/test.csv?.. - Vao Tsun
如果目录为空并不意味着你没有错误,而是意味着你没有收集到错误。我要查找的错误与COPY无关 - 我认为你可能会发现通信(协议)错误有助于解释异常情况。 - Vao Tsun
显示剩余6条评论
1个回答

1

github issue中所回答的,您正在错误地使用API。

如果您的CSV文件位于客户端(即Npgsql应用程序运行的位置),则应该使用COPY tbl_test(value) FROM STDIN,而不是FROM c:\temp\test.csv。后者用于当CSV文件在PostgreSQL服务器上时。请参阅文档

如果您只想导入服务器上存在的文件,请将COPY命令执行为常规SQL - 创建一个命令并使用ExecuteNonQuery执行它。不要使用BeginTextImport API。


谢谢你的提示。没有使用API函数“TextImport”,它仍然可以工作。我有点困惑,因为在NPGSQL文档中没有任何提示。在文档中你使用了“TextImport”,所以这就是我也使用它的原因。 - Manfred Singer
npgsql文档中的示例代码清楚地展示了一个使用FROM STDIN和在C#中写入CSV数据的示例。COPY的PostgreSQL文档解释了FROM STDIN和从服务器上存在的文件之间的区别。 - Shay Rojansky

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接