运行-time Error '3061' 参数太少。预计 3
Run-time Error '3061' Too few parameters. Expected 3
我知道以前有人问过这个问题,但我看过的问题都有点不同。我正在努力创建临时 table、导入数据、将数据放入现有 table 并删除临时 table。这是我的代码:
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"
我一尝试 运行 这个,我就得到了 运行-time Error '3061' Too few parameters。预期 3。当我点击调试时,突出显示的区域是:
db.Execute StrSql
我知道在 End If 之后,一切正常。这实际上是其中最重要的部分,但它不起作用。
有什么想法吗?提前致谢!
好的,这几天我做了一些修改。这就是我现在的位置。
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
基本上这就是我想要发生的事情。
我 运行 命令,它将所有当前 phone 号码清空,连接到服务器上的数据库,收集所有 phone 号码(主要和次要)并将它们插入包含同一个SSN。我能够开始使用 SSN 作为插入该特定行所需的唯一标准,而不是名字、姓氏和雇用日期。我希望这是有道理的。
为了让大家知道,我终于明白了。
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`
谢谢大家的帮助。我想 post 解决方案,所以如果将来有问题,其他人可以参考这个。看来我的问题是 INNER JOIN
。谢谢指教!
我知道以前有人问过这个问题,但我看过的问题都有点不同。我正在努力创建临时 table、导入数据、将数据放入现有 table 并删除临时 table。这是我的代码:
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"
我一尝试 运行 这个,我就得到了 运行-time Error '3061' Too few parameters。预期 3。当我点击调试时,突出显示的区域是:
db.Execute StrSql
我知道在 End If 之后,一切正常。这实际上是其中最重要的部分,但它不起作用。
有什么想法吗?提前致谢!
好的,这几天我做了一些修改。这就是我现在的位置。
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
基本上这就是我想要发生的事情。 我 运行 命令,它将所有当前 phone 号码清空,连接到服务器上的数据库,收集所有 phone 号码(主要和次要)并将它们插入包含同一个SSN。我能够开始使用 SSN 作为插入该特定行所需的唯一标准,而不是名字、姓氏和雇用日期。我希望这是有道理的。
为了让大家知道,我终于明白了。
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`
谢谢大家的帮助。我想 post 解决方案,所以如果将来有问题,其他人可以参考这个。看来我的问题是 INNER JOIN
。谢谢指教!