在工作中经常使用ADO,遇到一些问题,一直不能解决,希望对这方面熟悉的朋友,能给我详细讲解一下。
    从数据库中拿出数据,进行修改,然后把修改后的数据保存到数据库
   对数据进行修改更新,有一张单中,有多笔记录,在修改后,可能有4中情况,
a没有任何变化。
b主键内容没有变化,对主键外的内容等进行了修改,
c把原有的记录进行了删除
d把原有的记录进行了删除,同时再原有的位置增加了新的记录请问,ADO对这样的情况是怎样处理的。
或则怎样做才能达到我修改后的数据存储到数据库的效果。
我想ADO应该有办法处理这样的情况,只是我不知道。
这样的情没有其他更好的方法

解决方案 »

  1.   

    如何用SQL语句来操作ACCESS和SQL SERVER数据库,包括表的创建、添加、修改、删除、读取记录    
    Dim Con As ADODB.Connection
        Dim rs As ADODB.Recordset
        Set Con = New ADODB.Connection
        strCon = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & App.Path & "\计划管理系统.mdb;Persist Security Info=False"
        Con.Open strCon
        Set rs = New ADODB.Recordset
        '添加记录
        strsql="select * from table"
        rs.Open strsql, Con, adOpenKeyset, adLockOptimistic      
        rs.addnew
           rs!字段1=text1.text
           rs!字段2=text2.text
           ........
        rs.update
        rs.close
        set rs=nothing
        '修改记录
        strsql="select * from table where id=1"
        rs.Open strsql, Con, adOpenKeyset, adLockOptimistic      
           rs!字段1=text1.text
           rs!字段2=text2.text
           ........
        rs.update
        rs.close
        set rs=nothing
            
        '删除记录
        strsql="delete from table where id=1"
        rs.Open strsql, Con, adOpenKeyset, adLockOptimistic
      

  2.   

    从来都是用SQL语句进行更新,关联的更新要放到事务中╭═══════════════════╮
    ║ 免费的源码、工具网站,欢迎大家访问!║
    ║ http://www.j2soft.cn/        ║
    ╰═══════════════════╯
      

  3.   

    你直接就写更新 删除 插入的代码就可以了阿 没有什么东西啊
    '添加记录
        strsql="select * from table"
        rs.Open strsql, Con, adOpenKeyset, adLockOptimistic      
        rs.addnew
           rs!字段1=text1.text
           rs!字段2=text2.text
           ........
        rs.update
        rs.close
        set rs=nothing
        '修改记录
        strsql="select * from table where id=1"
        rs.Open strsql, Con, adOpenKeyset, adLockOptimistic      
           rs!字段1=text1.text
           rs!字段2=text2.text
           ........
        rs.update
        rs.close
        set rs=nothing
            
        '删除记录
        strsql="delete from table where id=1"
        rs.Open strsql, Con, adOpenKeyset, adLockOptimistic
      

  4.   

    想对哪个表修改就UPDATE哪个表,如果有关联交易就根据情况做UPDATE、INSERT、DELETE(根据你的规则选),想删除就DELETE,关联情况同上,没有什么特别的地方啊。
      

  5.   

    建议楼主多了解一下sql语句.你提的这些都是基础sql语句所能完成的工作.ado只是一个桥梁而已,负责把相关的sql语句发送到数据库(或者把添加的数据发送到数据库).基本的操作无非这么几种:查询数据,用select语句;修改数据,用update语句;删除数据,用delete语句;添加数据,用insert语句,或者用ado的addnew方法.利用ado的基本思路为:建立数据连接(connection),操作上述的相关操作,关闭数据连接.就OK了.
      

  6.   

    AD0只是一种数据库连接和管理方式,真正对数据库操作的还是基本的SQL.对于现有的操作,如果数据库可以的话,建议做成存储过程。
      

  7.   

    以下是我的一段保存数据的代码,先说说我想要的情况。
    我先从表中查出数据放在MSHFlexGrid2中,然后进行一些修改,也就是我上面说的四种情况。
    a没有任何变化。
    b主键内容没有变化,对主键外的内容等进行了修改,
    c把原有的记录进行了删除
    d把原有的记录进行了删除,同时再原有的位置增加了新的记录。
    但是在保存是,提示插入重复数据,也就是说我把MSHFlexGrid2中的数据全部重新插入到表中,而实际上应该是:
    a:不需要任何动作
    b:对数据进行UPDATE
    c:对数据进行delete
    d:对数据进行delete后在进行insert
    我也知道可以用SQL进行操作,问题是我不能判断以上4种情况。Private Sub Command1_Click()
      Dim rs2 As New ADODB.Recordset
      Dim SQL, sql2, SQL4 As String
      Dim i, j, m, n As Integer
      
    If rs2.State = 1 Then
        rs2.Close
    End If
    SQL = "select top 0 Epart,Edescshort,uom,item,descshort,unit,re from HGpofact"
      rs2.CursorLocation = adUseClient
      rs2.Open SQL, pubStrConn, adOpenDynamic, adLockBatchOptimistic
      
     '写入recordset
      For m = 1 To MSHFlexGrid2.Rows - 1
            rs2.AddNew
            rs2(0).Value = MSHFlexGrid2.TextMatrix(m, 1)
            rs2(1).Value = MSHFlexGrid2.TextMatrix(m, 2)
            rs2(2).Value = MSHFlexGrid2.TextMatrix(m, 3)
            rs2(3).Value = MSHFlexGrid2.TextMatrix(m, 4)
            rs2(4).Value = MSHFlexGrid2.TextMatrix(m, 5)
            rs2(5).Value = MSHFlexGrid2.TextMatrix(m, 6)
       Next m
    If rs2.EOF And rs2.BOF Then
    MsgBox "保存数据有误,请检查编码"
    Exit Sub
    End Ifrs2.UpdateBatch
    rs2.Close
    MsgBox "保存成功"End Sub
      

  8.   

    可不可以在MSHFlexGrid中加一个隐藏列,标记行的状态。保存数据时,根据标记判断处理方法
      

  9.   

    哦,用MSHFlexGrid记录,删除情况不好记录。或者是不是声明一个记录集来记录MSHFlexGrid中的操作信息?
      

  10.   

    也可以不用MSHFlexGrid,用其他的控件也可以。总之我要知道哪些是修改,哪些是删除,那些是新增的,我才能用相应的SQL语句进行操作。按说ADO中应该有这样的标记,只是不知道怎么读取吧?
      

  11.   

    MSHFlexGrid 显示的是只读数据,对它的修改不影响原有的记录集(或者记录集对象已经NOTHING),所以对MSHFlexGrid的操作应该和ADO没关系了吧?只有用控件或者声明一个记录集,来记录MSHFlexGrid操作关健信息,保存时用相应的SQL语句处理。
    我想,比如声明一个记录集,二个字段,ID:用来记录主键信息;TYPE:用来记录该主键的操作类型。当你要删除MSHFlexGrid中的一条记录时,ID记录下这条信息的主键,TYPE标记为“DEL”;当你修改MSHFlexGrid中的一条信息时,同样的ID记录修改信息的主键,TYPE标记为“UPDATE”等等。以此类推.....这样保存信息时,就可以根据这个记录集或者控件中的这些信息,写相关SQL语句了。
      

  12.   

    TO:vbman2003(家人):
    我说的这些情况,应该说是比较常见和常用的。就是从表中提取数据,进行修改,保存修改后的数据。如果保存不成功或者取消保存,则应该还是原来的数据。当然修改包括以上我提到的4种情况。
    我想问一下,你们一般是怎么处理这样的情况的。我看过一种方法就是把原有的数据全部删除,在重新插入修改后的数据。不过我感觉这样不是很好,而且我好象看过书,说ADO对这些修改有标记。所以我才这样提问的。
      

  13.   

    呵呵,我不是专业程序员,还真没遇到过这样的问题。
    全部删除重新插入?比如100条数据中只删除了一条,这样处理是不是有点感觉太没效率了吧?
    ADO对这些修改有标记这一说还真不知道,或者是不是指ADO的事务处理?但不管怎么说,针对MSHFlexGrid中的数据修改,与其原有的记录集没关联了,只有保存至数据库中,才和ADO重新建立关联吧?
      

  14.   

    ADO支持异步操作的,在操作开始之前,被调用的事件处理程序允许您检查或修改操作参数,然后取消操作或让它完成。你说的ADO标记是不是指这个?是不是可以找找这方面的范例?没做过,学习一下。
      

  15.   

    DengXingJie(杰西) 
    我就是想批量更新。因为还有保存不成功的话,需要回到原来的数据和状态。
      

  16.   

    参考算法:
    1.把该表主键填充至MSHFlexGrid2的一个新列作为标记用,设为只读
    2.修改数据时,当前行标记列数据不会变化
    3.删除数据时,用动态数组记录当前行标记列数据值,并删除该行
    4.新增数据行,当前行标记列数据因不可修改,值为NULL或0有了这些条件,就可以完成:
    1.UPDATE 标记数据>0(主键)的行
    2.DELETE 动态数组记录的所有主键值(删除行)
    3.INSERT 标记数据=0或NULL值的行,同时生成新的主键值删除数据ID记录过程作参考
    DIM marrDeleted() AS LONG '定义动态数组Private Sub XG_MARK_DEL(ROW_S As Long)        'ID(Cell.Tag)保存到marrDeleted数组中,保存数据时用
            If 当前行标记列数据值 > 0 Then'>0说明是在数据库已有数据,而不是新添加的数据行。
                mlngCount = mlngCount + 1
                ReDim Preserve marrDeleted(mlngCount) As Long
                marrDeleted(mlngCount) = Val(Grid.Cell(ROW_S, 14).Tag)
            End If
    '以下移除行参考MSHFlexGrid移除行
            Grid.RemoveItem ROW_S
            Call Form_Resize
            
        
    End Sub
      

  17.   

    最好使用离线结果集,批更新的方式.
    ADO本身对改动过的纪录作有标记,用Recordset.Status即可取得。
      

  18.   

    to:fj182(阿花) 
    谢谢。我记得我看过这样的资料和做法,但是不记得在怎样得到。
    最好使用离线结果集,批更新的方式.
    ADO本身对改动过的纪录作有标记,用Recordset.Status即可取得。
      

  19.   

    to:fj182(阿花) 
    能不能指点一下我具体怎么实现呢?
    最好有代码参考一下。
    这个问题困扰我很久了。
    谢谢
      

  20.   

    我也要,给我也发一份。
    [email protected]
      

  21.   

    阿花:可否也發一份給我呀 [email protected]
      

  22.   

    阿花:可否也發一份給我呀 [email protected]    ___——————谢谢先
      

  23.   

    以上的方法 Athoncj(阿龙) 的不错,如果使用异步离线记录集处理的话,不适用于n tier C/S开发,并且处理不了多用户并发控制,请诸位三思。如果A用户修改一条记录,在A用户保存更新前,如果B用户删除了A用户更新了但尚未保存的记录,则当A用户保存时,更新语句并不能正确执行,此时是否应该插入被用户删除的记录呢,此算法需要分析人员同用户沟通并确定。因此,数据库的开发,并发控制非常关键