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