【问题标题】:Too few parameters. Expected 1 - but I have one参数太少。预期 1 - 但我有一个
【发布时间】:2011-09-01 19:04:16
【问题描述】:

所以我最近一直在编写一个 VBA 脚本,将整个学生医疗记录数据库从他们旧的单表、68 字段、平面系统转移到具有 24 个相关表的新动态系统。

前几张桌子没有问题,但后来我遇到了这个问题。抛出错误的代码行是:

Set rstFrom = CurrentDb.OpenRecordset("select " & Flat & ".Student," & Flat & ".School," & Flat & ".Social," & Flat & ".FamilyHist from " & Flat & " WHERE 1=1")`

Flat 是一个字符串,它存储平面数据库的名称(这是因为我正在使用一个虚拟数据库,所以他们需要一种方便快捷的方法来修改我在真实事物上工作的代码)

rstFrom 只需要包含与我正在复制到的表相关的 68 字段表的列(在这种情况下,FamilyHistory 表实际上只需要 studentIDFamilyHistory) - 注意原始表没有指定唯一的studentIDs,所以我必须使用姓名、学校和社交来确定我正在与同一个孩子打交道并查找他们的studentID

当这行代码运行时出现以下错误:

Run-time error '3061':

Too few parameters. Expected 1.

显然我有 1 个参数,它是:

"select " & Flat & ".Student," & Flat & ".School," & Flat & ".Social," & Flat & ".FamilyHist from " & Flat & " WHERE 1=1"

(解析后为):

"select Demos.Student,Demos.School,Demos.Social,Demos.FamilyHist from Demos WHERE 1=1"

使用 Access VBA 时需要 where 1=1,否则它只返回匹配的第一条记录,而不是所有匹配的记录。

有其他人遇到过同样的问题吗?我确实注意到一件事。当我将参数更改为:

"select Demos.Student from Demos WHERE 1=1"

它能够越过这条线没有问题,尽管这会导致稍后当我需要读取我没有检索到的其他数据时出现问题。不过,我觉得有趣的是,错误似乎来自 SQL 而不是 OpenRecordset 函数。

【问题讨论】:

  • 不知道为什么会出现这个错误,但为什么不直接将 sql 弹出到一个字符串中,然后将其作为参数传递?
  • 已经试过了。 CurrentDb.OpenRecordset("select Demos.Student,Demos.School,Demos.Social,Demos.FamilyHist from Demos WHERE 1=1") 给了我同样的错误。
  • 检查 SQL 中的字段名称与表中的名称。我认为,或者上面 SQL 中的字段名称拼写错误,或者您在表中没有一个或多个字段(SQL 语句)。
  • 现在发现问题了。 FamilyHist 字段实际上存储为Family Hist。我需要写Demos.[Family Hist]。所以@shahkalpesh 是正确的。如果您以答案的形式写下您的评论,我很乐意将其作为我接受的答案。

标签: vba ms-access parameters ms-access-2010 recordset


【解决方案1】:

检查 SQL 中的字段名称与表中的名称。

我认为,可能是上述 SQL 中的字段名称拼写错误,或者您的表中没有一个或多个字段(SQL 语句)。

【讨论】:

    【解决方案2】:

    插入查询中的文本参数需要用单引号括起来。我在使用 Visual C++ 进行查询时遇到了同样的问题。

    这是我最终使用的代码...

    void FileInterface::TblWrite(CDatabase* db, rec* r)
    {
       string sqlQuery = "insert into THREATS(ID,CODE,ID,LAT,LON,SHOW_A,SHOW_B) Values(" +
          to_string((_Longlong)r->num) + "," +
          to_string((_Longlong)r->code) + "," +
          "'" + r->id + "'" + "," + 
          to_string((long double)r->lat) + "," +
          to_string((long double)r->lon) + "," +
          "1" + "," +
          "1" +
          ")";
       db->ExecuteSQL(sqlQuery.c_str());
    }
    

    【讨论】:

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