包含反斜杠“\\”的NpgSQL插入文件路径

时间:2010-03-22 15:33:18

标签: c# postgresql visual-studio-2010 npgsql

我正在尝试创建一个包含文件路径的记录。插入是使用Postgres驱动程序在启用了UTF8的NpqSQL数据库中完成的。

我的表格定义:

CREATE TABLE images
(
    id serial,
    file_location character varying NOT NULL
)

我的SQL语句包括执行它的代码(归结为最低限度):

string sqlStatement = "INSERT INTO images (file_location) VALUES ('\\2010')";

NpgsqlConnection dbConnection = new NpgsqlConnection(connectionString);
dbConnection.Open();
NpgsqlCommand dbCommand = new NpgsqlCommand(sqlStatement , dbConnection);
int result = dbCommand.ExecuteNonQuery();
dbConnection.Close();    

使用 pgAdmin 插入上述语句时,它可以正常工作。通过 Visual Studio C#使用 NpgSQL 驱动程序,它会因此异常而失败:

"ERROR: 22021: invalid byte sequence for encoding \"UTF8\": 0x81"

正如 Milen 准确解释的那样,Postgres将该语句解释为octal个数字(\ o201 == 0x81)。

正如 Milen 所述,路径前面的E无效。

快速回顾一下:为什么NpqSQL停止插入\\2010

2 个答案:

答案 0 :(得分:3)

(意识到我的评论看起来像一个答案,所以相应地转换了它们。)

你没有显示真正的代码,所以我认为你的解释器/编译器将双反斜杠解释为转义反斜杠,然后Postgres只看到一个反斜杠后跟一些数字。它解释为八进制字节值(八进制201 =十六进制81)。

关于“escape”字符串常量(以“E”开头的字符串) - 在您的情况下,它们是完全没必要的。在标准SQL中,反斜杠没有特殊含义。

请参阅手册(http://www.postgresql.org/docs/current/static/sql-syntax-lexical.html#SQL-SYNTAX-CONSTANTS)中的“4.1.2.1。字符串常量”和“4.1.2.2。带有C风格转义的字符串常量”。

答案 1 :(得分:1)

Milen 值得我的回答 - 谢谢!

在将我的SQL语句插入Postgres之前,NpgSQL执行一次转义迭代。因此,为了解决我的问题,我用两个反斜杠替换了我的反斜杠的所有出现:

string path = ... my path ...
path = path.Replace("\\", "\\\\");
sqlStatement = "INSERT INTO images (file_location) VALUES ('" + path + "')";