Параметры MySQL.AddWithValue сбой / не работает в c#

#c# #mysql

#c# #mysql

Вопрос:

Я пытаюсь выбрать значения для таблицы MySQL.

Я использую AddWithValue метод, но он не заменяет то, что у меня есть в командной строке.

Вот некоторый пример кода, который завершается с ошибкой, и возвращаемое значение пустое.

 private DataSet RetrieveProducts()
{
   DataTable dt1 = new DataTable();
   DataTable dtProducts = new DataTable();
   DataSet dsProducts = new DataSet();

    var paramValuenamens = string.Join(", ", Masterpage.Container.TheObjectPropertyNameNs);
    var strEmail = Masterpage.Container.TheObjectPropertyNameEmail.ToString();

    string sql = @String.Format(" SELECT * FROM ");
    sql  = String.Format(" doTable ");
    sql  = String.Format(" WHERE 1 ");

    if (Masterpage.Container.theObjectPropertyAut == 1)
    {
        sql  = String.Format(" AND doTableEmail = ? ");
    }

    sql  = String.Format(" AND doTableNameNs IN ({0}) ", paramValuenamens.ToString());


    using (MySqlConnection myConnectionString =
      new MySqlConnection(ConfigurationManager.ConnectionStrings["cn"].ConnectionString))
    {
        using (MySqlCommand cmd =
            new MySqlCommand(sql, myConnectionString))
        {
            cmd.Parameters.AddWithValue("param1", strEmail.ToString());

            foreach (var param in paramValuenamens)
            {
                cmd.Parameters.Clear();
                cmd.Parameters.AddWithValue("param2", param.ToString());
            }

            MySqlDataAdapter adapter =
                new MySqlDataAdapter(cmd);

            adapter.Fill(dsProducts);

            if (dsProducts.Tables.Count > 0)
            {
                dt1 = dsProducts.Tables[0];
            }

            dtProducts = dt1;
        }
    }

    return dsProducts;
}
  

Но если изменить мой код с

 if (Masterpage.Container.theObjectPropertyAut == 1)
{
    sql  = String.Format(" AND doTableEmail = ? ");
}
  

Для

 if (Masterpage.Container.theObjectPropertyAut == 1)
{
    sql  = String.Format(" AND doTableEmail = '"   strEmail.ToString()   "' ");
}
  

Возврат правильный…

Я безуспешно пробовал это предложение

Как это решить?

Можете ли вы мне помочь, пожалуйста?

Заранее благодарю вас за любую помощь

Комментарии:

1. Эмм, никакие параметры ничего не заменяют в тексте вашего запроса. Они отправляются в ядро базы данных вместе с текстом команды, где вы помещаете заполнители в виде @ParamName и т.д.

2. Также для предложения IN вы не можете указать только один параметр для всех значений, которые вы хотите проверить. Вам нужен параметр (с другим именем) для каждого значения, которое вы хотите включить в предложение IN.

3. @Steve Я пробовал это mysqlconnector.net/overview/using-addwithvalue безуспешно

4. как написано в дубликате, вам нужно добавить для каждой записи в предложении IN параметр.

5. @nbk также это в Java

Ответ №1:

Вы пытаетесь использовать параметры без установки правильного заполнителя в тексте запроса. Поэтому измените условие на….

 if (Masterpage.Container.theObjectPropertyAut == 1)
{
    sql  = " AND doTableEmail = @email ");
}

....
  

Теперь добавьте параметр, используя то же имя, что и для заполнителя

 cmd.Parameters.AddWithValue("@email", strEmail);
  

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

Вам это не нужно, потому что вы уже добавили значения непосредственно через приведенный выше строковый формат.

 // foreach (var param in paramValuenamens)
// {
//     cmd.Parameters.Clear();
//     cmd.Parameters.AddWithValue("param2", param.ToString());
// }
  

Теперь это должно сработать, но, конечно, это не полный параметризованный запрос, потому что предложение IN для doTableNameNs по-прежнему использует конкатенацию строк (формат по-прежнему является конкатенацией и не защищает вас от sql-инъекции). Это приемлемо, только если вы абсолютно уверены, что используемое значение не получено из пользовательского ввода или другого носителя, который вы не можете контролировать. В противном случае вам необходимо создать коллекцию параметров и строк-заполнителей для вставки в инструкцию IN для doTableNameNs