2010-03-22 4 views
2

Я пытаюсь создать запись, содержащую путь к файлу. Вставка выполняется в базу данных Postgres, где разрешен UTF8 с использованием драйвера NpqSQL.NpgSQL вставить путь к файлу, содержащий обратную косую черту «\»

Мое определение таблицы:

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

My 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" 

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

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

Итак, краткое описание: Почему NpqSQL останавливает мою установку \\2010?

+0

Вы читали «4.1.2.1 Строковые константы.» И «4.1.2.2 Строковые константы с C-Style Escapes.» из руководства (http://www.postgresql.org/docs/current/static/sql-syntax-lexical.html#SQL-SYNTAX-CONSTANTS)? –

+0

@Milen: «Любой другой символ, следующий за обратной косой чертой, берется буквально. Таким образом, чтобы включить символ обратной косой черты, напишите две обратные косые черты (\\\)». Моя логика говорит мне, что «\\» рассматривается до значения восьмеричного байта «\ 2 ...»? – Chau

+2

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

ответ

1

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

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

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

C# использует обратную косую черту (http://msdn.microsoft.com/en-us/library/362314fe.aspx) для управляющих последовательностей в обычных строках. Таким образом, чтобы включить одиночную обратную косую черту в строку, вам понадобятся две обратные косые черты. Но существуют «строковые литералы Verbatim» с префиксом @, которые могут быть полезны в этом случае (@ «c: \ Docs \ Source \ a.txt» и «c: \\ Docs \\ Source \\ a.txt «). –

+0

@Milen: Да, как правило, это очень полезно, но когда строка передается в NpgSQL, обратные косыми чертами удаляются :( – Chau

3

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

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

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

Подробнее см. «4.1.2.1 Строковые константы» и «4.1.2.2. Строковые константы с экранами стилей C» из руководства (http://www.postgresql.org/docs/current/static/sql-syntax-lexical.html#SQL-SYNTAX-CONSTANTS).

+0

@Milen: Спасибо за ваши усилия. Я отредактировал свое оригинальное сообщение и включил код. Я все еще не могу понять, где «\\» преобразуется в «\». – Chau

 Смежные вопросы

  • Нет связанных вопросов^_^