在工作中经常遇到一些问题,一直不能解决,希望对这方面熟悉的朋友,能给我详细讲解一下。
   从数据库中拿出数据,进行修改,然后把修改后的数据保存到数据库
   对数据进行修改更新,有一张单中,有多笔记录,在修改后,可能有4中情况,
a没有任何变化。
b主键内容没有变化,对主键外的内容等进行了修改,
c把原有的记录进行了删除
d把原有的记录进行了删除,同时在原有的位置增加了新的记录以下是我的一段保存数据的代码
我先从表中查出数据放在MSHFlexGrid2中,然后进行一些修改,也就是我上面说的四种情况。
a没有任何变化。
b主键内容没有变化,对主键外的内容等进行了修改,
c把原有的记录进行了删除
d把原有的记录进行了删除,同时再原有的位置增加了新的记录。但是在保存是,提示插入重复数据,也就是说我把MSHFlexGrid2中的数据全部重新插入到表中,而实际上应该是:a:不需要任何动作
b:对数据进行UPDATE
c:对数据进行delete
d:对数据进行delete后在进行insert如果保存不成功,或则取消修改,数据应该还是a,b,c
如果保存成功,才是a,b,d。请问,对这样的情况是怎样处理的。
或则怎样做才能达到我修改后的数据存储到数据库的效果。
这样的情没有其他更好的方法
我知道可以用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 If

解决方案 »

  1.   

    代码漏了一点补上: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
      

  2.   

    那我再开一贴?
    我已经开了好几贴了?
    http://community.csdn.net/Expert/topic/4871/4871382.xml?temp=.2290918
      

  3.   

    其实这个问题很简单,就是你要保留你要处理的数据的状态,实现批量更新.一般情况下我在做单据处理时(比如入库单)的新增和修改时会有这样的情况.如果是.Net的话,ADO.Net对这个有很好的支持,真的很方便,.Net的实现方式就是记录每个在本地的数据的状态.按照你现在的方法,最简单的就是把状态写在Grid上,把这列隐藏.例如,初始装载时是Unchange,修改了就是Modify,新增是AddNew,删除就是Delete,其它几个比较简单,Delete就有些忙烦,我最开始的做法是把记录ID放在数组里.其次,还有其它的办法,就是用非实时连接的数据集,在我实现的三层架构中我就使用的这种方式.先把我上面的搞懂,下面这种方式道理都是一样的.
      

  4.   

    wumylove1234(毁于随) 
    谢谢。我按你的方法试试再说。
      

  5.   

    ms-mvp 有他们,评优秀版主有他们,回帖似乎看不到。
    楼主,你放弃吧,我就没见过那几个版主和mvp来过。
    我也不是想证明什么,但是我看到的事实就是这样。
      

  6.   

    参考算法:
    1.把该表主键填充至MSHFlexGrid2的一个新列作为标记用,设为只读
    2.修改数据时,当前行标记列数据不会变化
    3.删除数据时,用动态数组记录当前行标记列数据值,并删除该行
    4.新增数据行,当前行标记列数据因不可修改,值为NULL或0有了这些条件,就可以完成:
    1.UPDATE 标记数据>0(主键)的行
    2.DELETE 动态数组记录的所有主键值(删除行)
    3.INSERT 标记数据=0或NULL值的行,同时生成新的主键值
      

  7.   

    给你个删除数据ID记录过程作参考
    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
      

  8.   

    DIM marrDeleted() AS LONG '定义动态数组
      

  9.   

    Athoncj(阿龙) 
    谢谢你的热心帮助,我会参考你的建议。
      

  10.   

    我写的三层架构Blog里只做了DA层的.有空更新Entry和Business的.呵.