【问题标题】:`The select command property has not been initialized before calling 'Fill'` in vb.net`在 vb.net 中调用 'Fill' 之前未初始化选择命令属性
【发布时间】:2019-10-20 18:50:15
【问题描述】:

我的代码缺少什么?我观看了教程的每一步。

我试了很多次还是出现这个错误:

Private Sub Retrieve()
        ListView1.Items.Clear()

        Dim sql As String = "SELECT * FROM tblpayin"
        cmd = New OleDbCommand(sql, con)

        Try
            con.Open()
            adapter.Fill(dt)

            For Each row In dt.Rows
                populate(row(1), row(2), row(3), row(4), row(5), row(6), row(7), row(8), row(9), row(10), row(11), row(12), row(13), row(14), row(15), row(16), row(17), row(18), row(19), row(20), row(21), row(22))
            Next
            dt.Rows.Clear()
            con.Close()

        Catch ex As Exception
            MsgBox(ex.Message)
            con.Close()

        End Try

    End Sub

Private Sub populate(ID As String, FN As String, MN As String, LN As String, AD As String, CN As String, MD As String, PC As String, AM As String, TE As String, M1 As String, M2 As String, M3 As String, M4 As String, M5 As String, M6 As String, M7 As String, M8 As String, M9 As String, M10 As String, M11 As String, M12 As String)

        Dim row As String() = New String() {ID, FN, MN, LN, AD, CN, MD, PC, AM, TE, M1, M2, M3, M4, M5, M6, M7, M8, M9, M10, M11, M12}
        Dim item As ListViewItem = New ListViewItem(row)
        ListView1.Items.Add(item)

    End Sub

我想从 MS Access 数据库中加载列表视图中的数据

【问题讨论】:

  • 您正在创建一个OleDbCommand 对象,然后在adapter 上调用Fill。您在哪里创建 adaptercmd 之间的关联?
  • 鉴于错误消息明确告诉您 SelectCommand 属性尚未设置,您认为您应该如何处理包含“SELECT”语句的命令?网络上没有任何示例会告诉您做您正在做的事情,因此请阅读一些示例并按照它们实际告诉您的去做。
  • 实际上没有必要创建该命令。数据适配器构造函数将接受“SELECT”语句作为参数并在内部创建命令。它甚至会接受一个连接字符串并在内部创建一个连接。您应该花一些时间阅读相关类的文档。
  • 下次也不要使用row(1), row(2)... 只需使用 i = 1 到 22 的另一个 for 循环并执行 row(i)

标签: vb.net


【解决方案1】:

尽量将用户界面代码与数据访问代码分开。 Retrieve 方法不知道数据的去向,populate 也不知道数据的来源。

连接需要关闭和处理。 Using...End Using 块即使有错误也会处理这个问题。命令对象也属于这一类。您可以将两者都包含在一个 Using 块中。

当您填充 ListView 时,您不希望在添加每一行后重新绘制屏幕。如果有很多行,那可能会非常慢。将 ListViewItems 添加到 List(Of ListViewItem) 中,然后使用包含在 .BeginUpdate... .EndUpdate 中的 .AddRange 方法一次将它们全部添加。

Private Function Retrieve() As DataTable
    Dim dt As New DataTable
    Try
        Using con As New OleDbConnection("Your connection string"),
            cmd As New OleDbCommand("SELECT * FROM tblpayin", con)
            con.Open()
            dt.Load(cmd.ExecuteReader)
        End Using
    Catch ex As Exception
        MsgBox(ex.Message)
    End Try
    Return dt
End Function

Private Sub populate()
    ListView1.Items.Clear()
    Dim dt = Retrieve()
    Dim lst As New List(Of ListViewItem)
    For Each row As DataRow In dt.Rows
        Dim li As New ListViewItem({row(1).ToString, row(2).ToString, row(3).ToString, row(4).ToString, row(5).ToString, row(6).ToString, row(7).ToString, row(8).ToString, row(9).ToString, row(10).ToString, row(11).ToString, row(12).ToString, row(13).ToString, row(14).ToString, row(15).ToString, row(16).ToString, row(17).ToString, row(18).ToString, row(19).ToString, row(20).ToString, row(21).ToString, row(22).ToString})
        lst.Add(li)
    Next
    dt.Dispose()
    ListView1.BeginUpdate()
    ListView1.Items.AddRange(lst.ToArray)
    ListView1.EndUpdate()
End Sub

【讨论】:

  • 你甚至可以在DataTable上使用UsingUsing dt As DataTable = Retrieve()
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多