【问题标题】:Run-time Error '3061' Too few parameters. Expected 3运行时错误“3061”参数太少。预计 3
【发布时间】:2015-06-30 01:24:40
【问题描述】:

我知道以前有人问过这个问题,但我看过的问题都有点不同。我正在创建一个临时表,导入数据,将数据放在现有表中,并删除临时表。这是我的代码:

Dim db As Database
Dim StrSql As String
Dim rst As Recordset

Set db = CurrentDb()

If DCount("[Name]", "MSysObjects", "[Name] = 'tblInfoLink'") = 1 Then
    DoCmd.DeleteObject acTable, "tblInfoLink"
    StrSql = "SELECT tblStaff.LastName, tblStaff.FirstName, tblStaff.Rank, tblStaff.PriPhone, " _
            & " tblStaff.SecPhone, tblStaff.HireDate INTO tblInfoLink " _
            & " FROM [\\Server\BE.accdb].tblStaff " _
            & " WHERE (((tblInfo.LastName)=[tblInfo].[LastName]) AND ((tblInfo.FirstName)=[tblInfo].[FirstName]) AND ((tblInfo.HireDate)=[tblInfo].[HireDate]));"
    db.Execute StrSql
ElseIf DCount("[Name]", "MSysObjects", "[Name] = 'tblInfoLink'") = 0 Then
    StrSql = "SELECT tblStaff.LastName, tblStaff.FirstName, tblStaff.Rank, tblStaff.PriPhone, " _
            & " tblStaff.SecPhone, tblStaff.HireDate INTO tblInfoLink " _
            & " FROM [\\Server\BE.accdb].tblStaff " _
            & " WHERE (((tblStaff.LastName)=[tblInfo].[LastName]) AND " _
            & " ((tblStaff.FirstName)=[tblInfo].[FirstName]) AND ((tblStaff.HireDate)=[tblInfo].[HireDate]));"
    db.Execute StrSql
End If

StrSql = "Update tblInfo Set PriPhone = Null, SecPhone = Null"
db.Execute StrSql

StrSql = "INSERT Into tblInfo (PriPhone, SecPhone) " _
        & " SELECT tblInfoLink.PriPhone, tblInfoLink.SecPhone " _
        & " FROM tblInfoLink " _
        & " WHERE (((tblInfoLink.LastName)=[tblInfo].[LastName]) AND " _
            & " ((tblInfoLink.FirstName)=[tblInfo].[FirstName]) AND ((tblInfoLink.HireDate)=[tblInfo].[HireDate]));"
db.Execute StrSql

'Delete Linked Tables
DoCmd.DeleteObject acTable, "tblInfoLink"

一旦我尝试运行它,我就会收到运行时错误“3061”参数太少。预期 3. 当我点击调试时,highligthed 区域是:

db.Execute StrSql

我知道在 End If 之后,一切正常。从字面上看,这是 ISN 不起作用的最重要的部分。

有什么想法吗?提前致谢!

【问题讨论】:

  • 尝试在行前使用Debug.Print StrSqlMsgBox StrSql查看查询,相信你会发现问题
  • 这只是向我展示了我正在制作的确切 SQL 语句。 SELECT LastName, FirstName, Rank, PriPhone, SecPhone, HireDate INTO tblOfcInfoLink FROM [\\Server\BE.accdb].tblStaff WHERE (((tblStaff.LastName)=[tblInfo].[LastName]) AND ((tblStaff.FirstName)=[tblInfo].[FirstName]) AND ((tblStaff.HireDate)=[tblInfo].[HireDate]));
  • 你用过Debug.Print StrSql吗?
  • 我假设我做对了。我这样做了,然后当我点击调试时按 Ctrl+G,这就是立即窗口中显示的内容
  • @keongkenshih,我刚刚做了一些编辑,我很确定问题出在 WHERE 语句中。

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


【解决方案1】:

好的,我在过去几天做了一些修改。这就是我现在的位置。

Dim db As Database Dim StrSql As String Dim rst As Recordset

Set db = CurrentDb()

