Генерация параматаризованного запроса с переменным числом параметров

#c# #oledb #tableadapter

#c# #oledb #адаптертаблицы

Вопрос:

У меня есть некоторый сгенерированный дизайнером код, который я использую для запроса набора данных. Дизайнер сгенерировал его, потому что у меня есть форма с ReportViewer, которая создала свой собственный BindingSouce andTableAdapter. Я использовал функцию «Добавить запрос …» в смарт-теге TableAdapter.

Запрос представляет собой простую команду ВЫБОРА. Это работает, но я хотел бы иногда запрашивать несколько записей одновременно (я создаю отчет на основе списка штрих-кодов, и их почти всегда будет много). Дизайнер дал мне этот код :

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

Я думал, что я умный, но, похоже, это не работает. Это не выдает ошибку или что-то еще. Он сгенерировал текст команды SelectCommand SELECT * FROM tblReceivedSamplers WHERE SampleID IN ('?','?','?','?') , если я передам ему 4 параметра, и все значения параметров выглядят хорошо. Когда я смотрю на dataTable while debugging и просматриваю count свойство, ему присваивается значение 0 (в отличие от сгенерированного дизайнером кода, для которого было бы установлено значение 1).

Моя база данных — OleDb.

Возможно ли то, что я пытаюсь сделать?

Ответ №1:

Параметры не должны заключаться в кавычки. использовать ? , а не '?' .