2016-07-15 2 views
0

моя проблема в том, что две две нежелательные одиночные кавычки появляются в моей команде, когда я использую AddWithValue. Это, как я называю свою функцию:C# MySqlCommand.Parameters.AddWithValue, параметры для выражения таблицы, приведенная команда имеют добавленную одинарную цитату

string sqlTableName = "the_table_i_want"; 
DataTable myDataTable = SQLcom.SelectLastValueInTab(sqlTableName); 

My Function;

public static DataTable SelectLastValueInTab(string TableName) 
    { 
     using (MySqlConnection con = new MySqlConnection(ConnStr)) 
     { 
      using (MySqlCommand myCommand = new MySqlCommand("SELECT * FROM @TabName ORDER BY id DESC LIMIT 1", con)) 
      { 
       myCommand.Parameters.AddWithValue("@TabName", TableName); 
       try 
       { 
        con.Open(); 
        MySqlDataReader testreader = myCommand.ExecuteReader(); 

Приведенное команда:

"SELECT * FROM 'the_table_i_want' ORDER BY id DESC LIMIT 1" 

И предполагают, чтобы быть:

"SELECT * FROM the_table_i_want ORDER BY id DESC LIMIT 1" 

Это заставит программу врезаться обусловленно у меня есть:

a syntax error near ''the_table_i_want' ORDER BY id DESC LIMIT 1' 

PS : если я не использую AddWithValuechange и изменения

@TabName for the_table_i_want 

в MySqlCommand он отлично работает!

Большое спасибо!

Daniel G.B

+4

Вы не можете использовать параметры для выражения имени таблицы или поля. Вы можете использовать их только для значений. – Steve

+2

Подготовленные утверждения не предназначены для использования таким образом. Метод 'AddWithValue' видит, что это строка и цитирует ее для вас. Если 'TableName' не является пользователем, просто соедините его с вашим запросом, но окружите его квадратными скобками:' 'SELECT * FROM [" + TableName + "] ..." 'или какая бы система ваша RDBMS не использовала (backticks?). Вы также хотите иметь допустимый список имен таблиц, перечисленных где-то. Если 'TableName' не находится в этом списке, не выполняйте запрос. Это должно защитить вас от SQL-инъекции. –

+0

@Steve благодарит много, что было именно моей проблемой! Но спецификация этого в спецификации [определение метода?] Отсутствует (https://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlparametercollection.addwithvalue (v = vs.110) .aspx) –

ответ

1

Как комментарии предполагают, Вы не можете использовать параметры для выражения таблицы или поля имени. Альтернативным подходом было бы добавление имени таблицы в запрос.

public static DataTable SelectLastValueInTab(string TableName) 
{ 
    using (MySqlConnection con = new MySqlConnection(ConnStr)) 
    { 
     string qry = "SELECT * FROM " + TableName + " ORDER BY id DESC LIMIT 1"; 
     using (MySqlCommand myCommand = new MySqlCommand(qry, con)) 
     { 
      try 
      { 
       con.Open(); 
       MySqlDataReader testreader = myCommand.ExecuteReader(); 
+0

Большое спасибо. Работать отлично. –

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