Почему PostgreSQL обрабатывает значение в моем запросе как имя столбца? - PullRequest
1 голос
/ 13 декабря 2011

Я использую Npgsql с C # для связи с моей базой данных PostgreSQL. Все имена, используемые в моей базе данных, имеют смешанный регистр, поэтому в запросе я использую двойные кавычки вокруг каждого имени. Вот как я отправляю запрос:

// construct an insert query
string insertQuery = "insert into \"Update\" (\"Vehicle\",\"Property\",\"Value\") " + 
                     "values (" + vehicleNum.ToString() + ",\"" + propertyName + 
                     "\",\"" + propertyValue + "\")";

// execute the query
NpgsqlCommand insertCommand = new NpgsqlCommand(insertQuery, conn);
insertCommand.ExecuteScalar();

Вставив точку останова и проверив, я проверил, что строка insertQuery выглядит так перед отправкой:

insert into "Update" ("Vehicle","Property","Value") values (12345,"EngineSpeed","50")

Когда я отправляю этот запрос, PostgreSQL выдает мне ошибку, которая заключена в исключение Npgsql, которое гласит: ERROR: 42703: column "EngineSpeed" does not exist

Из моего запроса должно быть очевидно, что EngineSpeed - это не столбец, это значение столбца Property, поэтому, естественно, столбец с таким именем вряд ли существует. Итак, почему PostgreSQL обрабатывает мой запрос таким образом, и как я могу решить эту проблему? Мой запрос был составлен неправильно?

Ответы [ 2 ]

5 голосов
/ 13 декабря 2011

Используйте одинарные кавычки для цитирования строк.Двойные кавычки используются для обозначения имен столбцов.

2 голосов
/ 13 декабря 2011

Нет, из показанного вами запроса видно, что EngineSpeed ​​- это столбец, поскольку он экранирован как таковой.

Вы также не заботились о том, чтобы убедиться, что переданные значения были экранированы, что может быть серьезной проблемой безопасности.

Вы хотите insert into "Update" ("Vehicle","Property","Value") values (12345,'EngineSpeed','50')

Что вы могли бы смело предоставить:

string insertQuery = "insert into \"Update\" (\"Vehicle\",\"Property\",\"Value\") " + 
                     "values (" + vehicleNum.ToString() + ",'" + propertyName.Replace("'", "''") + 
                     "','" + propertyValue.Replace("'", "''") + "')";

Хотя вам лучше использовать параметры с NPGSQL, который с этим справится, включая все эти неприятные крайние случаи, в которых наши модульные тесты полны:)

...