2015-10-27 2 views
-1

Я запрашивая базы данных MySQL из C# с .NET Connector 6.8.6Параметризованная MySQL запрос не возвращает никаких результатов

Я написал следующую функцию запроса:

public DataSet ExecuteQuery() 
    { 
     try 
     { 
      this.dataset = new DataSet(); 
      dataset.Clear(); 

      conn = new MySqlConnection(this.queryConfig.GetConString()); 
      conn.Open(); 

      MySqlCommand cmd = new MySqlCommand(this.queryText, conn); 

      MySqlDataAdapter _mySQLAdapter = new MySqlDataAdapter(cmd); 

      _mySQLAdapter.Fill(dataset); 
      conn.Close(); 

      return this.dataset; 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show(ex.Message); 
      return this.dataset; 
     } 
     finally 
     { 
      if (conn != null) conn.Close(); 
     } 

    } 

Теперь я Я работаю над защитой своих запросов от SQL-инъекций.

Это мой запрос Функция:

string queryText2 = string.Format("SELECT TABLE_NAME AS 'table_name', " 
          + "round(((data_length + index_length)/1024/1024), 2) AS 'Size(MB)'" 
          + "FROM information_schema.TABLES " 
          + "WHERE table_schema = @dbname"); 


      MySqlCommand command = new MySqlCommand(queryText2); 
      command.Parameters.AddWithValue("@dbname", Convert.ToString(databaseName)); 

Однако, это не похоже на работу. @dbname в запросе String никогда не заменяется .Parameters.AddWithValue, и, таким образом, запрос терпит неудачу.

Есть ли способ заставить это работать, не отказываясь от моего полного класса запросов?

+1

Есть ли сообщения об ошибке? – Takarii

+0

@Takarii № «@dbname» просто не заменяется именем базы данных. – Fang

+0

@PanagiotisKanavos это именно то, о чем он просит о помощи .... – Takarii

ответ

1

Проблема здесь:

public DataSet ExecuteQuery() 
{ 
    ... 
     MySqlCommand cmd = new MySqlCommand(this.queryText, conn); 
     // parameters are lost!! 
     MySqlDataAdapter _mySQLAdapter = new MySqlDataAdapter(cmd); 

    ... 
} 

Вы создаете новый MySqlCommand путем копирования текста команды, но вы не копирование параметров. Поэтому добавляемый параметр теряется. Я бы предложил рассмотреть ваш дизайн, чтобы либо прекратить копирование sql из одной команды в другую, либо скопировать параметры.

+0

Да, спасибо. Это действительно проблема :) – Fang

-2

Почему бы не так?

string queryText2 = string.Format("SELECT TABLE_NAME AS 'table_name', " 
           + "round(((data_length + index_length)/1024/1024), 2) AS 'Size(MB)'" 
           + "FROM information_schema.TABLES " 
           + "WHERE table_schema = {0}",Convert.ToString(databaseName)); 
+1

Это не полезно. databaseName уже является строкой. String.Format в этом случае является избыточным. Более того, ваше «решение» не помогает в отношении возможных SQL-инъекций, что является целым пунктом моего вопроса. – Fang

+1

** Это ** относится к SQL-инъекции. Кроме того, он будет терпеть неудачу с синтаксической ошибкой, так как нет кавычек вокруг значения. Проблема не в MySQL или использовании параметризованных запросов, а в содержании параметра –