【问题标题】:MS Access/OleDB: No value given for one or more required parameter <- How to debug?MS Access/OleDB:没有为一个或多个必需参数提供值<-如何调试?
【发布时间】:2020-05-26 09:21:05
【问题描述】:

这一定是我在任何情况下见过的最糟糕的错误消息。来自 SQL Server,现在正在改进旧的 Access 数据库,这个错误不断出现,每次都是一个完整的试验和错误,非常浪费时间。

关于如何有效调试此错误的任何有用提示?就像给出哪怕是最轻微的提示一样在哪里看?我正在使用 C#。

【问题讨论】:

  • 您是否有可能在数据库(表)中存在不存在的字段 [xyz]?比这将像一个参数一样处理。
  • @Frank 问题是:鉴于此错误,我如何有效地确定我有一个字段 xyz 在数据库中不存在,而无需手动检查所有字段,检查错字,检查其他原因,等等。尤其是在具有许多连接的长查询中,很难发现字段名称中的拼写错误。
  • 最佳方法?吐出实际的 sql 字符串,启动访问并将 sql 粘贴到查询生成器中。如果有任何无效列?然后将通过缺失列的名称提示您,因此这将/是您的缺失列。因此,您会立即看到不正确的列名称。

标签: database ms-access debugging


【解决方案1】:

好吧,如果使用 sql server,可以启动 SQL studio,然后用这种方式尝试 sql。

同样的方法适用于 Access。取出你的 sql(debug.print 出来),然后将 sql 剪切 + 粘贴到访问查询生成器中(在 sql 视图模式下)。如果您运行查询,那么对于任何缺少的字段,它都会提示带有列的“名称”。

Access 对不在表中的任何列使用(从 Access 时)提示系统,并自动提示用户输入值。如果您使用 odbc 或 oleDB,那么缺少的列会吐出缺少的参数(但没有您记下的列名称)。

因此,最简单的方法是启动访问并使用查询构建器中的 sql 视图 - 粘贴到您的 sql 中。

【讨论】:

    【解决方案2】:

    您可以使用 ADO 创建查询,然后列出查询所需的所有参数:

    ADODB.Connection conn = new ADODB.Connection();
    conn.Open("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\\Path\\To\\db.accdb");
    ADODB.Command cmd = new ADODB.Command
    {
        CommandText = "SELECT * FROM tblUsers WHERE username = bob", 
        //Oops, forgot to quote the username, results in No value given for parameter error
        ActiveConnection = conn
    };
    foreach(ADODB.Parameter param in cmd.Parameters)
    {
        Console.WriteLine(param.Name); //bob
    }
    Console.ReadLine();
    

    这需要对 ADO 的引用,可以通过 COM 引用输入。

    您还可以使用后期绑定来防止额外的引用,如果您只将其用作调试代码但希望在您的项目中使用它,这可能是可取的,请参阅this Q&A

    由于 OLEDB 不支持命名参数,很遗憾您不能将 OLEDB 用于此 afaik。

    当然,您可以将其重写为一个函数,该函数接受查询字符串并将预期参数作为字符串返回,然后在调试时在即时窗口中使用该函数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多