使用循环将不同的参数添加到SQL查询

问题描述 投票:0回答:2

所以,我试图在c#中的表单上使用条件语句和复选框来有条件地构建MySQL SQL查询。我没有看到很多主题,所以要么我做错了(很可能),要么我错过了一些简单的东西。无论哪种方式,我已经撞墙,可以使用一些帮助。

这是一个场景:我正在尝试在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”)。现在一些快速说明澄清。

•抛出错误的地方是在循环中添加的第一个变量。

•我刚刚发表评论的所有区域都进行了清理,但是当它再次使用时,我会重复评论名称。

•如果我不应该使用这种方法,我对其他方法持开放态度。

编辑:•我试图传递的第一个参数是一个字符串,选择日期时间区域的片段是为了简化它以演示我的方法。

任何帮助都表示赞赏,显然是在尝试消毒我的输入,但我不确定我做错了什么。

c# mysql loops input-sanitization
2个回答
1
投票

更改:

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

至:

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

placeholders[f]包含@/*FieldVar*/,这是AddWithValue期待的参数名称。如果用额外的双引号括起来,最终会尝试使用名为"@/*FieldVar*/"的参数,该参数与SQL查询不匹配并导致“field1必须定义”错误。


0
投票

如果MySQL表中有DATE或DATETIME列,则必须传递System.DateTime类型的参数值,而不是带有格式化日期的字符串。

List<object> parameters = new List<object>();
...
parameters.Add(fieldVar, DateTimePickerOnForm.Value);
...
© www.soinside.com 2019 - 2024. All rights reserved.