如何使用MySQL .net连接器为大型数据集传输结果集

时间:2014-09-08 20:25:00

标签: mysql .net f# ado.net

我需要从MySQL服务器检索大型数据集以进行处理。 我正在使用MySQL .net连接器,因为消耗数据的应用程序是用F#编写的。数据集太大而无法容纳到内存中,因此我希望避免将原始数据完全保存在内存中,并在数据库服务器从数据库服务器流入应用程序时对其进行操作。

我已经读过这可以通过使用JDBC API a Streaming large result sets with MySQLhttp://dev.mysql.com/doc/connector-j/en/connector-j-reference-implementation-notes.html中的ResultSet属性来完成,但我没有找到类似的.Net API。< / p>

到目前为止,我的搜索主要是通过http://dev.mysql.com/doc/connector-net/en/connector-net-programming.html的MySQL文档进行的,但这并没有发现任何事情(至少对我来说没什么了不起)。

我如何完成我想要做的事情?

更新

有关我的限制的一些细节。

我只有对数据源的读取权限,因为它是由第三方管理的,所以在服务器端进行任何更改都是不行的。

以下是我推送到服务器的查询:

SELECT
      SID.dwsi_store AS 'store'
     ,SID.dwsi_transaction_date AS 'transactionDate'
     ,SID.dwsi_transaction AS 'transaction'
     ,SID.dwsi_item AS 'sku'
     ,C.dwcl_class AS 'clss'
     ,D.dwde_department AS 'department'
 FROM
     dw_sls_item_dtl SID
 JOIN
     dw_item I
 JOIN
     dw_class C
 JOIN
     dw_department D
 ON
         SID.dwsi_store = I.dwin_store
     AND SID.dwsi_item = I.dwin_item_number
     AND I.dwin_store = C.dwcl_store
     AND I.dwin_class = C.dwcl_class
     AND I.dwin_store = D.dwde_store_number
     AND I.dwin_department = D.dwde_department
 WHERE
         SID.dwsi_transaction_date >= '2007-03-01'
     AND SID.dwsi_store BETWEEN '2' AND '8'
     AND NOT C.dwcl_class = ''
     AND NOT C.dwcl_class_name LIKE('%CCL''d%')
     AND D.dwde_department BETWEEN '10' AND '92'

虽然我可以通过参数化where子句并一次检索一个日期来手动翻阅数据,但如果MySQL连接器有更优雅的解决方案,我宁愿不这样做

更新

这是调用数据库服务器的代码。它使用ExecuteReader方法返回DbDataReader。现在我想起来了,问题可能是我正在将所有内容都读成序列而不对其进行操作。看来这个问题与我如何实现读者有关,而不是与读者本身有关。

use cn = new MySqlConnection(cs)
use cmd = new MySqlCommand(sql,cn)
cmd.CommandType = CommandType.Text |> ignore
cn.Open()
use reader = cmd.ExecuteReader()
while reader.Read() do
    yield { store = unbox (reader.["store"])
            transactionDate = unbox (reader.["transactionDate"])
            transaction = unbox (reader.["transaction"])
            sku = unbox (reader.["sku"]) 
            clss = unbox(reader.["clss"])
            department = unbox(reader.["department"])} }

1 个答案:

答案 0 :(得分:1)

我认为您正在寻找DbDataReader的派生类;可能是OdbcDataReader或OleDbDataReader。这些类提供对结果集的仅向前访问。有关详细信息,请参阅以下链接:

http://msdn.microsoft.com/en-us/library/haa3afyz(v=vs.110).aspx(“检索大量数据时,DataReader是一个不错的选择,因为数据没有缓存在内存中。”)

http://msdn.microsoft.com/en-us/library/system.data.common.dbdatareader(v=vs.110).aspx

http://msdn.microsoft.com/en-us/library/system.data.odbc.odbcdatareader(v=vs.110).aspx

http://msdn.microsoft.com/en-us/library/system.data.oledb.oledbdatareader(v=vs.110).aspx