2016-11-25 8 views
0

Оригинал запроса, который я могу запустить положителен в PgAdminIII:Работы с двойными кавычками и параметр добавления в запрос

SELECT * FROM oestrat."Themenfeld" 

oestrat и Themenfeld представляет собой строка, поступающая из Winform текстовых полей.

Так что мой запрос в VS будет:

string qry = "SELECT * FROM @schema.\"@line\""; 

NpgsqlCommand cmd = conn.CreateCommand(); 
cmd.Parameters.Add(new NpgsqlParameter("@schema", tbSchema.Text)); // tbSchema.Text = oestrat 
cmd.Parameters.Add(new NpgsqlParameter("@line", l)); // string l = Themenfeld 

cmd.CommandText = qry; 

conn.Open(); 
NpgsqlDataReader dr = cmd.ExecuteReader(); 

while (dr.Read()) <<< ERROR 
{ 
    .... 
} 

Он всегда ловит исключение:

42601: syntax error at or near "@" 
+0

Проверьте, что 'cmd.CommandText' равно после этого 'cmd.CommandText = qry;' строка –

+0

Он равен 'SELECT * FROM @schema." @ line "' и да, сырые непараметризированные работы. – manuzi1

ответ

3

Я не верю, вы можете указать имена таблиц в качестве параметров ... только значения могут быть указаны как параметры.

Вместо этого либо есть белый список разрешенных имен таблиц, либо, по крайней мере, белый список разрешенных символов в именах таблиц, примените это к пользовательскому вводу, а затем - тщательно - постройте SQL динамически.

+0

Должен существовать метод «идентификатор выхода» или «кодовый идентификатор» где-то в 'conn' для правильного экранирования имен таблицы/столбца/.... Не знаю, что бы это было на C#. –

+0

@muistooshort: Я не знаю одного - это редко необходимо в C# из-за параметризованного SQL, что обычно предпочтительнее цитирования. По крайней мере, я не знаю об общем соглашении для такого метода. –

+0

Но идентификаторы не являются параметрами таким же образом, что переменные не могут содержать имена других переменных (без какой-либо конструкции «eval», конечно), поэтому вы зацикливаетесь на цитировании и цитировании идентификатора, специфичных для базы данных (обратные шаги для MySQL, скобки для SQL-Server, двойные кавычки для стандартного SQL, ...). –

0

Просто разобрать имя схемы и таблицы в строку ...

string qry = $"SELECT * FROM {tbSchema.Text}.{l}"; 

Очевидно вы очистили эти входные значения для инъекции SQL ...

+0

Это точная аргументация, параметры позволяют не требовать «очищения» вручную –

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

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