【问题标题】:No value given for one or more required parameters in Oledb queryOledb 查询中的一个或多个必需参数没有给出值
【发布时间】:2015-05-04 16:45:27
【问题描述】:

我正在尝试查询 CSV 文件。当我做一个简单的选择时它可以工作,但是当我尝试添加一个 where 子句时,我遇到 No value given for a or more required parameters。

显然,听起来它没有获得提供的参数,但我尝试以多种方式传递它。请参阅下面的一些代码示例

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);

【问题讨论】:

    标签: c# sql .net oledb


    【解决方案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"
    

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

    【讨论】:

    • 感谢您的意见,但我也试过没有前 100 名。
    【解决方案2】:

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

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

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

    已编辑:

    从where条件中删除表名,这样使用

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

    【讨论】:

    • 感谢您的意见,但这是我的错字。这只是我尝试过的众多事情之一。我注释掉了添加参数之一
    • @TheJonasPersson 我已经检查了你的代码并重现了这个错误,我已经编辑了我的答案,请检查。
    • 对不起,这仍然没有为我做。但是,我发现我的问题是什么。 where 语句无法识别第一行中的列名。如果我将“sale_date”更改为“AI”(Excel 中的实际列),它会起作用。所以,新的问题。如何获取列名?我认为HDR=Yes 会成功。
    • @TheJonasPersson 您的新问题需要更多信息,例如您的 csv 数据格式、sql 查询以及您的要求。所以,我认为你应该单独问一个新问题。因此,您可以获得更多的答案和回复。不要忘记指出这个问题。
    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

      我发现他有这个问题。查询根本不理解列名。

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

      Here's some more about schema.ini files

      【讨论】:

      • 我今天遇到了这个问题。 schema.ini 文件存在。我每次都导入不同名称的文件。我只是忘了每次都用新的文件名更新架构文件。检查您的架构文件孩子!
      猜你喜欢
      • 2022-01-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多