C# 如何在sql查询中添加一个条件来检查是否选中了CKECKBOX?

C# 如何在sql查询中添加一个条件来检查是否选中了CKECKBOX?,c#,sql,.net,C#,Sql,.net,我有几个组合框,我想选中那些被选中以检索其值的组合框​​并在sql查询中使用它们 我尝试将所有复选框放在flowLayoutPanel中,并使用foreach检索它们的内容。我认为这是sql查询中的语法问题 列表选择=新列表; flowLayoutPanel1.控件中的foreach复选框cb { 如果cb.已检查 selection.Addcb.Text; } SqlCommand command=new SqlCommandSELECT JOB_HEADER.P从JOB_HEADER中选择J

我有几个组合框,我想选中那些被选中以检索其值的组合框​​并在sql查询中使用它们

我尝试将所有复选框放在flowLayoutPanel中,并使用foreach检索它们的内容。我认为这是sql查询中的语法问题

列表选择=新列表; flowLayoutPanel1.控件中的foreach复选框cb { 如果cb.已检查 selection.Addcb.Text; } SqlCommand command=new SqlCommandSELECT JOB_HEADER.P从JOB_HEADER中选择JOB_HEADER.P,其中JOB_HEADER.MODE_F=selection 以下是我得到的错误: System.Data.dll中发生类型为“System.Data.SqlClient.SqlException”的未处理异常

其他信息:列名“selection”无效


对不起,如果解决方案是显而易见的,我是一个初学者。谢谢您的帮助。

您的实际错误是由单词选择引起的。这不是列表变量,而是字符串中的文本,数据库引擎无法知道如何从该单词中提取列表值。所以它认为你写了一个列名,但它找不到

解决方案比你想象的要复杂

您需要将一组参数和一组名称放入IN子句中

int pcount = 1;

// This is where we keep the placeholder text for the parameters 
List<string> names = new List<string>();

// This is the list of parameters built using the checkboxes checked state
List<SqlParameter> prms = new List<SqlParameter>();

foreach (CheckBox cb in flowLayoutPanel1.Controls)
{
    if (cb.Checked)
    {
        names.Add("@p" + pcount);
        prms.Add(new SqlParameter 
        {
            ParameterName = "@p" + pcount, 
            SqlDbType = SqlDbType.NVarChar, 
            Value = cb.Text,
            // For performance it would be useful also to specify the column size
            // Size = 100,
        });
        pcount++;
    }
}

// Build the sql command adding all the parameters placeholders inside an IN clause
string cmdText = @"SELECT JOB_HEADER.P FROM JOB_HEADER WHERE JOB_HEADER.MODE_F IN(";
cmdText += string.Join(",", names) + ")";

SqlCommand command = new SqlCommand(cmdText, connection);
// Give the parameters collection to the command
command.Parameters.AddRange(prms.ToArray());

您的错误来自SQL语句中的术语“selection”。您正在尝试传递列表的名称,而不是该列表中复选框的值

原件:

SqlCommand command = new SqlCommand("SELECT JOB_HEADER.P FROM JOB_HEADER WHERE JOB_HEADER.MODE_F = selection");
试试这个,我还没有测试过,但应该很接近:

SqlCommand command = new SqlCommand("SELECT JOB_HEADER.P FROM JOB_HEADER WHERE JOB_HEADER.MODE_F IN(" + string.Format("'{0}'", string.Join("','", selection.Select(i => i.Replace("'", "''")))) + ")");

[已编辑的假设字符串而非整数的建议]

您应该将项目列表添加到字符串中:

SqlConnection conn = new SqlConnection("//connectionstring");         

var inList = "(" + string.Join(", ", selection.Select(t => "@" + t)) + ")";         

string query = String.Format("SELECT JOB_HEADER.P FROM JOB_HEADER WHERE JOB_HEADER.MODE_F  IN ({0})", inList);         

SqlCommand cmd = new SqlCommand(query, conn); 
或使用添加参数:


[

MODE\u F列是什么样子的,它可能的值是什么?您复选框的值是什么?另外,您使用的是SQL Server、MySQL、Oracle等哪个数据库?您必须通过使用或选择JOB\u HEADER.MOD来迭代列表选择并从这些值生成SQL语句E_F=that.Etc…查找错误的最佳方法是使用SQL Server Management Studio并将查询放入SSMS中的新查询窗口中。错误消息ii SSMS比c好1000倍,您将很快找到问题的原因。我没有投反对票,但可能是因为联接中的字符串没有用表示t的撇号包装ext.我们不知道字符串正在被传递。这就是为什么我声明它是整数的假设。好吧,op在他们的代码中演示了他们正在将cb.Text存储到一个列表中,就是这样。这很公平。我已经编辑了我的答案,以假设字符串而不是整数。@CharlesMay falcon eyes在这里!:-不喜欢这样的假设在您尝试在没有其帮助的情况下编写代码之前,对IDE进行身份验证已经足够了。实际上,它似乎比我想象的要复杂得多。您的解决方案似乎很完美,但我的代码中有两个错误。一个是“SqlDbType.NVarChar”返回ITIS:Invalid initializer member declarator。另一个是“command.Parameters.AddRangeprms.ToArray;”返回:参数1:cannot c从“方法组”转换为“SqlParameter[]”我将尝试查找问题。非常感谢。我明白了,请刷新页面。我想我已经修复了注意到的问题