【问题标题】:exit function when number of records in 0当记录数为 0 时退出函数
【发布时间】:2021-03-18 13:49:22
【问题描述】:

我正在我的列表视图(sSQL) 上应用搜索过滤器。当发现没有找到记录时,我想取消该操作,否则 Listview 为空,我无法撤消过滤器。

Private Sub LoadStandardListview(Optional ByVal sFilter As String = "")

        Try
            Dim sSQL As String
            Dim sSubStr As String
            Dim strs As String
            If sFilter = "" Then
                sSQL = "SELECT Id,[Document Type],[Document Name],DISnummer,XPostnummer,[Last Accessed],[Document Location] FROM Archief WHERE ([Document Type] Is Not Null) AND ([DISnummer] Is Not Null) AND ([XPostnummer] Is Not Null) AND ([Last Accessed] Is Not Null) ORDER BY Id DESC"
            Else
                sSubStr = " AND [Document Name] LIKE '%" + sFilter + "%' "
                sSQL = "SELECT Id,[Document Type],[Document Name],DISnummer,XPostnummer,[Last Accessed],[Document Location] FROM Archief WHERE ([Document Type] Is Not Null) AND ([DISnummer] Is Not Null) AND ([XPostnummer] Is Not Null) AND ([Last Accessed] Is Not Null)" + sSubStr + "ORDER BY Id DESC"
            End If
            strs = "SELECT Count(*) FROM Archief"
            Dim cmd As New OleDb.OleDbCommand(sSQL, con)
            Dim cmd2 As New OleDb.OleDbCommand(strs, con)
            Dim dr As OleDb.OleDbDataReader = cmd.ExecuteReader
            Dim dis As String
            Dim docImage As VariantType
            Dim items As New List(Of ListViewItem)
            dr.Read()
            Dim recordCount As Long
            recordCount = cmd2.ExecuteScalar

            ListView1.BeginUpdate()
            ListView1.Items.Clear()
            While dr.Read
            If dr("Document Type").ToString = "PDF" Or dr("Document Type").ToString = "pdf" Then
                docImage = (ImageList1.Images.Count - 1)
            ElseIf dr("Document Type").ToString = "DOC" Or dr("Document Type").ToString = "doc" Then
                docImage = (ImageList1.Images.Count - 3)
            ElseIf dr("Document Type").ToString = "PPT" Or dr("Document Type").ToString = "ppt" Then
                docImage = (ImageList1.Images.Count - 2)
            End If

            dis = dr("Last Accessed").Substring(0, dr("Last Accessed").IndexOf(" "))
            items.Add(New ListViewItem(New String() {"", dr("Document Name").ToString, dr("DISnummer"), dr("XPostnummer"), dis, dr("Id").ToString, dr("Document Location").ToString}, docImage))
        End While
        ListView1.Items.AddRange(items.ToArray)
        ListView1.EndUpdate()
            sNumRec = items.Count
            If sFilter <> "" Then
                ToolStripTextBox3.Text = sNumRec + " Documents"
            Else
                ToolStripTextBox3.Text = recordCount.ToString + " Documents"
            End If
        Catch ex As Exception
        MsgBox(ex.Message)
        End Try
    End Sub

有没有一种方法可以在找不到记录时取消操作并再次使用所有记录填充列表视图?

【问题讨论】:

  • Using...End Using 块在哪里?不要使用 DataReader 进行所有处理。当存在活动的 DataReader 时,必须打开连接。填写一个 DataTable 并关闭连接。回答您的问题...If dt.Rows.Count &lt;1 Then Exit Sub
  • Mary 你想让我在列表视图填满后关闭连接吗?
  • 不,我希望您加载一个 DataTable,然后关闭并释放连接。您从 DataTable 中的值填充列表视图。连接是宝贵的对象。它们应该尽可能晚地打开并尽快关闭。

标签: vb.net listview oledbcommand oledbdatareader


【解决方案1】:

您在哪里使用了cmd2.ExecuteScalar 的值,即recordCount?试试这个

If recordCount > 0 Then
   While dr.Read
         ...
   End While
   dr.Close()
Else
   `Refill listview with no filter`
End If

【讨论】:

  • 我使用 cmd2.ExecuteScalar 来计算数据表的总数,因为我不相信填充 Listview 的总数
  • 检查ExecuteScalar的值是否大于0,如果是,则继续reader.Read然后退出sub或如果等于0则显示提示。
【解决方案2】:
Dim sSQL As String
            Dim sSubStr As String
            If sFilter = "" Then
                sSQL = "SELECT Id,[Document Type],[Document Name],DISnummer,XPostnummer,[Last Accessed],[Document Location] FROM Archief ORDER BY Id DESC"
            Else
                sSubStr = "WHERE [Document Name] LIKE '%" + sFilter + "%' "
                sSQL = "SELECT Id,[Document Type],[Document Name],DISnummer,XPostnummer,[Last Accessed],[Document Location] FROM Archief " + sSubStr + " ORDER BY Id DESC"
            End If
            Dim cmd As New OleDbCommand(sSQL, con)
            Using dr As OleDbDataReader = cmd.ExecuteReader
                Dim dis As String
                Dim docImage As VariantType
                Dim items As New List(Of ListViewItem)

                If dr.HasRows() Then

                    ListView1.BeginUpdate()
                    ListView1.Items.Clear()

                    While dr.Read
                        If dr("Document Type").ToString = "PDF" Or dr("Document Type").ToString = "pdf" Then
                            docImage = (ImageList1.Images.Count - 1)
                        ElseIf dr("Document Type").ToString = "doc" Or dr("Document Type").ToString = "docx" Then
                            docImage = (ImageList1.Images.Count - 3)
                        ElseIf dr("Document Type").ToString = "ppt" Or dr("Document Type").ToString = "pptx" Then
                            docImage = (ImageList1.Images.Count - 2)
                        ElseIf dr("Document Type").ToString = "xls" Or dr("Document Type").ToString = "xlsx" Then
                            docImage = (ImageList1.Images.Count - 4)
                        End If

                        dis = dr("Last Accessed").Substring(0, dr("Last Accessed").IndexOf(" "))
                        items.Add(New ListViewItem(New String() {"", dr("Document Name").ToString, dr("DISnummer").ToString, dr("XPostnummer").ToString, dis, dr("Id").ToString, dr("Document Location").ToString}, docImage))

                    End While
                    ListView1.Items.AddRange(items.ToArray)
                    ListView1.EndUpdate()
                Else
                    MsgBox("Nothing was found.",, Title)
                End If
                dr.Close()

            End Using

我稍微改变了我的代码。我放了

Using dr as New OleDbDataReader = cmd.ExecuteReader
If dr.HasRows() Then

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-02-19
    • 2014-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-10
    相关资源
    最近更新 更多