2

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

如果我在 WHERE 子句之后取出所有内容并只使用"SELECT * FROM [{0}]那么它会毫无问题地从表中获取所有数据。我已经仔细检查了字段名称,它们绝对是正确的。我还有更多比 1 个具有相同字段名称的表,所以我想也许我需要在字段名称之前包含表名称,但是无论有没有表,我仍然得到相同的异常。我尝试移动方括号的位置,再次没有成功...

即使我只包含一个 WHERE 子句,代码也不再有效,而且我终其一生都无法弄清楚原因。我花了几个小时在这里和其他与此错误相关的网站上查看大量帖子,但没有一个建议对我有帮助..

Destination 字段是 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)
{
}

编辑:感谢弗拉迪斯拉夫的回答,更正的代码贴在下面:

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");
}
4

1 回答 1

1

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

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

于 2013-06-11T09:25:19.043 回答