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

标签 mysql .net f# ado.net

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

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

到目前为止,我的搜索主要是通过位于 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 连接器有更优雅的可用解决方案,我宁愿不这样做.

更新

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

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"])} }

最佳答案

我认为您正在寻找 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

关于mysql - 如何使用 MySQL .net 连接器为大型数据集流式传输结果集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25732592/

相关文章:

MySQL 语句在不使用数据透视函数或联合的情况下对表进行数据透视

mysql - 需要帮助安装 mysql 服务器 v5.6

.net - 从 .NET 访问另一个盒子上的 COM 对象(不推荐使用 DCOM,远程处理)

F# 隐藏东西?

mysql - 将记录匹配到今天时出现 SQL 语法错误

mysql - Laravel 代客 Linux : Can't connect MariaDB/Mysql

.net - 如何控制 .NET 服务引用的文件名?

.net - 首次安装后如何检查 ClickOnce 先决条件?

F#:通过模式匹配返回列表列表时出现问题?

f# - 是否可以在 F# 中转发可选参数