我有这个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并重新开始。
预先感谢您可能会给我的指导。
答案 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)
请注意,时间戳记丢失了一些细节,但这在这里并不重要。可以肯定的是,在日期格式上可以使用一些技巧来恢复它。