Access交流中心

北京 | 上海 | 天津 | 重庆 | 广州 | 深圳 | 珠海 | 汕头 | 佛山 | 中山 | 东莞 | 南京 | 苏州 | 无锡 | 常州 | 南通 | 扬州 | 徐州 | 杭州 | 温州 | 宁波 | 台州 | 福州 | 厦门 | 泉州 | 龙岩 | 合肥 | 芜湖 | 成都 | 遂宁 | 长沙 | 株洲 | 湘潭 | 武汉 | 南昌 | 济南 | 青岛 | 烟台 | 潍坊 | 淄博 | 济宁 | 太原 | 郑州 | 石家庄 | 保定 | 唐山 | 西安 | 大连 | 沈阳 | 长春 | 昆明 | 兰州 | 哈尔滨 | 佳木斯 | 南宁 | 桂林 | 海口 | 贵阳 | 西宁 | 乌鲁木齐 | 包头 |

【求助】用DAO的Recordset对象打开数据后,再用它为窗体的Recordset属性赋值会使Access没有响应,百思不得其解,求大神指点

年杰  发表于:2018-01-06 11:19:23  
复制

老师们好,偶然遇到一个问题,结果自己怎么想都无法解决,不得不来求助,在此先谢过。

问题描述:

我像往常一样用DAO的Recordset对象打开一个表的数据,然后再用这个Recordset对象向一个窗体的子窗体的Recordset属性赋值。但是问题来了,当我多次重复这项操作时,会导致Access没有响应(或者说停止工作);

在实验中我发现,只要我查找的内容是该表的第一条数据(“青椒鸡蛋”)时,不用多次点击,只要一次,Access也会直接停止响应;


代码如下:


Private Sub Command_查找_Click()

Dim Db As DAO.Database
Dim Rst As DAO.Recordset
Dim StrSQL As String

StrSQL = "select 菜品ID,菜品名称,菜品价格 from T0030_菜品价目表 " & _
         "where 菜品名称 like '*" & Me.Text_查找 & "*'"

Set Db = CurrentDb()

Set Rst = Db.OpenRecordset(StrSQL, dbOpenDynaset, dbReadOnly)

With Me.Child_修改明细
  
    If Rst.BOF Then
        Exit Sub
    End If


    .SourceObject = "F_子窗体_修改明细"
    .Form.Text_菜品名称.ControlSource = "菜品名称"
    .Form.Text_菜品价格.ControlSource = "菜品价格"
    
    Set .Form.Recordset = Rst
    
End With

Set Rst = Nothing

End Sub


自己实验的发现:

我自己在对比实验中发现,似乎和引用的数据是数据集中的第一条数据后很大的关系。如果我删除SQL里的where条件时,不会出现这种问题。但是这段代码又是我之前常用的代码,以前都没事结果这次出现这种问题,实令人费解。我又怀疑是子窗体的某些属性设置有问题,但是并没有找到什么可疑的差错。这个问题已经困扰我几天了,实在是想不出答案,如果解决不了恐怕我得放弃DAO改用ADO(ADO不会出现这种问题),所以真心请求知道答案的好心人不吝赐教,在此万分感谢!!!


以下是原件:

点击下载此附件

 

Top
仙来 发表于:2018-01-06 12:05:10

我测试并没有你说的现象。建议刷新一下子窗体



年杰 发表于:2018-01-06 12:32:35
@仙来,_(:з」∠)_谢谢老师的回复,起先我也认为可能跟电脑有关,我用的的Access2010,而且在单位和家里的电脑都出现了这个问题,所以我也不确定是不是系统原因,总之诡异无比。另外我试了用form.requery刷新窗体,但是仍旧会没有响应。。。

西出阳关无故人 发表于:2018-01-08 16:47:37

修改代码如下:

Private Sub Command_查找_Click()
    On Error GoTo err
    Dim Db As DAO.Database
    Dim Rst As DAO.Recordset
    Dim StrSQL As String
    '当“Me.Text_查找”文本框为空时,StrSQL的运算结果是“select 菜品ID,菜品名称,菜品价格 from T0030_菜品价目表 where 菜品名称 like '**'”,这样会出错。
    If Trim(Nz(Me.Text_查找, "")) <> "" Then
        StrSQL = "select 菜品ID,菜品名称,菜品价格 from T0030_菜品价目表 " & _
                 "where 菜品名称 like '*" & Me.Text_查找 & "*'"
    Else
        StrSQL = "select 菜品ID,菜品名称,菜品价格 from T0030_菜品价目表 "
    End If
    Set Db = CurrentDb()
    Set Rst = Db.OpenRecordset(StrSQL, dbOpenDynaset, dbReadOnly)
    With Me.Child_修改明细
        If Rst.BOF Then
            Exit Sub
        End If
        .SourceObject = "F_子窗体_修改明细"
        Set .Form.Recordset = Rst '调整顺序,即:先确定窗体的数据源,然后才确定控件的来源
        .Form.Text_菜品名称.ControlSource = "菜品名称"
        .Form.Text_菜品价格.ControlSource = "菜品价格"
    End With
    Set Rst = Nothing
    Exit Sub
err:
    MsgBox err.Number & ":" & err.Description
End Sub
就再也不出现错误了。



年杰 发表于:2018-01-10 09:56:26

@西出阳关无故人,谢谢老师的指点,完美的解决了我遇到的问题。刚刚才看到,所以回复晚了,十分抱歉。

有些疑惑,在之前我自己的实验中也曾将指定窗体数据源放在指定控件来源前,但是仍旧会没有响应。“where 菜品名称 like '**'”的写法看起来确实不太规范,但似乎也讲得通,之前我也多次使用这种方式,唯有这次遇到了问题。

从老师的解决方法来看,是一种标准的规范式写法,但是单纯从代码上看来,我还是不清楚旧代码到底是怎么导致没有响应的。所以我猜测,是不是因为旧代码这种不规范的格式可能会偶尔触发某些BUG,而什么时候会触发这种BUG就有些看脸了,理由如下:

我自己在后来的实验中发现,我家里的电脑和单位电脑虽然都会没有响应,但实际上是因为我在这两台电脑上都是从同一个安装包里的Office2010安装的。当我将自己家的电脑升级到Office2016后,问题就不再出现了。而且我在同事的电脑的Access2007上实验时,发现也不会触发这个问题。

还有一个奇怪的是,当我将原来的子窗体删除,重新创建一个一模一样的子窗体时,即使代码一个字不改,也不会触发这个问题。我甚至将两个子窗体的所以属性(Access设计视图界面里的)打印出来一个个对比,发现即使这两个子窗体的所有属性全都一模一样,但是旧的窗体就是会出错,而新的窗体就不会出错,实在是太匪夷所思了。。。

说这么多并不是鸡蛋里面挑骨头,只是虽然知道解决问题的方法,但是对其中的原因一无所知,始终让我觉得有些遗憾。再次感谢老师的指点,如果老师能够再简单说一下产生没有响应的原因(是不是像我猜测的一样,不规范的写法会触发某些BUG),那就太好了。



西出阳关无故人 发表于:2018-01-10 14:07:38
具体的原因我也不知道啊,只是也曾经遇到过同样的问题。

年杰 发表于:2018-01-10 15:48:50
@西出阳关无故人,谢谢老师的回复,确实是个挺操蛋的问题,哈哈哈

总记录:6篇  页次:1/1 9 1 :