【问题标题】:Find the length of an SQL OleDbDataReader查找 SQL OleDbDataReader 的长度
【发布时间】:2012-09-06 08:13:03
【问题描述】:

我有一个 SQL OleDbDataReader 从访问中获取数据到我的 Visual Basic 前端。是否有可能找到读者持有的记录数?因为我想用这个值来结束一个循环。

下面是我的代码。这部分用于查找数据以运行计算并将值重新插入访问。我目前正在使用批处理方法,因为我有超时错误指出代码在一次计算所有数据点以进行计算时花费了太长时间。下面的代码适用于第一批,但在第二批中失败,因为它无法查看阅读器中的下一部分数据。未来数据在阅读器中的顺序可能不正确,因此一次查看所有阅读器是最好的解决方案。要解决此问题,我需要创建 Do Until SearchCounter = the length of the reader。 我尝试将阅读器的内容放入数组中以查找其长度,但这非常耗时。非常欢迎任何其他建议。

For CalcParameterCounter = 0 To CalcParams.GetLength(0) - 1

                ParamQuery = "ID_PAR = " & Format(CalcParams(CalcParameterCounter), "0")
                conditions = ParamQuery ' & UploadQuery

                DatabaseConnection("SELECT " & FieldNames & " FROM " & tablename & " WHERE " & conditions, "Read Recordset"

                CalcDataRecordPointer = 0
                Do Until rdrOLEDB.Read = False
                    SearchCounter = 0
                    Do Until SearchCounter = CalcData.GetLength(1)
                        CalcDataRecordPointer = CalcDataRecordPointer + 1
                        If CalcDataRecordPointer = CalcData.GetLength(1) Then CalcDataRecordPointer = 0
                        Value = rdrOLEDB.Item(1)
                        If CDate(rdrOLEDB.Item(0).ToString()) = CDate(CalcData(0, CalcDataRecordPointer)) Then
                            match = True
                            CalcData(CalcParameterCounter + 1, CalcDataRecordPointer) = rdrOLEDB.Item(1).ToString()
                            Exit Do
                        Else
                            match = False
                        End If
                        SearchCounter = SearchCounter + 1
                    Loop
                Loop
                'Close:
                rdrOLEDB.Close()
                cnnOLEDB.Close()
            Next

【问题讨论】:

  • 通常情况下,甚至 SQL Server 都不知道最后一行是什么,直到您阅读它。如果知道行数很重要,您可以将count() 添加到查询中。预先发送新查询或作为实际查询的一部分。请注意,这会带来性能成本。

标签: sql vb.net visual-studio oledb jet


【解决方案1】:

使用 reader.Read() 是记录集的循环记录方法。我已经在 VBA 和 ADO 中进行了一些编程,其中通过不同的游标类型将在循环之前为您提供记录总数。这确实会影响性能,即因为我使用的是 Excel,并且命令对象必须在读取器启动之前先将记录集放入内存。

虽然 OleDb 是完全可以接受的数据库,但也许看看 ADO 来执行相同的工作,它兼容(从 MDAC2.8 开始)SQL 2000 -> 2008 R2。另一种看待这个问题的方法是看看你是否可以在 SQL 存储过程中进行处理,然后将其输出到你的代码中。

祝你好运。

【讨论】:

  • 感谢您的回答,我想我已经设法通过更改其他地方的代码来解决这个问题。我计划最终更改为 ADO 数据库,但目前更重要的是让一些东西运行以让管理层满意...
猜你喜欢
  • 1970-01-01
  • 2013-04-11
  • 2015-05-21
  • 2020-12-09
  • 2018-07-24
  • 2011-06-23
  • 1970-01-01
  • 2011-08-27
  • 2016-12-20
相关资源
最近更新 更多