【问题标题】:SQL Record Count VBA ADODB connectionSQL 记录计数 VBA ADODB 连接
【发布时间】:2014-08-26 15:26:06
【问题描述】:

尝试使用 ADODB 记录集在 VBA 中计算 RecordSet 计数,但似乎无法使计数正常工作。

我在具有唯一 ID 的工作表中有 50 条记录,其中一些已经在数据库中,而另一些则不在,代码本身是循环遍历每个单元格并获取单元格的值并通过SQL select 语句,如果有命中则说找到,如果没有则什么也不说。

不幸的是,它似乎对所有内容都返回相同的结果,即使是我知道的 id 也不存在。

代码如下

Sub NO6_ChequeCheck()

Dim con As ADODB.Connection
Dim rec As ADODB.Recordset

Set con = New ADODB.Connection
Set rec = New ADODB.Recordset


Dim sql As String
Dim client As String

Dim myRange As Range
Dim myCell As Range

Set myRange = Range("A2:A52")

Dim i As Integer
i = 2

With con
    .Provider = "MSDASQL"
    .ConnectionString = "DSN=localhostTest"
    .Open
End With

For Each myCell In myRange

    client = myCell.text

    sql = "SELECT * FROM crm_client_cheques WHERE id = '" & client & "' "

    rec.Open sql, con

    If rec.RecordCount = 0 Then
        Cells(i, "H").Value = "Nothing"
    Else
        Cells(i, "H").Value = "Found"
    End If

    rec.Close

    i = i + 1

Next myCell

我遇到的主要问题是,如果我将 0 切换为 50 并弄乱 = 符号并将其更改为 那么结果将更改为 either ,这让我相信它不会重置记录计数返回,所以它每次只是堆叠,所以它总是在每个循环中上升,而不是回到 0。

我试过告诉它关闭和等于什么,并移动了各种代码,但没有什么帮助。

感谢所有帮助

【问题讨论】:

  • 此链接可能对您有所帮助:stackoverflow.com/questions/2282661/…
  • 去掉client变量周围的单引号是否一样
  • 除了 cyboashus 答案,请参阅allenbrowne.com/ser-29.html(陷阱 4)。
  • count 方法只有在您遍历所有数据后才有效。请参阅 user3793865 下面关于 .bof 和 .eof 的答案,这是正确的做法。
  • 如果您在该循环中反复查询记录集,您的代码将会非常缓慢。为什么不在循环遍历单元格之前查询记录集,然后在记录集中搜索循环内的值。

标签: sql vba excel


【解决方案1】:

您需要检查您的 sql 查询是否返回任何记录。你可以这样做

 If Not (rec.BOF And rec.EOF) Then 'There are no records
      Cells(i, "H").Value = "Nothing"
 else
      Cells(i, "H").Value = "Found"
 End if

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-09
    • 2013-03-01
    • 1970-01-01
    • 2014-01-26
    • 2017-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多