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

时间:2014-03-14 03:01:18

标签: c# sql .net oledb

我正在尝试查询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);

4 个答案:

答案 0 :(得分:1)

我对C#一无所知,而且我仍然不熟悉SQL,但也许它是查询的SELECT TOP部分。我知道SELECT TOP并非在所有数据库系统上都被接受,而且它包含在两个给你提问的查询中。您是否尝试过删除它并使用LIMIT?

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

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

我会将此作为评论添加,因为它不是具体的答案,但我还没有所需的代表。:(

答案 1 :(得分:1)

删除此行。您已添加参数两次。

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

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

<强>编辑:

从where condtion中删除表名,像这样使用

从[{0}]中选择前100名*,其中sale_date = @ sDate

答案 2 :(得分:1)

Excel文件和查询中的列名不相同。

  1. 缺少任何列名称。
  2. 列名不存在于Excel文件中。

答案 3 :(得分:0)

我发现他对此有疑问。查询根本不了解列名。

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

Here's some more about schema.ini files