[英]Not displaying tally ledgers in datagridview
試圖列出從計數到 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
我很好奇您使用的數據庫需要 ODBC 並且沒有特定的提供程序。
我已將您的代碼分為用戶界面代碼和數據庫代碼。 這使得它更容易維護。
Connection、Command 和 DataReader 等數據庫對象必須關閉並釋放。 Using...End Using
塊即使有錯誤也會處理這個問題。
您可以將CommandText
和Connection
直接傳遞給Command
的構造函數。
更新用戶界面時不要保持連接打開。 相比之下,這是一個漫長的過程,並且太長而無法保持連接打開
這沒有任何意義。 您多次將DataSource
重置為相同的值。 但是,它無論如何都不起作用,因為 DataReader 不是有效的DataSource
。 See 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
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 相同的配置,因為您只需要從代碼中獲取 L ledger 名稱的數據並使用以下代碼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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.