如何在VBA的SQL字符串中设置DB2系统变量避免执行报错?
问题分析与解决办法
问题根源
你遇到的核心问题是:ADO执行包含SET CURRENT PRECISION的多语句SQL时,默认只会获取第一个语句的执行结果——而SET命令属于非查询语句,不会返回记录集,导致后续判断Recordset状态时因集合未打开而失败。IBM Data Studio会自动遍历所有语句的结果并返回最后一个有效数据集,但ADO没有这个默认行为。
解决方案
方案1:拆分语句分别执行(推荐)
SET CURRENT PRECISION是会话级设置,在当前DB2连接生效,因此可以先单独执行SET命令,再执行查询语句:
Dim strConnectionString As String Dim cnDB2Connection As ADODB.Connection Dim cmDB2Command As ADODB.Command Dim rsMyRecordset As ADODB.Recordset Dim strSQLQuery As String Set cnDB2Connection = New ADODB.Connection Set cmDB2Command = New ADODB.Command Set rsMyRecordset = New ADODB.Recordset strConnectionString = "DSN=[MYODBC];Uid=" & [MYUSERNAME] & ";Pwd=" & [MYPASSWORD] cnDB2Connection.Open strConnectionString cmDB2Command.ActiveConnection = cnDB2Connection ' 第一步:单独执行SET命令,无需返回记录集 cnDB2Connection.Execute "SET CURRENT PRECISION = 'D15.7';" ' 第二步:执行查询语句获取记录集 strSQLQuery = "SELECT 1 + 2 AS TEST FROM SYSIBM.SYSDUMMY1;" cmDB2Command.CommandType = adCmdText cmDB2Command.CommandText = strSQLQuery rsMyRecordset.CursorType = adOpenStatic rsMyRecordset.CursorLocation = adUseClient rsMyRecordset.LockType = adLockReadOnly rsMyRecordset.Open cmDB2Command If Not (rsMyRecordset.BOF And rsMyRecordset.EOF) Then ' [DO STUFF] End If Set rsMyRecordset = Nothing Set cmDB2Command = Nothing Set cnDB2Connection = Nothing
方案2:使用NextRecordset获取后续结果集
如果必须在一个Command中执行多语句,可通过NextRecordset方法跳过第一个无结果的SET命令,获取第二个查询的结果:
Dim strConnectionString As String Dim cnDB2Connection As ADODB.Connection Dim cmDB2Command As ADODB.Command Dim rsMyRecordset As ADODB.Recordset Dim strSQLQuery As String Set cnDB2Connection = New ADODB.Connection Set cmDB2Command = New ADODB.Command Set rsMyRecordset = New ADODB.Recordset strConnectionString = "DSN=[MYODBC];Uid=" & [MYUSERNAME] & ";Pwd=" & [MYPASSWORD] cnDB2Connection.Open strConnectionString cmDB2Command.ActiveConnection = cnDB2Connection strSQLQuery = "SET CURRENT PRECISION = 'D15.7';" & " SELECT 1 + 2 AS TEST FROM SYSIBM.SYSDUMMY1;" cmDB2Command.CommandType = adCmdText cmDB2Command.CommandText = strSQLQuery ' 执行命令,先获取第一个无结果的数据集 Set rsMyRecordset = cmDB2Command.Execute ' 切换到第二个查询的结果集 Set rsMyRecordset = rsMyRecordset.NextRecordset If Not (rsMyRecordset.BOF And rsMyRecordset.EOF) Then ' [DO STUFF] End If Set rsMyRecordset = Nothing Set cmDB2Command = Nothing Set cnDB2Connection = Nothing
内容的提问来源于stack exchange,提问作者BobT36
相关产品推荐
相关产品推荐

