【问题标题】:VBA SQL Server Query Connecting but not Returning RecordsVBA SQL Server查询连接但不返回记录
【发布时间】:2021-03-13 23:21:58
【问题描述】:

我有这个 VBA 代码,它在成功连接后发出 SQL Server 查询,但查询不返回任何记录(例如,-1)

Function invested_funds() As Integer
Dim c As ADODB.Connection
Dim rs As ADODB.Recordset
Dim connectionstring As String
Dim sql As String

connectionstring = "Provider=SQLOLEDB;Data Source=DESKTOP-2TTG3GQ\SQLEXPRESS;" & _
                   "Initial Catalog=DB;" & _
                   "Integrated Security=SSPI;"

Set c = New ADODB.Connection
Set rs = New ADODB.Recordset
c.Open connectionstring

sql = "select [DB].[dbo].[db].[CSRoot] " & _  
      "from [DB].[dbo].[db] " 

If c.State = adStateOpen Then
    Debug.Print ("Connected") 'This prints!
End If

Set rs = c.Execute(sql) 
Debug.Print (rs.RecordCount)
invested_funds = CInt(rs.RecordCount)

End Function

但是,我知道记录存在,并且 SSMS 中完全相同的查询确实返回记录

select  [DB].[dbo].[db].[CSRoot]
from [DB].[dbo].[db]

事实上有很多记录。

这怎么可能?

【问题讨论】:

  • 不要依赖RecordCount。尝试遍历记录集。
  • select [DB].[dbo].[db].[CSRoot] from [DB].[dbo].[db]select CSRoot from [DB].[dbo].[db] 不是同一个查询。第一个查询甚至不是有效的 t-sql 语法。更改您的 VBA 代码以使用第二个查询
  • @squillman 你是对的。那是我的一个错字。已编辑。感谢您指出。
  • 我认为您编辑了问题的错误部分。
  • @Parfait 你完全正确! RecordCount 说 -1 但当我遍历集合时,我看到了我的记录。 RecordCount 不可靠是常识吗?随意将您的评论变成信用问题。

标签: sql-server excel vba


【解决方案1】:

您可以使用 rs.getRows 函数获取记录数。

Function invested_funds() As Integer
    Dim c As ADODB.Connection
    Dim rs As ADODB.Recordset
    Dim connectionstring As String
    Dim sql As String
    
    connectionstring = "Provider=SQLOLEDB;Data Source=DESKTOP-2TTG3GQ\SQLEXPRESS;" & _
                       "Initial Catalog=DB;" & _
                       "Integrated Security=SSPI;"
    
    Set c = New ADODB.Connection
    Set rs = New ADODB.Recordset
    c.Open connectionstring
    
    sql = "select [DB].[dbo].[db].[CSRoot] " & _
          "from [DB].[dbo].[db] "
    
    If c.State = adStateOpen Then
        Debug.Print ("Connected") 'This prints!
    End If
    
    Set rs = c.Execute(sql)
    
    Dim arr As Variant, n As Integer
    
    arr = rs.GetRows
    n = UBound(arr, 2) + 1
    'Debug.Print (rs.RecordCount)
    Debug.Print n
    invested_funds = n

End Function

【讨论】:

    猜你喜欢
    • 2013-03-01
    • 2013-10-31
    • 2018-04-09
    • 2022-07-20
    • 2023-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多