生成具有可变数量参数的paramalized查询

本文关键字:参数 paramalized 查询 | 更新日期: 2023-09-27 18:11:49

我有一些设计师生成的代码,我用来查询数据集。设计器生成它,因为我有一个窗体与ReportViewer创建了自己的bindingsource和tableadapter。我在TableAdapter智能标签上使用了"添加查询…"功能。

查询是一个简单的SELECT命令。它的工作发现,但我想有时查询多个记录一次(我正在生成一个基于条形码列表的报告,几乎总是有很多)。设计师给了我这样的代码:

    public virtual int FillBySampleID(dbReceivedSamplersDataSetAccess.tblReceivedSamplersDataTable dataTable, string Param1) {
        //FYI the select command it used is "SELECT * FROM tblReceivedSamplers WHERE SampleID IN (?)"
        this.Adapter.SelectCommand = this.CommandCollection[2];
        if ((Param1 == null)) {
            throw new global::System.ArgumentNullException("Param1");
        }
        else {
            this.Adapter.SelectCommand.Parameters[0].Value = ((string)(Param1));
        }
        if ((this.ClearBeforeFill == true)) {
            dataTable.Clear();
        }
        int returnValue = this.Adapter.Fill(dataTable);
        return returnValue;
    }

这是有效的,是很好的一个单一的记录,所以我重载了这个方法,并创建了这个代码,以允许我传递任何数量的参数一次使用WHERE…IN SQL语句

    public virtual int FillBySampleID(dbReceivedSamplersDataSetAccess.tblReceivedSamplersDataTable dataTable, string[] Params)
    {
        //this.Adapter.SelectCommand = this.CommandCollection[2];
        if ((Params == null))
        {
            throw new global::System.ArgumentNullException("Param1");
        }
        else
        {
            int numParams = Params.Length;

            List<string> lstParamQuesMarks = Enumerable.Repeat("'?'", numParams).ToList();
            string strParamQuesMarks = String.Join(",", lstParamQuesMarks);
            this.Adapter.SelectCommand.CommandText = "SELECT * FROM tblReceivedSamplers WHERE SampleID IN (" + strParamQuesMarks + ")";
            this.Adapter.SelectCommand.Parameters.Clear();
            for (int i = 0; i < numParams; i++)
            {
                this.Adapter.SelectCommand.Parameters.AddWithValue("Param"+i, Params[i]);
            }
        }
        if ((this.ClearBeforeFill == true))
        {
            dataTable.Clear();
        }
        int returnValue = this.Adapter.Fill(dataTable);
        return returnValue;
    }

我以为我很聪明,但似乎不起作用。它不会报错。如果我传递4个参数,它会生成SELECT * FROM tblReceivedSamplers WHERE SampleID IN ('?','?','?','?')的SelectCommand文本,所有参数值看起来都很好。当我在调试时查看dataTable并浏览到count属性时,它被设置为0(不像设计器生成的代码将被设置为1)。

My database is OleDb.

我想做的是可能的吗?

生成具有可变数量参数的paramalized查询

参数不能用引号括起来。使用?,而不是'?'