注册 登录
编程论坛 VB6论坛

关于adodc控件操作会错误更新其他字段的求解

w360989426 发布于 2014-03-07 22:56, 1191 次点击
使用到的控件:datagrid1,datagrid2,adodc1,adodc2,
datagrid1的datasource是 adodc1
datagrid2的datasource是 adodc2
图1
只有本站会员才能查看附件,请 登录

datagrid1.选中要查看的订单编号 按下enter键盘会跳出datagrid2如下图2,请注意上图第一行的订单编号为100001
图2
只有本站会员才能查看附件,请 登录

此图2为datagrid2的明细,按下esc的时候,datagrid2会隐藏,显示datagrid1,如下图3,问题出现了
图3
只有本站会员才能查看附件,请 登录
请看图3,当esc后datagrid2隐藏后,datagrid1显示后,第一行的订单编号变成了上次查看明细的订单编号
注:datagrid1.allowedupdate 是false
数据库中的数据也被更改了。。不知为什么,请求指教,万分感谢!!!
只有本站会员才能查看附件,请 登录
只有本站会员才能查看附件,请 登录
15 回复
#2
lowxiong2014-03-07 23:43
DataGrid1_KeyDown事件修改如下:
Private Sub DataGrid1_KeyDown(KeyCode As Integer, Shift As Integer)
    订单编号 = DataGrid1.Columns("订单编号").Value
    酒店名称 = DataGrid1.Columns("酒店名称").Value
    厨房 = DataGrid1.Columns("厨房").Value
    Adodc1.Recordset.Close
    Adodc1.Recordset.CursorLocation = adUseServer
    Adodc1.Refresh
    If KeyCode = 13 Then '以下是在datagrid1上选定按下enter的情况
   

        sql1 = "select 订单表.酒店货物名称,订单表.转换酒店单价 as 单价,订单表.送货单数量,订单表.酒店单位,订单表.备注 from 订单表,订单编号表头 where 订单表.id_编号=订单编号表头.id_编号 and 订单编号 ='" & 订单编号 & "' order by id_订单"
        Adodc2.RecordSource = sql1
        Adodc2.Refresh
        Set DataGrid2.DataSource = Adodc2
        DataGrid2.Visible = True
        Label7.Caption = "订单编号:" & 订单编号
        Label3.Caption = "酒店名称:" & 酒店名称
        Label4.Caption = " 厨房:" & 厨房
        Frame3.Visible = True
        Call 初始化datagrid2
        sql1 = "select count(酒店名称) as a from 订单表,订单编号表头 where 订单表.id_编号=订单编号表头.id_编号 and 订单编号表头.订单编号='" & 订单编号 & "'and 订单表.转换酒店单价 is null "
        Adodc3.RecordSource = sql1
        Adodc3.Refresh
        If Adodc3.Recordset.Fields("a") <> 0 Then
            DataGrid2.AllowUpdate = False
            MsgBox "有没有价格的货物,请先确定价格,再来填写送货数量!", vbOKOnly + vbInformation, " 提示信息"
            Exit Sub
        Else
            DataGrid2.AllowUpdate = True
        End If
   DataGrid2.SetFocus
        SendKeys "{right}"
        SendKeys "{right}"
    End If
End Sub

