我已经发布了下面的代码 我正在尝试从 Access 2002-2003 数据库中获取数据
如果我在 WHERE 子句之后取出所有内容并只使用 "SELECT * FROM [{0}] 那么它会毫无问题地从表中取出所有数据。我已经仔细检查了该字段名称,它们绝对是正确的。我有超过 1 个具有相同字段名称的表,所以我想也许我需要在字段名称之前包含表名称,但是有或没有表我仍然得到相同的异常。我已经尝试移动方括号的位置,再次没有成功......
即使我只包含一个 WHERE 子句,代码也不再有效,而且我终其一生都无法弄清楚为什么......我花了几个小时在这里和其他与这个错误,但没有任何建议对我有帮助..
目标字段是 Access 中的“备注”字段。 Next Collection 字段是日期字段,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。 您应该传递整个命令对象。
关于C# 没有为 1 个或多个必需参数给出值,但我不明白为什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17039909/