'Link to Database to retrieve Phone Numbers
If DCount("[Name]", "MSysObjects", "[Name] = 'tblInfoLink'") = 1 Then
    DoCmd.DeleteObject acTable, "tblInfoLink"
    StrSql = "SELECT ClockNbrId, PriPhone, SecPhone INTO tblInfoLink " _
            & " FROM [\\Server\BE.accdb].tblStaff; "
    Debug.Print StrSql
    db.Execute StrSql

ElseIf DCount("[Name]", "MSysObjects", "[Name] = 'tblInfoLink'") = 0 Then
    StrSql = "SELECT ClockNbrId, PriPhone, SecPhone INTO tblInfoLink " _
            & " FROM [\\Server\BE.accdb].tblStaff; "
    Debug.Print StrSql
    db.Execute StrSql
End If

'Delete All Phone Numbers (Primary and Secondary) from tblInfo
StrSql = "Update tblInfo Set PriPhone = Null, SecPhone = Null"
db.Execute StrSql

'Update Phone Numbers of Current Staff
StrSql = "UPDATE tblInfo SET tblInfo.PriPhone = tblInfoLink.PriPhone" _
        & " WHERE tblInfoLink.ClockNbrId = tblInfo.SSN ; "
Debug.Print StrSql
db.Execute StrSql

'Delete Linked Table
DoCmd.DeleteObject acTable, "tblInfoLink"

Exit_SyncStaff: Set db = Nothing

基本上这就是我想要发生的事情。 我运行命令,它将所有当前电话号码清空,连接到服务器上的数据库,收集所有电话号码(主要和次要)并将它们插入包含相同 SSN 的行中。我能够开始使用 SSN 作为插入该特定行所需的唯一标准,而不是名字、姓氏和雇用日期。我希望这是有道理的。

【讨论】:

    【解决方案2】:

    只是为了让大家知道,我终于明白了。

    Dim db As Database<br>
    Dim StrSql As String<br>
    Dim tblCount As Integer<br>
    
    Const cstrPrompt As String = "Are you sure you want to start the import process? Yes/No"
    If MsgBox(cstrPrompt, vbQuestion + vbYesNo) = vbYes Then
        Set db = CurrentDb()`
    
    'Link to Lt's Database to retrieve Phone Numbers
    
        StrSql = "UPDATE tblInfo SET PriPhone = Null, SecPhone = Null;"
        db.Execute StrSql
    
        On Error Resume Next
        DoCmd.DeleteObject acTable, "tblPhone"
    
        StrSql = "CREATE TABLE tblPhone " _
            & " (SSN CHAR, PriPhone CHAR (20), SecPhone CHAR(20));"
            db.Execute StrSql
    
         StrSql = "INSERT INTO tblPhone (SSN, PriPhone, SecPhone) " _
                & " SELECT ClockNbrId, PriPhone, SecPhone " _
                & " FROM [\\Server\BE.accdb].tblStaff; "
        db.Execute StrSql
    
    StrSql = "UPDATE tblInfo INNER JOIN tblPhone ON tblInfo.SSN = tblPhone.SSN" _
        & " SET tblInfo.PriPhone = [tblPhone].[PriPhone], tblInfo.SecPhone = [tblPhone].[SecPhone] " _
        & " WHERE (((tblInfo.SSN)=[tblPhone].[SSN])); "
        db.Execute StrSql
    
        DoCmd.DeleteObject acTable, "tblPhone"
    
    Const cstrPrompt2 As String = "The import process is complete"
    If MsgBox(cstrPrompt2, vbOKOnly, "Import Complete!") = vbOK Then
        Me.ImportDel.Enabled = False
        Me.ImportDel.Caption = "Import Complete"
    
    Exit_SyncStaff:
    Set db = Nothing
    
    Else
        Cancel = True
    End If
    
    End If`
    

    感谢大家的帮助。我想发布解决方案,因此如果将来有问题,其他人可以参考。看来我的问题是INNER JOIN。感谢您的建议!

    【讨论】:

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