簡體   English   中英

在VB.NET中讀取大型數據庫表的最佳方法是什么?

[英]What's the best way to read a very large database table in VB.NET?

我正在開發一個VB.NET應用程序以從任何數據源獲取數據(使用odbc連接字符串),並且因為這我無法使用MySql.Net連接器之類的特定.net連接器,而且我以前無法知道文件/ DMBS支持LIMIT參數。 此應用將從數據源中的表中讀取數據,並使用該信息制作一些文件。 此時,某些表沒有問題,因為它們的記錄長度小於3,000,000,但是有一個表具有5,000,000+行的長度,並且當我發送查詢時,連接丟失了。 我正在使用OdbcDataReader,因為我在MSDN站點上讀到,這是一次一次讀取一個表的最佳方法,而我只使用每條記錄一次。

這是我的代碼的示例:

Private Sub ReadData()
   dim cnn as odbc.odbcConnection
   dim coma as odbc.odbcCommand
   dim reg as odbc.odbcDataReader
   try
      cnn=new odbc.odbcConnection("Driver={MySQL ODBC 3.51 Driver}; server=localhost; Database=datos; User=usuario; Password=contrasenia; option=3;")
      cnn.open()
      coma=new odbc.odbcCommand("select * from tabla")
      reg=coma.ExecuteReader()'<- when this line is executed fails with the 5,000,000+ length table.
   catch ex as Exception
      MessageBox("Error: "+ex.Message,MsgBoxStyle.Critical,"Error")
   end try
   ... 'Do anything with the data
end sub

在VBA或VB6中,我執行以下操作:

Private Sub ReadData()
   dim cnn as object
   dim tab as object
   set cnn = CreateObject("ADODB.Connection")
   set tab = CreateObject("ADODB.Recordset")
   cnn.cursorlocation=3
   cnn.open "Driver={MySQL ODBC 3.51 Driver}; server=localhost; Database=datos; User=usuario; Password=contrasenia; option=3;"
   tab.open "tabla", cnn,,2
   ...'Do anything with the data
end sub

並且此代碼執行沒有問題。

知道如何在VB.NET中以更有效的方式檢索數據嗎? 或有任何方法可以像ADODB一樣(僅指示表名而不是SQL語句)。

抱歉,如果無法理解。

也許嘗試設置ConnectionTimeout屬性? 嘗試在cnn.open()調用之前添加以下行:

cnn.ConnectionTimeout =  50000  ' Number of seconds before timeout

當我遇到類似的問題時,我的解決方案是添加LimitQuery函數,該函數添加了要查詢的關鍵字以限制結果的數量,具體取決於提供程序。

像這樣:

Public Function LimitQuery(ByVal query As String, ByVal RowLimit As Integer) As String
    If RowLimit > 0 Then    
        Select Case m_DbType    
            Case DbType.Oracle    
            return "SELECT * FROM(" & query & ") WHERE ROWNUM<" & cstr(RowLimit + 1)
            Case DbType.SQLServer    
                return Replace(query, "SELECT", "SELECT TOP " & cstr(RowLimit), 1, 1)
            Case DbType.MySQL
                return query & " LIMIT " & cstr(RowLimit)
        End Select    
    Else
        return query    
    End If
End Function

這是一個快速的技巧,如果您想早晚使用任何數據源,則需要一些數據庫抽象層。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM