【问题标题】:Generating a paramatarized query with variable number of parameters使用可变数量的参数生成参数化查询
【发布时间】:2011-10-18 15:15:16
【问题描述】:

我有一些设计器生成的代码,用于查询数据集。设计器生成它是因为我有一个带有 ReportViewer 的表单,它创建了它自己的 BindingSouce 和 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)。

我的数据库是 OleDb。

我正在尝试做的事情可能吗?

【问题讨论】:

    标签: c# oledb tableadapter


    【解决方案1】:

    参数不应括在引号中。使用?,而不是'?'

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-02-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-05
      • 2017-06-20
      • 2020-09-28
      相关资源
      最近更新 更多