sql-server 从SQL Server获取数据到Excel VBA列表视图

bxgwgixi  于 2022-10-31  发布在  SQL Server
关注(0)|答案(1)|浏览(218)

我正在尝试获取数据库中的数据,并在列表视图中显示(userform)。我遇到了一个错误,说“类型不匹配”,我很困惑什么部分是不匹配的,我已经搜索了这个错误的含义,但是我已经用正确的数据类型声明了我所有的变量。但是因为我有空白或者空值,所以它显示了一个错误。在这一行If not IsNull(Records(j, i)) Then li.ListSubItems.Add , , Records(j, i)上,我试图在listview上显示null或empty,不匹配错误消失了,但如果column1为空,column2不为空,column2上的值将粘贴到column1上。

Private Sub ListView_Data()
    On Error GoTo ERR_Handler
    Dim sql As String
    Dim con As ADODB.Connection
    Dim rst As New ADODB.Recordset
    Dim Records As Variant
    Dim i As Long, j As Long
    Dim RecCount As Long

    Set con = New ADODB.Connection

    con.Open "Provider=SQLOLEDB;Data Source=10.206.88.119\BIWFO;" & _
                          "Initial Catalog=TESTDB;" & _
                          "Uid=user; Pwd=pass;"

    sql = "select * from [TESTDB].[dbo].[tbl_MN_Omega_Raw]"

    rst.Open sql, con, adOpenKeyset, adLockOptimistic
    '~~> Get the records in an array
    Records = rst.GetRows
    '~~> Get the records count
    RecCount = rst.RecordCount

    '~~> Populate the headers
    For i = 0 To rst.Fields.count - 1
        ListView1.ColumnHeaders.Add , , rst.Fields(i).Name, 200
    Next i

    rst.Close
    con.Close

    With ListView1
        .View = lvwReport
        .CheckBoxes = False
        .FullRowSelect = True
        .Gridlines = True
        .LabelWrap = True
        .LabelEdit = lvwManual

        Dim li As ListItem

        '~~> Populate the records
        For i = 0 To RecCount - 1
            Set li = .ListItems.Add(, , Records(0, i))
            For j = 1 To UBound(Records)

                If not IsNull(Records(j, i)) Then li.ListSubItems.Add , , Records(j, i)

                'End If
            Next j
        Next i
    End With

ERR_Handler:

    Select Case Err.Number

        Case 0
        Case Else

            MsgBox Err.Description, vbExclamation + vbOKOnly, Err.Number

    End Select
End Sub
oxosxuxt

oxosxuxt1#

你的类型不匹配与空值无关,它来自一个看起来很正常的语句:rst.RecordCount会传回Vartype LongLong,而将它指派给Long会掷回型别不符。
有3种方法可以解决此问题:
(1)将RecCount声明为变量
(2)将rst.RecordCount转换为长整数:RecCount = CLng(rst.RecordCount)
(3)根本不要使用RecCount,而是使用UBound(records, 2)(我更喜欢这种方法)。
要找到这样的错误,请禁用错误处理程序(注解On Error Goto ERR_Handler)。这将显示引发错误的行。
但是,当您有包含null的字段时,会有一个小问题:您不需要对这些值执行li.ListSubItems.Add,因此该行剩余字段的所有值都将向左“移位”。您还需要对空值运行ListSubItems.Add,例如

Dim fValue As Variant
    fValue = Records(j, i)
    If IsNull(fValue) Then fValue = ""    ' or maybe "(null)"
    li.ListSubItems.Add , , fValue

相关问题