【问题标题】:recordset.movefirst "Rowset position cannot be restarted"recordset.movefirst "行集位置无法重新启动"
【发布时间】:2014-03-12 15:29:17
【问题描述】:

我有一个运行存储过程的函数,它只返回一行和一列(所以一个结果)。

我正在尝试将那个结果放入一个变量中,以便我可以返回它。我正在尝试使用recordset.MoveFirst,但我得到“行集位置无法重新启动”。错误。我试着删除它,因为我只有一个结果,但是我得到了溢出。我的陈述是这样的:

If recordset.EOF = False Then
    recordset.MoveFirst
    temp = rs!ID 
 End IF

temp 是一个整数。我检查了存储过程以确保它只返回单个结果,并且确实如此。难道我做错了什么?有没有更好的方法将结果传递给变量?记录集可能是只转发的(这意味着它是只读的?)但我似乎无法找到如何解决这个问题的答案。

【问题讨论】:

    标签: vba excel ado


    【解决方案1】:

    如果您之前没有浏览过记录集,通常没有理由MoveFirst

    overflow 与数据库代码无关,是由 rs!ID 不适合 VBA integer(16 位)引起的,因此将 temp 改为 Long(32 位)并删除 @987654327 @。

    【讨论】:

    • 做到了!谢谢。你能解释一下为什么integer 不起作用吗?是ADOSQL 的问题吗?
    • VBA 有老根,它的integer 类型只有 16 位大小,这意味着它只能存储 +/-32767 范围内的数字。如果您尝试为其分配更大的值,它将overflowLong 类型为 32 位宽,因此具有更大的范围(2140000000 和变化)。 Long 的大小与大多数数据库 Int 类型兼容。
    【解决方案2】:

    确保您没有使用只进记录集。记录集默认采用这种方式。而是使用动态 (adOpenDynamic) 或静态 (adOpenStatic) 游标类型。

    您可能还需要设置CursorLocation = adUseClient

    最后,在调用MoveFirst之前检查BOF

    例子:

    ...
    rs.CursorType = adOpenStatic
    rs.CursorLocation = adUseClient
    rs.Open "SELECT * FROM MyTable"
    ...
    
    If (Not rs.BOF) Then
        rs.MoveFirst
    End If
    

    【讨论】:

      【解决方案3】:

      只有在 EOF 时,才能将 MoveFirst 用于仅转发记录集。 棘手,无证,但有效!!!!

      【讨论】:

      • 未记录的行为不保证会随着新版本的发布而延续,因此请买家注意。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多