我正在开发一个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语句)。
对不起,如果有什么不可理解的话。
答案 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
这是一个快速的黑客攻击,如果你想使用任何数据源,迟早你需要一些数据库抽象层。