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

标签 c# sql oledb ms-access-2003

我已经发布了下面的代码 我正在尝试从 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/

相关文章:

c# - 抽象出两个几乎相同的方法,不同之处仅在于它们在对象列表上使用的属性

c# - 将项目添加到 C# 数组的最佳方法是什么?

c# - 如何在 C# 中使用 xsd?

sql - 查找公制格式的日期时间值之间的时间

c# - 检查 javascript 函数中的 c# 函数是否为 true

c# - 将ibfs(从网站下载的Excel文件)文件转换为.xls/.xlsx文件格式,而无需使用C#Asp.net Web应用程序安装Office

c# - 使用 System.Reflection

sql - 痛苦缓慢的 DB2 查询

vba - Microsoft.Jet.OLEDB.4.0 - 找不到提供程序或可能未安装提供程序

c# - Access 数据库: Operation must use an updateable query