【问题标题】:How to check are there any records in recordset in VBA?如何检查VBA中的记录集中是否有任何记录?
【发布时间】:2020-07-13 18:30:26
【问题描述】:

请你帮帮我。我在 Access 中有一个数据库和一个用 Delphi 编写的程序(我使用了库 Ehlib),我正在尝试在 VBA 中重写它。

with CustomDriver do
  try
    with SelectCommand do
    begin
      CommandText.Text := 'select count(*) from OBJ_APP a' + ^M +
                          'where ID_App = :AID_App and exists (select 1 from obj_app b where b.ID_Obj = a.ID_Obj and b.ID_App = :AID_App_Replace)';
      Parameters.ParamByName('AID_App').Value := AID_App;
      Parameters.ParamByName('AID_App_Replace').Value := AID_App_Replace;
    end;
    vFree := True;
    ExecuteCommand(SelectCommand, DsReplace, vFree);
if (DsReplace <> Nil)
and(DsReplace.RecordCount > 0)
and(DsReplace.Fields[0].AsInteger > 0) then

如何在 VBA 中编写最后三行代码?有没有比&amp; Chr (34) &amp; 更简单的写双引号的方法?

【问题讨论】:

    标签: ms-access vba


    【解决方案1】:

    您只需要在打开记录集后检查.EOF

    Set rs = CurrentDb.OpenRecordset("SELECT * FROM foo")
    If Not rs.EOF Then
        If rs(0) > 0 Then
        ' or if you want to be explicit
        If rs.Fields(0).Value > 0 Then
    

    双引号被加倍掩盖:

    Debug.Print "Hello ""World"""
    

    但通常您可以通过使用单引号使您的代码更具可读性:

    strSQL = "SELECT * FROM foo WHERE bar = 'something'"
    

    【讨论】:

      【解决方案2】:

      您也可以查看RecordCount:

      Set rs = CurrentDb.OpenRecordset("Select * From YourTable")
      If rs.RecordCount > 0 Then
          ' At least one record exists.
          ' Do stuff.
      End If
      

      【讨论】:

        【解决方案3】:

        所有答案都是错误的。

        错了,原因……

        1.在记录计数之前,必须填充记录集!
        2. 强烈不建议直接使用CurrentDb

        sSQL = "SELECT * FROM foo"
        
        Set cdb = CurrentDb
        Set rst = cdb .OpenRecordset(sSQL)
        
        With rst
            Select Case (.BOF And .EOF)
                Case True
                    lCnt = 0
                Case False
                    .MoveLast: .MoveFirst
                    lCnt = .RecordCount
            End Select
        End With
        
        Call rst.Close
        Set rst = Nothing 
        
        Call cdb.Close
        Set cdb = Nothing
        

        .

        【讨论】:

        • 如果你知道你在做什么CurrentDb().Method是没有危险的,在这种情况下它是使用一次,不需要存储参考。你不应该多次使用它(例如循环),而是在Withstatement 中使用它,这是安全的/在你的代码中你可以使用With Currentdb.OpenRecordset(sSQL)-> no object vars to care))..如果你打开一个未经编辑的记录集,使用只读。
        • @ComputerVersteher ,有“最佳实践”的概念。它说 - 喜欢它,不要犹豫它是否“危险”:) 如果拒绝这个 cdb 变量,你想节省多少?你是单行编码器?好的。前进!。
        • 在这种情况下,我保存了 108 个字符 (cdb + rst) (252 到 360) ;) 主要动机是与神话作斗争。当然不建议初学者使用它,但如果你知道的更好,请使用你的知识。
        • 这个答案如果没有错,那就太复杂了。问题是是否找到 any 记录,而不是找到多少记录,因此无需使用 MoveLast 检索所有记录,因为这可能需要相当长的时间。直接使用 CurrentDb 进行单个调用是完全可以的。
        • @Gustav ,我称之为错误的答案提出了错误的方法。而且您的“相当长的时间”声明不适用于OP技能。即使在这种情况下,也可以轻松地限制仅通过 EOF 和 BOF 进行检查。但必须牢记记录集填充的必要性。
        猜你喜欢
        • 2013-09-01
        • 1970-01-01
        • 2010-10-14
        • 1970-01-01
        • 1970-01-01
        • 2017-04-22
        • 1970-01-01
        • 1970-01-01
        • 2012-12-21
        相关资源
        最近更新 更多