Путь к файлу вставки NpgSQL, содержащий обратную косую черту "\\" - PullRequest
2 голосов
/ 22 марта 2010

Я пытаюсь создать запись, содержащую путь к файлу. Вставка выполняется в базу данных 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 для вставки вышеприведенного оператора он работает нормально. При использовании драйвера NpgSQL через Visual Studio C # происходит сбой с этим исключением:

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

Как точно объясняет Милен , Постгрес интерпретирует утверждение как octal число (\ o201 == 0x81).

Как и Милен также описывает, E infront пути не помогает.

Итак, краткий обзор: почему NpqSQL останавливает мой ввод \\2010?

Ответы [ 2 ]

3 голосов
/ 23 марта 2010

(понял, что мои комментарии выглядят как ответ, поэтому преобразовал их соответственно.)

Вы не показали реальный код, поэтому я предполагаю, что ваш интерпретатор / компилятор интерпретирует двойной обратный слеш как экранированный обратный слеш, а затем Postgres видит только один обратный слеш, за которым следуют несколько цифр. Что интерпретируется как восьмеричное значение байта (восьмеричное 201 = шестнадцатеричное 81).

О строковых константах escape (строки, начинающиеся с «E») - в вашем случае они совершенно не нужны. В стандартном SQL обратная косая черта не имеет особого значения.

Пожалуйста, прочитайте "4.1.2.1. Строковые константы" и "4.1.2.2. Строковые константы с E-Style Escape" в руководстве (http://www.postgresql.org/docs/current/static/sql-syntax-lexical.html#SQL-SYNTAX-CONSTANTS) для подробностей.

1 голос
/ 25 марта 2010

Милен заслуживает похвалы за то, что привел меня к ответу - спасибо!

Кажется, NpgSQL выполняет одну escape-итерацию перед тем, как вставить мой оператор SQL в Postgres. Таким образом, чтобы решить мою проблему, я заменил все вхождения моих обратных косых черт вместо двух:

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