#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:
Параметры не должны заключаться в кавычки. использовать ?
, а не '?'
.