检查记录集是否有空字段

时间:2013-10-29 19:21:25

标签: vb6 recordset

如果pre-view的字段为空/无效,我正在尝试recordset

If IsNull(rs.Fields("fieldname")) = True Then ...

If IsNull(rs.Fields("fieldname")).Value = True Then ...  

if IsNull(rs.Fields("fieldName").Value) Then...

所有这些方法都会引发错误......为什么?在将recordset的值赋给变量之前,如何检查{{1}}是否为空。

5 个答案:

答案 0 :(得分:1)

如果我理解正确,您需要确保记录集中存在一个字段。如果这是正确的,您需要迭代字段以查找您要搜索的字段,或者尝试直接访问该字段并捕获任何错误。这是一个迭代字段集合的方法,如果该字段存在则返回True。

Public Function FieldExists(ByVal rsRecSet As ADODB.Recordset, ByVal FieldName As String) As Boolean
    Dim fld As ADODB.Field
    Dim Rtn As Boolean

    If Not rsRecSet Is Nothing Then
        For Each fld In rsRecSet.Fields
            If StrComp(fld.Name, FieldName, vbTextCompare) = 0 Then
                Rtn = True
                Exit For
            End If
        Next fld
    End If

    FieldExists = Rtn

End Function

答案 1 :(得分:1)

这是打印表格列的方法。

Dim cat

Set cat = CreateObject("ADOX.Catalog")
Set cat.ActiveConnection = db 'db is the adodb.connection object

Dim tbl
Dim clm
For Each tbl In cat.Tables
   For Each clm In tbl.Columns
      Debug.Print (clm) ' Prints the column name from the table
   Next
Next

答案 2 :(得分:0)

请尝试使用IsDbNull()。 DbNull与Null不同。

编辑,只需遍历字段名称,如果找到它就有一个布尔值,否则使用try catch结构。

For Each field in rs.Fields
   if field.Name = "someFieldName" then 
      foundField = true 
  exit for
   else 
      foundField = false
   end if
next

答案 3 :(得分:0)

我正在使用AtValueAtField这样的帮助

Option Explicit

Private Sub Form_Load()
    Dim rs As Recordset

    If IsEmpty(AtValue(rs, "Test")) Then
        Debug.Print "Field is Empty or non-existant"
    End If

    If LenB(C2Str(AtValue(rs, "Test"))) = 0 Then
        Debug.Print "Field is Null, Empty, empty string or non-existant"
    End If
    '-- this will never fail, even if field does not exist
    AtField(rs, "Test").Value = 42
End Sub

Public Function AtValue(rs As Recordset, Field As String) As Variant
    On Error GoTo QH
    AtValue = rs.Fields(Field).Value
    Exit Function
QH:
'    Debug.Print "Field not found: " & Field
End Function

Public Function AtField(rs As Recordset, Field As String) As ADODB.Field
    Static rsDummy      As Recordset

    On Error GoTo QH
    Set AtField = rs.Fields(Field)
    Exit Function
QH:
'    Debug.Print "Field not found: " & Field
    Set rsDummy = New Recordset
    rsDummy.Fields.Append Field, adVariant
    rsDummy.Open
    rsDummy.AddNew
    Set AtField = rsDummy.Fields(Field)
End Function

Public Function C2Str(Value As Variant) As String
    On Error GoTo QH
    C2Str = CStr(Value)
QH:
End Function

我的类型转换助手实际上正在使用VariatChangeType API(因此要使用 Break on all errors 设置),就像这样

Public Function C_Str(Value As Variant) As String
    Dim vDest           As Variant

    If VarType(Value) = vbString Then
        C_Str = Value
    ElseIf VariantChangeType(vDest, Value, VARIANT_ALPHABOOL, VT_BSTR) = 0 Then
        C_Str = vDest
    End If
End Function

答案 4 :(得分:-1)

rs.EOF标志将告诉RecordSet是否为空

如果不是rs.EOF那么 ..你想要的逻辑...... 结束如果