我需要从MySQL服务器检索大型数据集以进行处理。 我正在使用MySQL .net连接器,因为消耗数据的应用程序是用F#编写的。数据集太大而无法容纳到内存中,因此我希望避免将原始数据完全保存在内存中,并在数据库服务器从数据库服务器流入应用程序时对其进行操作。
我已经读过这可以通过使用JDBC API a Streaming large result sets with MySQL和http://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"])} }
答案 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