Генерация параматаризованного запроса с переменным количеством параметров - PullRequest
1 голос
/ 18 октября 2011

У меня есть сгенерированный дизайнером код, который я использую для запроса набора данных. Дизайнер сгенерировал его, потому что у меня есть форма с 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;
    }

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

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

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

1 Ответ

2 голосов
/ 18 октября 2011

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

...