在工作中经常使用ADO,遇到一些问题,一直不能解决,希望对这方面熟悉的朋友,能给我详细讲解一下。
从数据库中拿出数据,进行修改,然后把修改后的数据保存到数据库
对数据进行修改更新,有一张单中,有多笔记录,在修改后,可能有4中情况,
a没有任何变化。
b主键内容没有变化,对主键外的内容等进行了修改,
c把原有的记录进行了删除
d把原有的记录进行了删除,同时再原有的位置增加了新的记录请问,ADO对这样的情况是怎样处理的。
或则怎样做才能达到我修改后的数据存储到数据库的效果。
我想ADO应该有办法处理这样的情况,只是我不知道。
这样的情没有其他更好的方法
从数据库中拿出数据,进行修改,然后把修改后的数据保存到数据库
对数据进行修改更新,有一张单中,有多笔记录,在修改后,可能有4中情况,
a没有任何变化。
b主键内容没有变化,对主键外的内容等进行了修改,
c把原有的记录进行了删除
d把原有的记录进行了删除,同时再原有的位置增加了新的记录请问,ADO对这样的情况是怎样处理的。
或则怎样做才能达到我修改后的数据存储到数据库的效果。
我想ADO应该有办法处理这样的情况,只是我不知道。
这样的情没有其他更好的方法
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
║ 免费的源码、工具网站,欢迎大家访问!║
║ http://www.j2soft.cn/ ║
╰═══════════════════╯
'添加记录
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
我先从表中查出数据放在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
我想,比如声明一个记录集,二个字段,ID:用来记录主键信息;TYPE:用来记录该主键的操作类型。当你要删除MSHFlexGrid中的一条记录时,ID记录下这条信息的主键,TYPE标记为“DEL”;当你修改MSHFlexGrid中的一条信息时,同样的ID记录修改信息的主键,TYPE标记为“UPDATE”等等。以此类推.....这样保存信息时,就可以根据这个记录集或者控件中的这些信息,写相关SQL语句了。
我说的这些情况,应该说是比较常见和常用的。就是从表中提取数据,进行修改,保存修改后的数据。如果保存不成功或者取消保存,则应该还是原来的数据。当然修改包括以上我提到的4种情况。
我想问一下,你们一般是怎么处理这样的情况的。我看过一种方法就是把原有的数据全部删除,在重新插入修改后的数据。不过我感觉这样不是很好,而且我好象看过书,说ADO对这些修改有标记。所以我才这样提问的。
全部删除重新插入?比如100条数据中只删除了一条,这样处理是不是有点感觉太没效率了吧?
ADO对这些修改有标记这一说还真不知道,或者是不是指ADO的事务处理?但不管怎么说,针对MSHFlexGrid中的数据修改,与其原有的记录集没关联了,只有保存至数据库中,才和ADO重新建立关联吧?
我就是想批量更新。因为还有保存不成功的话,需要回到原来的数据和状态。
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
ADO本身对改动过的纪录作有标记,用Recordset.Status即可取得。
谢谢。我记得我看过这样的资料和做法,但是不记得在怎样得到。
最好使用离线结果集,批更新的方式.
ADO本身对改动过的纪录作有标记,用Recordset.Status即可取得。
能不能指点一下我具体怎么实现呢?
最好有代码参考一下。
这个问题困扰我很久了。
谢谢
[email protected]