【发布时间】:2014-02-24 19:04:48
【问题描述】:
我目前的情况是我有一个非常大的记录集(大约 200 万条记录)我正在尝试使用 .Net 和 Oracle.DataAccess.dll 库(版本 2.112.2.0)从 oracle 数据库中查询。
Imports Oracle.DataAccess.Client
Imports Oracle.DataAccess
...在我的程序中:
Dim conn As New OracleConnection()
... connect to DB, etc (this all works fine) ...
Dim strSQLQuery = (Query for large recordset)
Dim cmd = New OracleCommand(strSQLQuery, conn)
Using Reader As OracleDataReader = cmd.ExecuteReader()
...
End Using
现在,此过程适用于较小的查询,但对于这个大型查询,它似乎无限期挂起(我已经等了一夜,然后最终退出程序)在 Using.. 行上,甚至没有进入 using 语句中的代码行......它似乎根本没有做任何事情。
起初,我认为这可能是我的查询本身的问题,但是当我尝试使用 SQL Navigator 运行它时,它会在不到 10 分钟内返回记录集...
我做错了吗?这是正常的吗?我可以设置一个设置来使OracleDataReader 不挂起吗?
此外,即使这段代码是用 VB 编写的,我对 C# 也同样满意。
【问题讨论】:
-
SQL Navigator 是否真的返回所有值?他们可能会包装你的 sql 语句,只得到前 100 个结果之类的东西。
-
它返回前250,然后您可以单击以继续获取越来越多...如果我选择将其下载到分隔的文本文件中,需要一段时间,但它会减少超过 30 分钟左右...
-
也许您机器上的网络缓冲区已满?如果是这样,也许您可以简单地将查询分解为多个较小的查询?
-
网络缓冲区是数据保存的地方,直到您开始读取它。msdn.microsoft.com/en-us/library/ms254931(v=vs.110).aspx
-
感谢@smoore,我尝试将其分解为较小的查询,但它仍然挂起......也许我需要进一步分解它......有什么办法可以强制网络缓冲区,一旦达到该大小,启动数据读取器,然后刷新它并获取更多数据或您知道的类似数据??
标签: c# .net vb.net oracle datareader