未在数据网格视图中显示理货分类账



尝试通过odbc列出来自tally的所有分类账。一无所获。支原体如下,执行时没有错误。但不将分类账列表显示到数据网格视图1 中

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

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

我将您的代码分为用户界面代码和数据库代码。这使其更易于维护。

数据库对象(如Connection、Command和DataReader(必须关闭并释放。即使出现错误,Using...End Using块也会处理此问题。

您可以将CommandTextConnection直接传递给Command的构造函数。

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

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

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

即使您的问题已经解决,我仍在回复线程由于您使用的ODBC连接依赖于ODBC驱动程序,如果你改变系统或想使用多个系统,你会遇到问题

从理货中获取数据的更好方法是使用XML API,您不需要更改任何配置—您可以使用与ODBC相同的配置由于您只需要分类帐名称,您可以使用以下代码从a2获取分类帐名称并过账到数据在<SVCURRENTCOMPANY>ABC Company</SVCURRENTCOMPANY>标记中更改XML中的公司名称即使有多家公司开业,它也会从目标公司获取数据

Public Sub GetTallyLedgersList()
Dim xmlhttp As New MSXML2.XMLHTTP60, myurl As String
Dim objXML As New MSXML2.DOMDocument60
myurl = "http://localhost:9000"
xmlhttp.Open "POST", myurl, False
xmlhttp.send "<ENVELOPE><HEADER><VERSION>1</VERSION>
<TALLYREQUEST>Export</TALLYREQUEST><TYPE>Data</TYPE><ID>List Of Ledgers</ID></HEADER><BODY><DESC><STATICVARIABLES><SVEXPORTFORMAT>$$SysName:XML</SVEXPORTFORMAT><SVCURRENTCOMPANY>ABC Company</SVCURRENTCOMPANY></STATICVARIABLES>" & _
"<TDL><TDLMESSAGE><REPORT ISMODIFY=""No"" ISFIXED=""No"" ISINITIALIZE=""No"" ISOPTION=""No"" ISINTERNAL=""No"" NAME=""List Of Ledgers""><FORMS>List Of Ledgers</FORMS></REPORT><FORM ISMODIFY=""No"" ISFIXED=""No"" ISINITIALIZE=""No"" ISOPTION=""No"" ISINTERNAL=""No"" NAME=""List Of Ledgers"">" & _
"<TOPPARTS>List Of Ledgers</TOPPARTS><XMLTAG>ListOfLedgers</XMLTAG></FORM><PART ISMODIFY=""No"" ISFIXED=""No"" ISINITIALIZE=""No"" ISOPTION=""No"" ISINTERNAL=""No"" NAME=""List Of Ledgers""><TOPLINES>List Of Ledgers</TOPLINES><REPEAT>List Of Ledgers : FormList Of Ledgers</REPEAT><SCROLLED>Vertical</SCROLLED>" & _
"</PART><LINE ISMODIFY=""No"" ISFIXED=""No"" ISINITIALIZE=""No"" ISOPTION=""No"" ISINTERNAL=""No"" NAME=""List Of Ledgers""><LEFTFIELDS>NAME</LEFTFIELDS></LINE><FIELD ISMODIFY=""No"" ISFIXED=""No"" ISINITIALIZE=""No"" ISOPTION=""No"" ISINTERNAL=""No"" NAME=""NAME""><SET>$NAME</SET><XMLTAG>NAME</XMLTAG></FIELD>" & _
"<COLLECTION ISMODIFY=""No"" ISFIXED=""No"" ISINITIALIZE=""No"" ISOPTION=""No"" ISINTERNAL=""No"" NAME=""FormList Of Ledgers""><TYPE>Ledger</TYPE></COLLECTION></TDLMESSAGE></TDL></DESC></BODY></ENVELOPE>"
Set objXML = New MSXML2.DOMDocument60
k = xmlhttp.responseText
If Not objXML.LoadXML(k) Then  'strXML is the string with XML'
Err.Raise objXML.parseError.ErrorCode, , objXML.parseError.reason
End If
Set Nameslist = objXML.SelectNodes("//LISTOFLEDGERS/NAME")

Count = 2
ActiveSheet.Cells(1, 1).Value = "Ledger Names"
For Each Name In Nameslist
s = Name.nodeTypedValue
ActiveSheet.Cells(Count, 1).Value = s
Count = Count + 1
Next
End Sub

最新更新