没有为Oledb查询中的一个或多个必需参数给定值

本文关键字:参数 一个 查询 Oledb | 更新日期: 2023-09-27 17:50:07

我正在尝试查询CSV文件。当我做一个简单的选择时,它可以工作,但是一旦我尝试添加一个where子句,我就会遇到一个或多个所需参数没有值。

显然,听起来它没有得到提供的参数,但我已经尝试通过多种方式传递它。下面是一些代码示例

DateTime lastRunDate = Convert.ToDateTime(ConfigurationManager.AppSettings["LastRunDate"]);
OleDbConnection conn = new OleDbConnection(
            "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + base.applicationRoot + ";" +
            "Extended Properties='"text;HDR=Yes;FMT=CSVDelimited'"");
// This works just fine
//OleDbDataAdapter adapter = new OleDbDataAdapter(String.Format("select * from {0}", 
// This gives the error
OleDbDataAdapter adapter = new OleDbDataAdapter(String.Format("select top 100 * from [{0}] where {0}.sale_date = @sDate", base.csvFileName), conn);
//adapter.SelectCommand.Parameters.Add("@sDate", OleDbType.DBDate).Value = lastRunDate;
adapter.SelectCommand.Parameters.AddWithValue("@sDate", lastRunDate);
// This also gives the same error as above
//OleDbDataAdapter adapter = new OleDbDataAdapter(String.Format("select top 100 * from {0} where sale_date = '{1}'", base.csvFileName, lastRunDate), conn);
base.csvFileName, lastRunDate.ToShortDateString()), conn);
DataTable dt = new DataTable();
adapter.Fill(dt);

没有为Oledb查询中的一个或多个必需参数给定值

我对c#一无所知,我对SQL仍然很陌生,但也许这是你查询的SELECT TOP部分。我知道SELECT TOP在所有数据库系统上都不是真正接受的,并且它包含在给您带来问题的两个查询中。你试过删除它并使用限制吗?

"select top 100 * from [{0}] where {0}.sale_date = @sDate"

"select * from [{0}] where {0}.sale_date = @sDate LIMIT 100"

我本来会把这个作为一个评论,因为它不是一个具体的答案,但我还没有所需的代表:(

删除这一行。您已经添加了两次参数。

adapter.SelectCommand.Parameters.AddWithValue("@sDate", lastRunDate);

,并确保该值存在于lastRunDate变量中。它不应该是空的

编辑:

从where条件中删除表名,如下所示

select top 100 * from [{0}] where sale_date=@sDate

Excel文件中的列名与查询中的列名不一致。

  1. 没有列名。
  2. Excel文件中不存在列名。

我发现了这个问题。查询根本无法理解列名。

我认为设置HDR=Yes意味着oledb将读取第一行标题,因此知道它们。但直到我添加了一个schema.ini文件,我才设法以这种方式查询。

关于schema.ini文件的更多信息