使用循环向 SQL 查询添加不同的参数
Using a Loop to add varying parameters to an SQL Query
因此,我尝试在 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 must be defined")。现在一些快速说明以供澄清。
• 它抛出错误的地方是在循环中添加的第一个变量中。
• 我刚刚发表评论的所有区域都已清理,但再次使用时我会重复评论名称。
• 如果我不应该使用这种方法,我愿意接受其他方法。
编辑:
• 我试图传递的第一个参数是一个字符串,选择日期时间区域的片段是因为它的简单性来演示我的方法。
感谢任何帮助,显然是在尝试清理我的输入,但我不确定我做错了什么。
如果 MySQL table 中有 DATE 或 DATETIME 列,则必须传递 System.DateTime
类型的参数值,而不是带有格式化日期的字符串。
List<object> parameters = new List<object>();
...
parameters.Add(fieldVar, DateTimePickerOnForm.Value);
...
变化:
data.Parameters.AddWithValue("\"" + placeholders[f] + "\"", parameters[f]);
至:
data.Parameters.AddWithValue(placeholders[f], parameters[f]);
placeholders[f]
包含 @/*FieldVar*/
,这是 AddWithValue
期望的参数名称。如果用额外的双引号将其括起来,您最终会尝试使用名为 "@/*FieldVar*/"
的参数,该参数与您的 SQL 查询不匹配并导致 "field1 must be defined" 错误。
因此,我尝试在 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 must be defined")。现在一些快速说明以供澄清。
• 它抛出错误的地方是在循环中添加的第一个变量中。
• 我刚刚发表评论的所有区域都已清理,但再次使用时我会重复评论名称。
• 如果我不应该使用这种方法,我愿意接受其他方法。
编辑: • 我试图传递的第一个参数是一个字符串,选择日期时间区域的片段是因为它的简单性来演示我的方法。
感谢任何帮助,显然是在尝试清理我的输入,但我不确定我做错了什么。
如果 MySQL table 中有 DATE 或 DATETIME 列,则必须传递 System.DateTime
类型的参数值,而不是带有格式化日期的字符串。
List<object> parameters = new List<object>();
...
parameters.Add(fieldVar, DateTimePickerOnForm.Value);
...
变化:
data.Parameters.AddWithValue("\"" + placeholders[f] + "\"", parameters[f]);
至:
data.Parameters.AddWithValue(placeholders[f], parameters[f]);
placeholders[f]
包含 @/*FieldVar*/
,这是 AddWithValue
期望的参数名称。如果用额外的双引号将其括起来,您最终会尝试使用名为 "@/*FieldVar*/"
的参数,该参数与您的 SQL 查询不匹配并导致 "field1 must be defined" 错误。