Путь к файлу вставки NpgSQL, содержащий обратную косую черту «\\»

2

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

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

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

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

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

  • 0
    Читали ли вы «4.1.2.1. Строковые константы» и «4.1.2.2. Строковые константы с побегами в стиле C» из руководства ( postgresql.org/docs/current/static/… )?
  • 0
    @Milen: «Любой другой символ, следующий за обратной косой чертой, воспринимается буквально. Таким образом, чтобы включить символ обратной косой черты, напишите две обратные косые черты (\\).». Моя логика говорит мне, что '\\' считается перед восьмеричным значением байта '\ 2 ...'?
Показать ещё 3 комментария
Теги:
visual-studio-2010
npgsql

2 ответа

1
Лучший ответ

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

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

string path = ... my path ...
path = path.Replace("\\", "\\\\");
sqlStatement = "INSERT INTO images (file_location) VALUES ('" + path + "')";
  • 0
    C # использует обратную косую черту ( msdn.microsoft.com/en-us/library/362314fe.aspx ) для escape-последовательностей в обычных строках. Таким образом, чтобы включить одну обратную косую черту в строку, вам нужно две обратной косой черты. Но существуют «дословные строковые литералы» с префиксом @, которые могут быть полезны в этом случае (@ "c: \ Docs \ Source \ a.txt" против "c: \\ Docs \\ Source \\ a.txt «).
  • 0
    @Milen: Да, @ обычно очень полезен, но когда строка передается в NpgSQL, обратные слеши удаляются :(
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
    @ Милен: Спасибо за ваши усилия. Я отредактировал свой оригинальный пост и включил код. Я до сих пор не могу понять, где «\\» преобразуется в «\».

Ещё вопросы

Сообщество Overcoder
Наверх
Меню