2016-04-22 2 views
-1

Я пытаюсь выбрать из таблицы, где имя таблицы присваивается переменной, как im, используя две разные таблицы. Однако при этом возникает ошибка DB2Exception.C# SQL Выберите параметр таблицы запроса

db2Error = {"ERROR [42601] [IBM][AS] SQL0104N An unexpected token \"'TABLENAME'\" was found following \"\". 

Этот запрос является тот, который вызывает ошибку - Имя таблицы представляет собой строку, которая имеет названия таблицы.

string strUpdate = "SELECT COMMENT FROM '" + tableName + "' WHERE NUMBER = '" + strNumber + "' AND CODE = '" + c.Trim() + "' "; 

Этот запрос работает отлично, хотя -

// string strUpdate = "SELECT COMMENT FROM TABLE WHERE NUMBER = '" + strNumber + "' AND CODE = '" + c.Trim() + "'"; 

Можно ли параметризовать/переменную использовать для имени таблицы?

+3

Обнаружен высокий риск внедрения SQL-инъекций! – dotctor

+0

Вы отлаживали свой код и проверяли значение «tablename»? Покажите нам строку запроса sql, назначенную для strUpdate. Ваша таблица имен таблиц ??? –

+0

Да, я знаю уязвимость SQL Injection, но сначала эту проблему нужно решить. И да имена таблиц верны в tablename при отладке – user6097989

ответ

1

SQL инъекции риска в сторону, два, показанные запросы просто не то же самое.

Запрос вы показали это

string strUpdate = "SELECT COMMENT FROM TABLE WHERE NUMBER = " т.д.

Однако код вы показали, производит следующий запрос:

string strUpdate = "SELECT COMMENT FROM 'TABLE' WHERE NUMBER = " т.д.

Имя таблицы должно просто не быть в кавычках. И учитывая тот факт, что вы не используете параметры, это даже не ошибка системы параметров; кавычки находятся прямо в вашем собственном коде построения запроса. Просто удалите их.

+1

Привет, Ive удалил '' цитаты с обеих сторон, и он отлично работает. Я также принял во внимание все комментарии SQL-инъекций, поэтому спасибо за это. – user6097989

1

Почему вы используете qoutes в своем заявлении от? она должна просто быть

select sysdate 
from dual; 

использовать также класс SqlCommand для добавления параметров в вашем SelectStatement следующим образом.

string strUpdate = "SELECT COMMENT FROM @tablename WHERE NUMBER = @strnumber AND CODE = @c"; 
SqlCommand insertCommand = new SqlCommand(strUpdate , connection); 
insertCommand.Parameters.AddWithValue("@tableName ", tableName); 
insertCommand.Parameters.AddWithValue("@strNumber ", strNumber); 
insertCommand.Parameters.AddWithValue("@c", c.trim()); 
+1

Не будет ли все еще указывать кавычки вокруг имени таблицы, учитывая тот факт, что он добавлен как параметр строки? – Nyerguds

+0

http://blogs.msmvps.com/jcoehoorn/blog/2014/05/12/can-we-stop-using-addwithvalue-already/ –