Использование цикла для добавления различных параметров в SQL-запрос

Итак, я пытаюсь использовать условные операторы и флажки на форме в C# для условного построения SQL-запроса MySQL. Я не вижу много тем на эту тему, поэтому либо я делаю что-то не так (вполне возможно), либо мне не хватает чего-то простого. В любом случае, я врезался в стену и мог бы помочь.

Вот сценарий: я пытаюсь создать форму поиска в C# для моей базы данных MySQL, и в зависимости от того, какие параметры выбирает пользователь, зависит от степени детализации поиска.

Так что в основном это выглядит так:

/*Obviously sanitized
  the variable areas*/
string exportQuery = "SELECT * FROM `/*Schema*/`.`/*Table*/` WHERE `/*PK*/`=";
List<string> parameters = new List<string>();
List<string> fields = new List<string>();
List<string> placeholders = new List<string>();
DataTable exportTemp;
int v = 0;

и в каждой точке ниже она проходит проверку следующим образом:

 if (/*ACheckBox*/.Checked == true)
 {
     v++;
     /*String variable I initialized earlier*/ = DateTimePickerOnForm.Value.ToString("yyyy-MM-dd");
     parameters.Add(/*String variable I initialized earlier*/);
     fields.Add("AND `/*FieldX*/`=@/*FieldVar*/ ");
     placeholders.Add("@/*FieldVar*/");
 }

и в конце он подсчитывает их все и начинает добавлять:

 if (v > 0)
 {
     //Build the custom Query
     foreach (string s in fields)
     {
         exportQuery += s;
     }
     //tack on the closing semicolon
     exportQuery += ";";
     Program.conn.Open();
     using (MySqlCommand data = new MySqlCommand(exportQuery, Program.conn))
     {
         data.Prepare();
         for (int f = 0; f < v; f++)
         {
             data.Parameters.AddWithValue("\"" + placeholders[f] + "\"", parameters[f]);
         }
         //Datatable prep
         exportTemp = Program.FillTable(data);/*this runs the query through the database*/
      }

Тем не менее, я получаю неопределенные переменные ошибки обратно (например, "field1 должны быть определены"). Теперь несколько быстрых заметок для уточнения.

• Там, где выбрасывается ошибка, первая переменная добавляется в цикл.

• Все области, где я только что оставил комментарий, очищаются, но при повторном использовании я повторяю название комментария.

• Если я не должен использовать этот метод, я открыт для других методов.

Редактировать: • первый параметр, который я пытаюсь передать, - это строка, выбранная из области даты и времени для простоты, чтобы продемонстрировать мою методологию.

Любая помощь приветствуется, очевидно, я пытаюсь очистить мой вклад, но я не уверен, что я делаю неправильно.

2 ответа

Решение

Изменить:

data.Parameters.AddWithValue("\"" + placeholders[f] + "\"", parameters[f]);

чтобы:

data.Parameters.AddWithValue(placeholders[f], parameters[f]);

placeholders[f] содержит @/*FieldVar*/, которое является именем параметра, AddWithValue ожидает. Если вы окружите его дополнительными двойными кавычками, вы в конечном итоге попытаетесь использовать параметр с именем "@/*FieldVar*/", который не соответствует вашему запросу SQL и вызывает ошибку "field1 должно быть определено".

Если в таблице MySQL имеется столбец DATE или DATETIME, необходимо передать значение параметра System.DateTime тип, а не строка с отформатированной датой.

List<object> parameters = new List<object>();
...
parameters.Add(fieldVar, DateTimePickerOnForm.Value);
...
Другие вопросы по тегам