所以我最近一直在研究一个VBA脚本,将整个学生病历数据库从旧的一桌,68场平面系统转移到一个包含24个相关表格的新动态系统。
前几张表没有问题,但后来遇到了这个问题。抛出错误的代码行是:
Set rstFrom = CurrentDb.OpenRecordset("select " & Flat & ".Student," & Flat & ".School," & Flat & ".Social," & Flat & ".FamilyHist from " & Flat & " WHERE 1=1")`
Flat
是一个String,它存储了flat数据库的名称(这是因为我正在使用一个虚拟数据库,所以他们需要一种方便快捷的方法来修改我所做的代码来处理真实的东西)
rstFrom
只需要包含68字段表的列,这些列与我现在正在复制的表相关(在这种情况下,FamilyHistory表实际上只需要{{ 1}}和studentID
) - 请注意原始表没有分配唯一的FamilyHistory
,所以我必须使用名称,学校和社交来确定我正在处理同一个孩子并且看起来他们的studentID
当这行代码运行时,我收到以下错误:
studentID
显然我有1个参数,它是:
Run-time error '3061':
Too few parameters. Expected 1.
(解析之后):
"select " & Flat & ".Student," & Flat & ".School," & Flat & ".Social," & Flat & ".FamilyHist from " & Flat & " WHERE 1=1"
使用Access VBA时需要1 = 1,否则它只返回匹配的第一条记录,而不是所有匹配的记录。
还有其他人有同样的问题解决了吗?我注意到了一件事。当我将参数更改为:
时 "select Demos.Student,Demos.School,Demos.Social,Demos.FamilyHist from Demos WHERE 1=1"
能够通过这一行没有问题,虽然这会在我需要读取其他未检索的数据时导致问题。我认为这很有趣,但错误似乎来自SQL而不是OpenRecordset函数。
答案 0 :(得分:4)
检查SQL中的字段名称与表中的名称。
我认为,上面SQL中的字段名称是拼写错误,或者表中没有一个或多个字段(SQL语句)。
答案 1 :(得分:0)
插入查询中的文本参数需要围绕它们使用单引号。我使用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());
}