[ 本帖最后由 lowxiong 于 2014-3-8 00:08 编辑 ]
#3
w3609894262014-03-08 00:03
我的数据库中市是有key的,附件的2个表是其中2个表,我复制出来的,订单表的外键市是id编号,订单编号表头主键是id编号,通过这个来连接的,不是没有key的问题,我把adodc1的locktype改成了readonly就解决了,虽然不知道为什么,默认的会出现这种问题
#4
lowxiong2014-03-08 00:17
我在二楼的代码改了。你数据库的确没key,如果有key的话则那项边上有个钥匙图样,你的都没有,见下图:
只有本站会员才能查看附件,请 登录
#5
lowxiong2014-03-08 00:19
改成readonly是掩耳盗铃,除非你不需要改adodc1的数据。
#6
w3609894262014-03-08 09:49
回复 5楼 lowxiong
版主,这不是key的问题,
只有本站会员才能查看附件,请 登录
,在我的数据库中,有key,但问题依然存在,版主你可以将id_编号设为主键,订单表中的id_编号设为外键,你试试问题依然存在,不知为什么
注:在我esc后停留咋adodc1. recoredset.find 这句的时候,datagrid1.的第一行已被更改,但并没有更新到数据库中
如果我后面执行 adodc1.recordeset.find,第一行数据库中的内容即被更改。很是奇怪,甚是不解!
这2个表是我从数据库中复制大另外一个数据库中的,所以这2个表没有保留结构,版主你可以把key和关系手动加上试一试,问题依旧!
我这个中共有3个adodc控件,起不同的作用
adodc1主要是显示和控制datagrid1的,这个无update需求
adodc2主要是显示和控制datagrid2的,这个有update需求
adodc3主要是备用
#7
lowxiong2014-03-08 11:47
我跟踪了,问题正如你所说的,rst.find后更改了数据,换我在2楼的代码后即没有这个问题,我只是将ado的游标类型更换为adUseServer,你默认的是adUseClient,游标类型只是决定数据更改对于远程数据库而言数据更改是否是及时而已,应该不会产生rst.find更改数据的事情,估计这是一个bug。
但如果实际更改数据后还是修改了数据(原来你的代码只要进入后立即esc也会更改数据),估计是你的sql语句有问题,我在看看。

[ 本帖最后由 lowxiong 于 2014-3-8 11:50 编辑 ]
#8
w3609894262014-03-08 12:24
回复 7楼 lowxiong
Adodc1.Recordset.Close
    Adodc1.Recordset.CursorLocation = adUseServer
    Adodc1.Refresh
我已将上述代码写入事件中,不过问题依然存在,我觉得这并不是游标的问题,因为我adodc1这个控件不涉及到更新数据库的问题,而它却莫名的修改数据库中的内容,个人认为这是1个bug
#9
lowxiong2014-03-08 12:59
我的是正常的,见屏幕录像
只有本站会员才能查看附件,请 登录
#10
w3609894262014-03-08 13:15
回复 9楼 lowxiong
版主,你的录像我看了,发现操作问题,见图1,图2
图1
只有本站会员才能查看附件,请 登录

这是版主你选择的方法,这种方法,我试过了,不会出现更改数据的情况,但是这种选择方式只有用鼠标的情况下会生效
图2
只有本站会员才能查看附件,请 登录

这是我用的选择的方式,与版主的不一样,这就导致了会更改数据,版主在试试,不要用图1方式选择数据,图2是较为普遍的选择数据的方式,用键盘就可以实现高亮显示,
所以还请在测试一遍
#11
lowxiong2014-03-08 13:47
如果是选择的原因的话,就简单了。故障原因是由于datagrid1控件和数据库互联造成的,不是bug,在find代码前后加两行代码即可解决,按照你的方式选择也不改变数据,代码如下:
    Adodc1.Refresh
    '如果refresh 不执行 find 则不会update,如果执行就会update订单编号
    Set DataGrid1.DataSource = Nothing
      Adodc1.Recordset.Find ("订单编号='" & 订单编号 & "'")
    Set DataGrid1.DataSource = Adodc1.Recordset
#12
w3609894262014-03-08 14:00
回复 11楼 lowxiong
版主果然NB,这样的疑难杂症都解决了,谢谢拉
#13
lowxiong2014-03-08 14:18
通常在我设计的程序里不会出现这种情况,因为我尽量避免使用控件。虽然控件好像使用方便,但他的很多控件事件会触发一些你意想不到的状况,有的还会死锁;再就是控制不灵活,最致命的就是打包安装会出问题。在设计状态,你拖一个adodc控件似乎你就可以正常写数据库程序了,但你打包安装到其他机器上(尤其新安装操作系统的机器),你就会发现根本不能运行,这是因为adodc实际上使用了很多其他的dll,而这些dll并没有一起打包,所以不具备实用性。
#14
w3609894262014-03-08 14:18
回复 4楼 lowxiong
还有一个问题,就是如果我按照版主的方法,直接将adodc1控件的locktype改成readonly也可以解决。。想问一下这种方法与版主的方法哪个好?
#15
lowxiong2014-03-08 14:26
无所谓了,从代码量上说:设置locktype要先关闭记录集,在更改只读锁定,最后打开记录集共三行代码,而断开显示控件的方式则只需2行代码,从执行速度上看,无疑打开关闭的速度要慢。
#16
w3609894262014-03-08 14:35
回复 15楼 lowxiong
版主,不用控件?都自己写?不是吧
1