2011-12-12 2 views
0

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

+4

... Ваша таблица действительно называется «Обновить»? – Phill

+0

Да, это не отличная идея. –

+0

Не поддерживает ли Npgsql заполнители? Построение строки SQL вручную, как это, действительно, не очень хорошая идея. –

ответ

4

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

2

Нет, из запроса, который вы видите, очевидно, что 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, который будет обрабатывать это для вас, в том числе все эти неприятные случаи края нашего модульные тесты полны :)

+0

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

+0

Ваш вопрос помещает EngineSpeed ​​в '' 'Mine (при отсутствии опечаток) помещает его в' ''. Я также проверяю, чтобы заменить '' 'внутри него на два раза (' Engine'Speed' станет '' Engine''Speed'') который является одним из правильных способов избежать его (есть несколько других допустимых способов делать строки в PostgreSQL). Опять же, вам лучше использовать NpgsqlParameter и работать с NPGSQL для вас. другие типы параметров и Npgsql должны иметь их все к настоящему времени (я сам делал большую часть работы для типов массивов, но это было главным образом изучением из предыдущей работы других). –

+0

О, мой плохой, я упустил из виду изменения, которые у вас были Спасибо. – Dalal