首页 > 解决方案 > 不在 datagridview 中显示计数分类帐

问题描述

试图列出从 tally 到 odbc 的所有分类帐。一无所获。Mycode如下,执行时没有报错。但不将分类帐列表显示到 datagridview1

  Try

        Dim TalCon As OdbcConnection

        TalCon = New OdbcConnection("DSN=TallyODBC_9000;PORT=9000;DRIVER=Tally ODBC Driver;SERVER={(local)}")

        Dim Taldr As OdbcDataReader


        Dim cmd As New OdbcCommand("SELECT $Name FROM Ledger")

        TalCon.Open()

        cmd.Connection = TalCon

        Taldr = cmd.ExecuteReader()
        While Taldr.Read
            DataGridView1.DataSource = Taldr


        End While

        'displaying connection name to verify
        TextBox1.Text = TalCon.ToString

        Taldr.Close()

    Catch ex As Exception
        MsgBox("Master " & vbCrLf & ex.Message)
    End Try




End Sub

标签: vb.netodbctally

解决方案


我很好奇您使用的数据库需要 ODBC 并且没有特定的提供程序。

我已将您的代码分为用户界面代码和数据库代码。这使得它更容易维护。

Connection、Command 和 DataReader 等数据库对象必须关闭并释放。Using...End Using即使有错误,块也会处理这个问题。

您可以将CommandTextandConnection直接传递给Command.

更新用户界面时不要保持连接打开。相比之下,这是一个漫长的过程,并且太长而无法保持连接打开

这没有任何意义。您将DataSource多次重置为相同的值。但是,它无论如何都不起作用,因为 DataReader 不是有效的DataSource. 请参阅https://docs.microsoft.com/en-us/dotnet/api/system.windows.forms.datagridview.datasource?view=netframework-4.8&f1url=%3FappId%3DDev16IDEF1%26l%3DEN-US%26k%3Dk (System.Windows.Forms.DataGridView.DataSource)%3Bk(TargetFrameworkMoniker-.NETFramework%2CVersion%253Dv4.8)%3Bk(DevLang-VB)%26rd%3Dtrue#remarks

While Taldr.Read
            DataGridView1.DataSource = Taldr
End While

如果您所做的Catch只是显示一个消息框,请在用户界面中显示它。

Private ConStr As String = "DSN=TallyODBC_9000;PORT=9000;DRIVER=Tally ODBC Driver;SERVER={(local)}"

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    Try
        DataGridView1.DataSource = GetNames()
    Catch ex As Exception
        MessageBox.Show(ex.Message)
    End Try
End Sub

Private Function GetNames() As DataTable
    Dim dt As New DataTable
    Using cn As New OdbcConnection(ConStr),
        cmd As New OdbcCommand("SELECT $Name FROM Ledger", cn)
        cn.Open()
        Using reader = cmd.ExecuteReader
            dt.Load(reader)
        End Using
    End Using
    Return dt
End Function

推荐阅读