将记录集分配给 VBA 中的变量
Assign Recordset to Variable in VBA
我正在尝试从记录集中分配变量值并将值插入到 Access table。我还需要清除 table 并在插入之前插入新的数据集。记录集来自 SQL 服务器中的存储过程。以下似乎不起作用:
Dim conn As ADODB.Connection, cmd As ADODB.Command, rst As
ADODB.Recordset
Dim Itm As String, JobNo As Integer, RevNo As Integer, DUStatus As Date, LDUStatus As Date, UTrigger As String
Set conn = New ADODB.Connection
conn.ConnectionString = "Provider='sqloledb';Data Source=SERVER;Initial Catalog='Database';Integrated Security='SSPI';"
conn.Open
Set cmd = New ADODB.Command
With cmd
.ActiveConnection = conn
.CommandText = "rg_ItemsQuerySP"
.CommandType = adCmdStoredProc
.Parameters.Append .CreateParameter("@JobNo", adInteger, adParamInput, , TempJobNo)
.Parameters.Append .CreateParameter("@RevNo", adInteger, adParamInput, , TempRevNo)
End With
Set rst = cmd.Execute
If rst.EOF Then Exit Function
rst.MoveLast
rst.MoveFirst
With rst
Do While Not .EOF
Itm = rst.Fields("Item")
JobNo = rst.Fields("Job No")
RevNo = rst.Fields("Revision No")
DUStatus = rst.Fields("DateUpdatedStatus")
LDUStatus = rst.Fields("LastDateUpdatedStatus")
UTrigger = rst.Fields("UpdateTrigger")
DoCmd.RunSQL ("INSERT INTO ItemsQuerySP_Temp values " & Itm & ", " & JobNo & ", " & RevNo & ", " & DUStatus & ", " & LDUStatus & ", " & UTrigger & ";")
rst.MoveNext
Loop
End With
conn.Close
Set conn = Nothing
您的问题可能是字符串变量周围缺少引号,这会引发 SQL 错误。由于您使用 ADO 参数,请继续通过 QueryDef 使用参数,避免字符串连接(即 & 符号)或标点符号(即引号):
SQL (下面保存为MS Access保存的查询,根据需要调整类型:Text
, Long
, Double
, 等等)
PARAMETERS PrmItm Text, PrmJobNo Text, PrmRevNo Text,
PrmDUStatus Text, PrmLDUStatus Text, PrmUTrigger Text;
INSERT INTO ItemsQuerySP_Temp
VALUES(PrmItm, PrmJobNo, PrmRevNo,
PrmDUStatus, PrmLDUStatus, PrmUTrigger)
VBA (相关部分)
Dim qdef AS QueryDef
' ... same as above...
Set qdef = CurrentDb.QueryDefs("mySavedQuery")
With rst
Do While Not .EOF
' BIND PARAMETERS
qdef!PrmItm = rst.Fields("Item")
qdef!PrmJobNo = rst.Fields("Job No")
qdef!PrmRevNo = rst.Fields("Revision No")
qdef!PrmDUStatus= rst.Fields("DateUpdatedStatus")
qdef!PrmLDUStatus = rst.Fields("LastDateUpdatedStatus")
qdef!PrmUTrigger = rst.Fields("UpdateTrigger")
' EXECUTE ACTION
qdef.Execute dbFailOnError
.MoveNext
Loop
End With
Set qdef = Nothing
我正在尝试从记录集中分配变量值并将值插入到 Access table。我还需要清除 table 并在插入之前插入新的数据集。记录集来自 SQL 服务器中的存储过程。以下似乎不起作用:
Dim conn As ADODB.Connection, cmd As ADODB.Command, rst As
ADODB.Recordset
Dim Itm As String, JobNo As Integer, RevNo As Integer, DUStatus As Date, LDUStatus As Date, UTrigger As String
Set conn = New ADODB.Connection
conn.ConnectionString = "Provider='sqloledb';Data Source=SERVER;Initial Catalog='Database';Integrated Security='SSPI';"
conn.Open
Set cmd = New ADODB.Command
With cmd
.ActiveConnection = conn
.CommandText = "rg_ItemsQuerySP"
.CommandType = adCmdStoredProc
.Parameters.Append .CreateParameter("@JobNo", adInteger, adParamInput, , TempJobNo)
.Parameters.Append .CreateParameter("@RevNo", adInteger, adParamInput, , TempRevNo)
End With
Set rst = cmd.Execute
If rst.EOF Then Exit Function
rst.MoveLast
rst.MoveFirst
With rst
Do While Not .EOF
Itm = rst.Fields("Item")
JobNo = rst.Fields("Job No")
RevNo = rst.Fields("Revision No")
DUStatus = rst.Fields("DateUpdatedStatus")
LDUStatus = rst.Fields("LastDateUpdatedStatus")
UTrigger = rst.Fields("UpdateTrigger")
DoCmd.RunSQL ("INSERT INTO ItemsQuerySP_Temp values " & Itm & ", " & JobNo & ", " & RevNo & ", " & DUStatus & ", " & LDUStatus & ", " & UTrigger & ";")
rst.MoveNext
Loop
End With
conn.Close
Set conn = Nothing
您的问题可能是字符串变量周围缺少引号,这会引发 SQL 错误。由于您使用 ADO 参数,请继续通过 QueryDef 使用参数,避免字符串连接(即 & 符号)或标点符号(即引号):
SQL (下面保存为MS Access保存的查询,根据需要调整类型:Text
, Long
, Double
, 等等)
PARAMETERS PrmItm Text, PrmJobNo Text, PrmRevNo Text,
PrmDUStatus Text, PrmLDUStatus Text, PrmUTrigger Text;
INSERT INTO ItemsQuerySP_Temp
VALUES(PrmItm, PrmJobNo, PrmRevNo,
PrmDUStatus, PrmLDUStatus, PrmUTrigger)
VBA (相关部分)
Dim qdef AS QueryDef
' ... same as above...
Set qdef = CurrentDb.QueryDefs("mySavedQuery")
With rst
Do While Not .EOF
' BIND PARAMETERS
qdef!PrmItm = rst.Fields("Item")
qdef!PrmJobNo = rst.Fields("Job No")
qdef!PrmRevNo = rst.Fields("Revision No")
qdef!PrmDUStatus= rst.Fields("DateUpdatedStatus")
qdef!PrmLDUStatus = rst.Fields("LastDateUpdatedStatus")
qdef!PrmUTrigger = rst.Fields("UpdateTrigger")
' EXECUTE ACTION
qdef.Execute dbFailOnError
.MoveNext
Loop
End With
Set qdef = Nothing