在遍历从Redshift数据库提取的记录集时,VBA冻结

时间:2018-08-02 16:35:39

标签: vba amazon-redshift

我有这个VBA代码,可以从Redshift数据库中提取相对较少的记录(大约200条)。

Dim cnDB As New ADODB.Connection
Dim RS As New ADODB.Recordset
Dim sqlContent As String

RS.ActiveConnection = cnDB
'RS.CursorLocation = adUseClient 'tried this, but results in recordcount "<data provider or other service returned an E_FAIL status>"
RS.Open sqlContent

x = 0
 For Each fld In RS.Fields
      With ws
        x = x + 1
        .Cells(1, x).Value = fld.Name
        colIndex.Add x, fld.Name
      End With
 Next fld

If Not RS.EOF Then
    RS.MoveFirst
Else
    Debug.Print "No Results Returned."
    Exit Sub
End If

'Populates row data
rN = 1
While Not RS.EOF
    rN = rN + 1
    With ws
        For Each fld In RS.Fields  'problem is occurring somewhere in here while processing 2nd record
            With .Cells(rN, colIndex(fld.Name))
                .Value = fld.Value
            End With
        Next fld
    End With
    RS.MoveNext
Wend

在我们从Vertica数据库迁移之前,此代码没有问题。根据我在研究问题时发现的一些信息,似乎我可能会遇到麻烦,因为游标在Redshift中的工作方式有所不同,但是如果这是问题,我不知道如何解决。

在DSN连接选项中,我尝试使用“使用声明/获取”而不是“将整个结果检索到内存中”,但是现在我真的只是在吸管了。我看不出有什么区别。

我直接对Redshift db运行查询,它运行正常,返回所有预期记录。因此问题不存在。

在VBA中运行查询后,我看到一个记录集计数为-1,但是肯定有记录在里面。当我在遍历字段时观察记录集时,一切看起来都很好,直到有几个字段进入第二个记录集,然后我得到了圆形光标,并且无法无限期地执行任何其他操作。我必须杀死Excel并重新开始。

预先感谢您可能会给我的指导。

1 个答案:

答案 0 :(得分:0)

感谢Parfait的帮助!解决方案(我认为-此后又开始出现故障-请参阅下面的评论)是首先替换整个段

'Populates row data
rN = 1
While Not RS.EOF
    rN = rN + 1
    With ws
        For Each fld In RS.Fields  'problem is occurring somewhere in here while processing 2nd record
            With .Cells(rN, colIndex(fld.Name))
                .Value = fld.Value
            End With
        Next fld
    End With
    RS.MoveNext
Wend

使用

ws.Cells(2, 1).CopyFromRecordset RS

,然后我将查询中的浮点数转换为小数,将时间戳转换为日期(不确定是否必须进行两种转换,但是既然可以正常工作,我就不做任何修改了。)

CAST(fieldThatWasFloat as DECIMAL(6,5)),
CAST(fieldThatWasTimestamp as DATE)

请注意,时间戳记丢失了一些细节,但这在这里并不重要。可以肯定的是,在日期格式上可以使用一些技巧来恢复它。