错误3346,尝试INSERT INTO,连续两个表

时间:2018-02-15 14:18:58

标签: sql vba ms-access access-vba

我有两个表是MS Access:

lkpSchemaPIT:

| UID |    lkpSchemaTitleEng     |  
|-----|--------------------------|  
|--1--|---------Title1-----------|  
|--2--|---------Title2-----------|  

...

lkpSchemaPITChronology:

| ID | UID | PUID | Sort | Level | DateStart | DateEnd |  
|----|-----|------|------|-------|-----------|---------|  
|--0-|--1--|--0---|---5--|--2----|---Now()---|--NULL---|  

...

第一个表只包含我将要访问的树视图中的节点。我使用第二个表来构建树,但也跟踪节点多年来可能拥有的所有父节点。您可以看到两个表中的UID是相同的,但它们之间没有关系,当我构建树时,我使用带有连接的查询。

我的问题是:当我想在lkpSchemaPIT表中添加一个新节点时,我需要能够添加它的" treeview"信息以及(父母,排序,等级等) 到目前为止,这是我的代码:

With CurrentDb
      .Execute _
        "INSERT INTO lkpSchemaPIT " & _
          "(lkpSchemaTitleEng) " & _
        "VALUES " & _
          "('" & Title & "')"
      .Execute _
        "INSERT INTO lkpSchemaPITChronology VALUES (" & .OpenRecordset("SELECT @@IDENTITY").Fields(0) & ", " & [ParentID] & ", " & [NewSort] & ", " & [Level] & ", " & Date & ", null)"

End With  

ParentID,NewSort,Level是在我调用所有这些之前确定的3个变量。 "日期"参数是返回当前日期的VBA函数。

我知道第一个INSERT INTO正在运行,因为我的表中显示了一个新值。但是第二次插入INTO并不起作用,我得到了错误:

  

错误3346 - 查询值和目标字段的数量不同。

有没有人遇到过这种问题?

1 个答案:

答案 0 :(得分:2)

再一次,这是一个示例,其中参数化查询将是无价值的,因为您避免引用封闭(包括日期/时间的#)和将数据和SQL混合在一起的字符串连接,使得难以阅读和维护代码

MS Access允许PARAMETERS子句,您可以在其中定义参数占位符名称和数据类型,然后在VBA中,您可以使用QueryDefs将值绑定到此类参数。不需要引号或字符串插值。

SQL (另存为存储的查询)

PARAMETERS TitleParam Text(255);
INSERT INTO lkpSchemaPIT (lkpSchemaTitleEng)
VALUES (TitleParam);

PARAMETERS UIDParam Long, PUIDParam Long, SortParam Long, 
           LevelParam Long, DateStart Datetime;
INSERT INTO lkpSchemaPITChronology (UID, PUID, [Sort], [Level], DateStart)
VALUES (UIDParam, PUIDParam, SortParam, LevelParam, DateStartParam);

<强> VBA

...
Dim qdef As QueryDef

With CurrentDb

   ' FIRST QUERY
   Set qdef = .QueryDefs("myFirstSavedAppendQuery")

   qdef!TitleParam = [Title]
   qdef.Execute dbFailOnError

   ' SECOND QUERY
   Set qdef = .QueryDefs("mySecondSavedAppendQuery")

   qdef!UIDParam = .OpenRecordset("SELECT @@IDENTITY").Fields(0)
   qdef!PUIDParam = [ParentID]
   qdef!SortParam = [NewSort]
   qdef!LevelParam = [Level]
   qdef!DateStart = Date()

   qdef.Execute dbFailOnError

End With

Set qdef = Nothing