【问题标题】:Unexpected result from Query run from VBA从 VBA 运行查询的意外结果
【发布时间】:2009-08-27 13:57:38
【问题描述】:

以下代码有问题:

Set con = Application.CurrentProject.Connection
    Set rs = CreateObject("ADODB.Recordset")
    stSql = "SELECT * FROM [SB Items] "
    stSql = stSql & "WHERE [SBID]=" & Me![SBID] & " AND [ItemNumber]=" & intBtn
    rs.Open stSql, con, 1    ' 1 = adOpenKeyset

    ' If no item matches, report the error and exit the function.
    If (rs.EOF) Then
        MsgBox "There was an error reading the SB Items table."
        rs.Close
        Set rs = Nothing
        Set con = Nothing
        Exit Function
    End If

自从我在 stSql 中执行上述 sql 命令后,结果只有一行

控件将进入错误块

并弹出消息框“读取 SB 项目表时出错”

【问题讨论】:

  • What do Me![SBID] 和 intBtn 在您尝试运行此程序时是否相等?另外,SBID 和 ItemNumber 的类型是什么?
  • 两者都是整数,我尝试运行它创建一个查询,结果是一行
  • 实际提问可能会做得更好。
  • 在 OPEN 之前添加“Debug.Print stSql”,然后尝试将即时窗口的输出粘贴到新查询中,看看得到什么结果。

标签: sql ms-access vba


【解决方案1】:

使用此代码查看您返回了多少条记录。

if rs.Supports(adApproxPosition)=true then
  i=rs.RecordCount
  MsgBox "The number of records is: " & i
end if
'
' If no item matches, report the error and exit the function.
If (rs.EOF) Then
'and on as you have it

另外,如果有任何信息,请返回 err.desc 以获取更多信息。

最后,检查 Con 是否已附加到您认为正在使用的数据库中!

【讨论】:

  • (抱歉那里的布局不好 - 我是新来的!)
  • 此后没有弹出消息框
【解决方案2】:

您没有错误块,您可以检查 rs.eof。

我倾向于使用

检查零行
if (rs.eof) and (rs.bof)..

因为这个条件只有在记录集为空的情况下才成立,而不仅仅是当指针不在您期望的位置或胖游标仍在填充时。

您确定代码没有完全按照设计的方式执行并在没有行时显示消息吗?

尝试使用 debug.print stSQL 以获取正在运行的实际查询,并尝试直接针对数据库运行该查询。这将确认两件事:

  1. 查询的形成方式如您所愿,包括您从表单中提取的值
  2. 表中的数据实际上包含了应该被捕获的行。

【讨论】:

  • (rs.bof) 进行了任何更改,我在数据库中运行了查询,结果是一条记录
  • 我添加了 rs.bof) 但仍然没有乐趣
  • 当您说您运行查询时,您是使用存储在 stSQL 中的确切值还是手动重新创建查询。我认为最可能的问题是 stSQL 在到达 rs.open 行时不包含您认为它所做的事情。
  • 还有几件事要尝试: 3. 在第一行添加“On Error goto 0”,如果确实有错误,它会抛出一个错误对话框。 (完成故障排除后不要留下它)。 4.在rs.open之前的那行添加一个debug.print stSQL,看看它打印到调试窗口的内容(ctrl-g打开调试窗口)
  • SELECT * FROM [SB Items] WHERE [SBID]=14 AND [ItemNumber]=1 SELECT * FROM [SB Items] WHERE [SBID]=9 AND [ItemNumber]=6 SELECT * FROM [ SB Items] WHERE [SBID]=14 AND [ItemNumber]=4 SELECT * FROM [SB Items] WHERE [SBID]=2 AND [ItemNumber]=1
【解决方案3】:

两件事:

  1. 我注意到您设置了两次 stSQL,我猜是因为换行的原因。更简单的方法是使用“_”(空格后跟下划线)。这使您可以将命令转移到下一行。

  2. 从以下位置更改您的 Msgbox 错误:
    MsgBox "读取 SB Items 表时出错。"
    到:
    Msgbox "错误:" & err.desc

编辑:err.desc 为您提供生成的确切错误代码。它并不总是有帮助,但它是你能得到的最好的。

【讨论】:

  • 好点。此外,基于代码“读取 SB 项目表时出错”。不管是否发生错误,如果在表中根本没有相关行,它就会显示在此处,无论如何,这是一个不好的消息。
  • 这个建议是错误的。 Err.desc 不会有任何内容,因为没有抛出错误。
  • 不,这是个好建议,因为 rs.EOF 仅表示您处于最后一条记录(即:EOF),而不是 MsgBox 暗示的错误。
  • 对。因此,在消息框上添加 err.desc 不会显示任何内容,因为那里没有错误,除非他打开未指示的内联错误处理。
  • 避免在 VBA 代码中出现换行符——它会导致特定形式的不可恢复的损坏。我一直希望 VBA 有一个 .= append 运算符,所以你可以执行 strSQL .= "..." 并且右侧将附加到变量中已经存在的任何内容。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-03-06
  • 1970-01-01
  • 2019-05-04
  • 1970-01-01
  • 2023-03-05
  • 2010-11-25
  • 2020-09-17
相关资源
最近更新 更多