我正在尝试获取数据库中的数据,并在列表视图中显示(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
1条答案
按热度按时间oxosxuxt1#
你的类型不匹配与空值无关,它来自一个看起来很正常的语句:
rst.RecordCount
会传回VartypeLongLong
,而将它指派给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
,例如