运行 工作参数化访问 SQL 来自 Excel VBA 的查询(INSERT INTO)时出错 "Object required"
Error "Object required" when running working parameterised Access SQL query (INSERT INTO) from Excel VBA
我 运行 来自 Excel 文件的一些 VBA,以便在 Excel 中的数据操作后更新 Access 数据库。它通过 DAO 链接创建并执行 SQL 行。有时要输入的数据包含破坏 SQL 的字符(例如 INSERT INTO 语句值中的撇号),因此捕获参数化查询语句的错误会尝试进行这些更改。
清除旧错误后,查询语句return在运行时出现错误"Object required",但它确实有效(以正确的方式修改了数据库)。问题是:为什么会 return 这个错误,我是不是做错了什么?这可能是个问题吗?
初始错误的代码摘要:
Dim TableName As String, FieldString As String
Dim strSQL As String, valstring As String
Dim NewTableRef As Range
Dim rs As DAO.Recordset, ws As DAO.Workspace, db As DAO.Database
' Fieldstring is a string containing all field names for the table to be changed'
' TableName is the table to be changed'
' Connecting to database and setting ranges done previously'
' strSQL is initially set by the type of change to make'
' modify the recordset'
On Error Resume Next
db.Execute (strSQL)
If Err <> 0 Then
' Only an issue for inputs to Table1'
If TableName = "Table1" Then
' try it with parameters'
strSQL = "PARAMETERS @var1 TEXT, @var2 TEXT, @var3 TEXT, @var4 TEXT, @var5 TEXT;" _
& "INSERT INTO " & TableName & " (" & FieldString & ") " & " VALUES (@var1,@var2,@var3,@var4,@var5);"
Set qdf = db.CreateQueryDef("", strSQL)
qdf!var1 = NewTableRef.Offset(Row - NewTableRef.Row, 1).Value
qdf!var2 = NewTableRef.Offset(Row - NewTableRef.Row, 2).Value
qdf!var3 = NewTableRef.Offset(Row - NewTableRef.Row, 3).Value
qdf!var4 = NewTableRef.Offset(Row - NewTableRef.Row, 4).Value
qdf!var5 = NewTableRef.Offset(Row - NewTableRef.Row, 5).Value
Err.Clear
Error.Clear
qdf.Execute
If Err <> 0 Then
With ThisWorkbook.Sheets("DB Error Log").Range("Error_Log")
.Columns(1).Offset(ErrNum).Value = Now()
.Columns(2).Offset(ErrNum).Value = ii
.Columns(3).Offset(ErrNum).Value = TableName
.Columns(4).Offset(ErrNum).Value = PKey
.Columns(5).Offset(ErrNum).Value = Error(Err)
.Columns(6).Offset(ErrNum).Value = valstring
ErrNum = ErrNum + 1
Debug.Print ErrNum
End With
End If
Else
' write error has occurred'
' log this error'
With ThisWorkbook.Sheets("DB Error Log").Range("Error_Log")
.Columns(1).Offset(ErrNum).Value = Now()
.Columns(2).Offset(ErrNum).Value = ii
.Columns(3).Offset(ErrNum).Value = TableName
.Columns(4).Offset(ErrNum).Value = PKey
.Columns(5).Offset(ErrNum).Value = Error(Err)
.Columns(6).Offset(ErrNum).Value = valstring
ErrNum = ErrNum + 1
Debug.Print ErrNum
End With
Error.Clear
Err.Clear
End If
End If
On Error GoTo 0
Error
是一个函数,returns一个错误号的错误描述;它不是一个对象,所以你不能使用 Error.Clear
- 从你的代码中删除它。
我 运行 来自 Excel 文件的一些 VBA,以便在 Excel 中的数据操作后更新 Access 数据库。它通过 DAO 链接创建并执行 SQL 行。有时要输入的数据包含破坏 SQL 的字符(例如 INSERT INTO 语句值中的撇号),因此捕获参数化查询语句的错误会尝试进行这些更改。
清除旧错误后,查询语句return在运行时出现错误"Object required",但它确实有效(以正确的方式修改了数据库)。问题是:为什么会 return 这个错误,我是不是做错了什么?这可能是个问题吗?
初始错误的代码摘要:
Dim TableName As String, FieldString As String
Dim strSQL As String, valstring As String
Dim NewTableRef As Range
Dim rs As DAO.Recordset, ws As DAO.Workspace, db As DAO.Database
' Fieldstring is a string containing all field names for the table to be changed'
' TableName is the table to be changed'
' Connecting to database and setting ranges done previously'
' strSQL is initially set by the type of change to make'
' modify the recordset'
On Error Resume Next
db.Execute (strSQL)
If Err <> 0 Then
' Only an issue for inputs to Table1'
If TableName = "Table1" Then
' try it with parameters'
strSQL = "PARAMETERS @var1 TEXT, @var2 TEXT, @var3 TEXT, @var4 TEXT, @var5 TEXT;" _
& "INSERT INTO " & TableName & " (" & FieldString & ") " & " VALUES (@var1,@var2,@var3,@var4,@var5);"
Set qdf = db.CreateQueryDef("", strSQL)
qdf!var1 = NewTableRef.Offset(Row - NewTableRef.Row, 1).Value
qdf!var2 = NewTableRef.Offset(Row - NewTableRef.Row, 2).Value
qdf!var3 = NewTableRef.Offset(Row - NewTableRef.Row, 3).Value
qdf!var4 = NewTableRef.Offset(Row - NewTableRef.Row, 4).Value
qdf!var5 = NewTableRef.Offset(Row - NewTableRef.Row, 5).Value
Err.Clear
Error.Clear
qdf.Execute
If Err <> 0 Then
With ThisWorkbook.Sheets("DB Error Log").Range("Error_Log")
.Columns(1).Offset(ErrNum).Value = Now()
.Columns(2).Offset(ErrNum).Value = ii
.Columns(3).Offset(ErrNum).Value = TableName
.Columns(4).Offset(ErrNum).Value = PKey
.Columns(5).Offset(ErrNum).Value = Error(Err)
.Columns(6).Offset(ErrNum).Value = valstring
ErrNum = ErrNum + 1
Debug.Print ErrNum
End With
End If
Else
' write error has occurred'
' log this error'
With ThisWorkbook.Sheets("DB Error Log").Range("Error_Log")
.Columns(1).Offset(ErrNum).Value = Now()
.Columns(2).Offset(ErrNum).Value = ii
.Columns(3).Offset(ErrNum).Value = TableName
.Columns(4).Offset(ErrNum).Value = PKey
.Columns(5).Offset(ErrNum).Value = Error(Err)
.Columns(6).Offset(ErrNum).Value = valstring
ErrNum = ErrNum + 1
Debug.Print ErrNum
End With
Error.Clear
Err.Clear
End If
End If
On Error GoTo 0
Error
是一个函数,returns一个错误号的错误描述;它不是一个对象,所以你不能使用 Error.Clear
- 从你的代码中删除它。