在VB.NET中读取非常大的数据库表的最佳方法是什么?

时间:2011-04-22 03:24:26

标签: vb.net

我正在开发一个VB.NET应用程序来从任何数据源获取数据(使用odbc连接字符串),因为我不能使用特定的.net连接器,如MySql.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语句)。

对不起,如果有什么不可理解的话。

2 个答案:

答案 0 :(得分:0)

也许尝试设置ConnectionTimeout属性?尝试在cnn.open()调用之前添加此行:

cnn.ConnectionTimeout =  50000  ' Number of seconds before timeout

答案 1 :(得分:0)

当我遇到类似问题时,我的解决方案是添加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

这是一个快速的黑客攻击,如果你想使用任何数据源,迟早你需要一些数据库抽象层。

相关问题