C# C没有为1个或多个必需参数提供值,但我不明白为什么

C# C没有为1个或多个必需参数提供值,但我不明白为什么,c#,sql,oledb,ms-access-2003,C#,Sql,Oledb,Ms Access 2003,我已经发布了下面的代码 我试图从Access 2002-2003数据库中获取数据 如果我去掉WHERE子句后面的所有内容,只使用SELECT*FROM[{0}],那么它将毫无问题地从表中获取所有数据。我仔细检查了字段名,它们绝对正确。我有不止一个表具有相同的字段名,所以我想可能需要在字段名之前包含表名,但无论有没有表,我仍然会得到相同的异常。我尝试过移动方括号的位置,同样没有成功 即使我只包含其中一个WHERE子句,代码也不再有效,我一辈子也无法找出原因。。我花了几个小时在这里和其他网站上查看了

我已经发布了下面的代码 我试图从Access 2002-2003数据库中获取数据

如果我去掉WHERE子句后面的所有内容,只使用SELECT*FROM[{0}],那么它将毫无问题地从表中获取所有数据。我仔细检查了字段名,它们绝对正确。我有不止一个表具有相同的字段名,所以我想可能需要在字段名之前包含表名,但无论有没有表,我仍然会得到相同的异常。我尝试过移动方括号的位置,同样没有成功

即使我只包含其中一个WHERE子句,代码也不再有效,我一辈子也无法找出原因。。我花了几个小时在这里和其他网站上查看了许多与此错误相关的帖子,但没有一条建议对我有帮助

目的地字段是Access中的“备注”字段。 下一个集合字段是日期字段,GVars.currentDate在代码中较早地设置为今天的日期,时间部分设置为00:00:00。 GVars.thisFY在此之前还以编程方式设置为字符串

任何提示都将不胜感激

string sql;
OleDbDataAdapter adapter;

sql = string.Format(
    "SELECT * FROM [{0}] WHERE {0}.[Destination] = @Destination AND {0}.[Next Collection] BETWEEN @NextCollectionA AND @NextCollectionB"
    , GVars.thisFY);

// Create the command object
OleDbCommand cmd = new OleDbCommand();
cmd.CommandType = CommandType.Text;
cmd.CommandText = sql;

// Add values to the fields
cmd.Parameters.AddWithValue("@Destination", "Henwood");
cmd.Parameters.AddWithValue("@NextCollectionA", GVars.currentDate);
cmd.Parameters.AddWithValue("@NextCollectionB", GVars.currentDate.AddDays(1));

adapter = new OleDbDataAdapter(cmd.CommandText, conn);

System.Diagnostics.Debug.Print(cmd.CommandText);
try
{
     adapter.Fill(ds);

     GVars.bLblLastUpdate = DateTime.Now.ToString("HH:mm:ss");
}
catch (Exception ex)
{
}
编辑: 感谢Vladislav的回答,更正代码如下:

string sql;
OleDbDataAdapter adapter;


sql = string.Format(
            "SELECT * FROM [{0}] WHERE [{0}].[Destination] = @Destination AND [{0}].[Next Collection] BETWEEN @NextCollectionA AND @NextCollectionB"
            , GVars.thisFY);

// Create the command object
OleDbCommand cmd = new OleDbCommand();
cmd.CommandType = CommandType.Text;
cmd.CommandText = sql;
cmd.Connection = conn;

// Add values to the fields
cmd.Parameters.Add("@Destination", OleDbType.Char).Value = "Henwood";
cmd.Parameters.Add("@NextCollectionA", OleDbType.DBDate).Value = GVars.currentDate;
cmd.Parameters.Add("@NextCollectionB", OleDbType.DBDate).Value = GVars.currentDate.AddDays(1);

adapter = new OleDbDataAdapter(cmd);

try
{
    adapter.Fill(ds);

    GVars.bLblLastUpdate = DateTime.Now.ToString("HH:mm:ss");
}

尝试为添加的参数指定类型

我注意到的另一件事是,您只向适配器传递CommandText。
您应该传递整个command对象。

似乎这就是问题所在,我只传递CommandText,因为“新OleDbDataAdapter”要求“string selectCommandText”,我不想将连接对象添加到cmd,然后只传递那个。。。。谢谢: