繁体   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