我有一些设计器生成的代码用于查询数据集。设计者生成它是因为我有一个带有ReportViewer的Form,它创建了自己的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;
}
我以为我很聪明,但似乎没有用。它不会给出错误或任何错误。如果我传递4个参数并且所有参数值看起来都很好,它会生成SELECT * FROM tblReceivedSamplers WHERE SampleID IN ('?','?','?','?')
的SelectCommand文本。当我在调试时查看dataTable
并浏览到count
属性时,它被设置为0(与设计器生成的代码设置为1不同)。
我的数据库是OleDb。
我想做的是什么?
答案 0 :(得分:2)
参数不应括在引号中。使用?
,而不是'?'
。