0

我有一个创建记录集的子。使用记录集中的值调用函数。目标是使用记录集中的多个值,但是,记录集值有可能为空,然后函数调用将导致错误:“无效使用 Null”。为处理此错误,每次检查记录集值是否为空值时,如果为空,则将其替换为空字符串。但是,我编写此程序的方式感觉非常低效,当稍后需要检查十多个参数时更是如此。有没有办法更有效地做到这一点?

我跳过了代码的最后一部分,因为这不是理解我的问题所必需的。我已将其替换为......如果需要,我将编辑并提供完整代码。

Sub CallFunctionWithArray()
    Dim conn As ADODB.Connection
    Dim rst As ADODB.Recordset
    Dim arrValues(1 To 3) As Variant

Set conn = New ADODB.Connection
conn.Open "provider=Microsoft.JET.OLEDB.4.0;Data Source=" & CurrentProject.Path & "\Northwind.mdb"

Set rst = New ADODB.Recordset
rst.Open "SELECT * FROM CustomersCopy", conn, adOpenForwardOnly, adLockReadOnly, adCmdText

If Not (rst.EOF And rst.BOF) Then
    rst.MoveFirst        
    Do Until rst.EOF = True

    If IsNull(rst![CompanyName]) Then
        arrValues(1) = ""
    Else
        arrValues(1) = rst![CompanyName]
    End If

    If IsNull(rst![DateTest]) Then
        arrValues(2) = ""
    Else
        arrValues(2) = rst![DateTest]
    End If

    If IsNull(rst![INTTest]) Then
        arrValues(3) = ""
    Else
        arrValues(3) = rst![INTTest]
    End If

        Call ReturnValuesOfArray(arrValues(1), arrValues(2), arrValues(3))    
.........
End Sub

Function ReturnValuesOfArray(ByVal ValueOne As String, ByVal ValueTwo As String, ByVal ValueThree As String)
    Debug.Print "Waarde variabele 1: " & ValueOne
    Debug.Print "Waarde variabele 2: " & ValueTwo
    Debug.Print "Waarde variabele 3: " & ValueThree
End Function

代码没有问题,它做了它应该做的事情。但是,当真正使用它时,我将向函数传递更多参数。

4

2 回答 2

2

您可以遍历 Recordset 的字段,而不是对每个字段进行硬编码。使用您的代码作为起点,它可能看起来像这样:

Private Sub Test()
   Dim rst As ADODB.Recordset
   Dim i As Integer

   If Not (rst.EOF And rst.BOF) Then
      rst.MoveFirst

      Do Until rst.EOF = True
         For i = 0 To rst.Fields.Count - 1
            If IsNull(rst.Fields(i).Value) Then
               arrValues(i) = ""
            Else
               arrValues(i) = rst.Fields(i).Value
            End If
         Next
      Loop
   End If
End Sub

结合@HansUp 和@Mathieu Guindon 提出的想法,代码甚至更短:

Private Sub Test()
   Dim rst As ADODB.Recordset
   Dim i As Integer

   Do Until rst.EOF
      For i = 0 To rst.Fields.Count - 1
         arrValues(i + 1) = Nz(rst.Fields(i).Value, "")
      Next
   Loop
End Sub

您的代码的其余部分也可以简化,同时允许任意数量的参数:

Function ReturnValuesOfArray(ByVal Values As Variant)
    Dim i As Integer

    For i = LBound(Values) To UBound(Values)
       Debug.Print "Waarde variabele " & i & ": " & Values(i)
    Next
End Function
于 2019-09-09T19:31:56.497 回答
1

Nz 功能做我认为你想要的。

arrValues(1) = Nz(rst![CompanyName], "")
arrValues(2) = Nz(rst![DateTest], "")
arrValues(3) = Nz(rst![INTTest], "")
于 2019-09-09T19:27:59.817 回答