Search code examples
c#oledbtableadapter

Generating a paramatarized query with variable number of parameters


I have some designer generated code that I am using to query a dataset. The designer generated it because I have a Form with a ReportViewer which created it's own BindingSouce andTableAdapter. I used the "Add Query..." function on the TableAdapter smarttag.

The query is a simple SELECT command. It works find but I'd like to sometimes query for multiple records at once (I am generating a report based on a list of barcodes and there will almost always be many). The designer gave me this code :

    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;
    }

And that works and is good for a single record so I overloaded this method and created this code to allow me to pass any number of parameters at once using the WHERE...IN SQL statement.

    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;
    }

I thought I was being clever but it doesn't seem to be working. It doesn't give an error or anything. It generated a SelectCommand text of SELECT * FROM tblReceivedSamplers WHERE SampleID IN ('?','?','?','?') if I pass it 4 parameters and all the parameters values look good. When I look at the dataTable while debugging and browse to the count property it is set to 0 (unlike the designer generated code which would be set to 1).

My database is OleDb.

Is what I am trying to do possible?


Solution

  • Parameters should not be enclosed in quotes. use ?, not '?'.