【问题标题】:Get Query Result from SQL Server with VBA without CopyFromRecordSet使用没有 CopyFromRecordSet 的 VBA 从 SQL Server 获取查询结果
【发布时间】:2016-11-17 08:44:52
【问题描述】:

我有以下来自 SQL-Server 的 VBA 查询,只返回一个结果。我的问题是如何阅读它。到目前为止,我已经找到了一种方法,但我不想使用它。

Dim rsData              As Object
Set rsData = CreateObject("ADODB.Recordset")

With rsData
    .ActiveConnection = cnLogs
    .Open "USE DB SELECT [VersionNumber] FROM Main WHERE [IsLastCurrent] = 1"
End With

我不想使用的解决方案:

Cells(1, 1).CopyFromRecordset rsData

【问题讨论】:

  • 知道你为什么不想使用CopyFromRecordset会很有帮助
  • 因为使用 CopyFromRecordset 我应该把它写在桌子上的某个地方,我只想取值并为其分配一个变量。
  • myVar=rsData.Fields("VersionNumber")你还需要先确保rsData中有数据
  • 这会返回错误 3265... 有什么想法吗?
  • 查看我的编辑。可能是 SQL 语句出错

标签: sql sql-server vba


【解决方案1】:

您可以使用Fields 属性逐个记录访问Recordset 记录中的值。当您第一次打开记录集时,它要么是空的(在这种情况下,recordset.BOFrecordset.EOF 都是 true),要么它指向集合中的第一条记录(在这种情况下,recordset.BOFrecordset.EOF 都是 false )。然后,您可以使用(例如)访问该记录中的数据:

rsData.Fields("VersionNumber").Value

您可以使用recordset 对象的MoveFirstMoveLastMoveNextMovePrevious 方法在记录中移动(如果有多个记录)。

【讨论】:

  • >Debug.Print rsData.Fields("VersionNumber").Value
【解决方案2】:

在 SQL 命令中尝试此更改:

With rsData
    .ActiveConnection = cnLogs
    .Open "USE DB; SELECT [VersionNumber] FROM Main WHERE [IsLastCurrent] = 1;"
End With

If (rsData.EOF = False) OR (rsData.BOF = False) Then
 'there are recordset
 myVar=   rsData.Fields(0).value
End If

rsData.Close

【讨论】:

  • 谢谢。实际上,问题出在用户的服务器角色上。我只有公开的,由于某种原因,它不想复制所有字段。我添加了更多特权,它开始工作了。
【解决方案3】:

如果要将数据保存在内存中,请使用数组变量,例如 将rsArray 调暗为变体,然后将记录集复制到其中:

rsArray = rsData.GetRows

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多