关于ADO,批量删除记录,一直没搞清楚。

zzzwww 2002-04-23 12:49:40
各位,我一直想用下面的代码来实现批量删除记录,可是不行。
Dim db As New Connection, re As New Recordset, i As Integer

db.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & App.Path & "\data.mdb;Persist Security Info=False"
db.CursorLocation = adUseClient
db.Open

re.Open "select * from 数据表 where a>22", db, adOpenDynamic, adLockBatchOptimistic
re.Delete adAffectAllChapters '**************
re.UpdateBatch adAffectAllChapters'***********

我只有把最后两句用下面的循环来实现,但速度太慢。

For i = 1 To re.RecordCount
re.Delete adAffectCurrent
re.UpdateBatch adAffectCurrent
re.MoveNext
Next i

我一直没搞清楚 批量删除记录 的正确方法,请大家告诉我, 一定给分。
...全文
148 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
lihonggen0 2002-04-23
  • 打赏
  • 举报
回复
If .RecordCount > 0 Then
For n = 1 To .RecordCount
.MoveFirst
.Delete
Next
End If
zhongminsheng 2002-04-23
  • 打赏
  • 举报
回复

re.Open "select * from 数据表 where a>22", db, adOpenDynamic, adLockBatchOptimistic
改为:
re.Open "delete from 数据表 where a>22", db,,,adcmdtext
就可以了
zzzwww 2002-04-23
  • 打赏
  • 举报
回复
真是大受启发!
的确,用SQL语句处理是最好的,代码少,效率也高.
gump2000(阿甘) ,ferrytang(丐帮帮助) 的方法都好.
感谢各位,解决了我心中留下好久的问题.
SnHnBn 2002-04-23
  • 打赏
  • 举报
回复
把re.UpdateBatch 移到循环后面,并且把参数去掉
fuxc 2002-04-23
  • 打赏
  • 举报
回复
re.Delete adAffectAllChapters

注意看Msdn的解释:
AdAffectGroup 删除满足当前 Filter 属性设置的记录。要使用该选项,必须将 Filter 属性设置为有效的预定义常量之一。

何为有效的预定义常量?查一下Filter属性:

AdFilterPendingRecords 允许只查看已更改且尚未发送到服务器的记录。只能应用于批更新模式。
AdFilterAffectedRecords 允许只查看上一次 Delete、Resync、UpdateBatch 或 CancelBatch 调用所影响的记录。
AdFilterFetchedRecords 允许查看当前缓冲区中的记录,即上一次从数据库中检索记录的调用结果。
AdFilterConflictingRecords 允许查看在上一次批更新中失败的记录。


自定义的Filter是不行的,
另外.MoveNext然后.Delete并不存在性能的问题,Recordset的功能决定了他只能操作当前记录,即能够简化语句,但性能是一样的。
ferrytang 2002-04-23
  • 打赏
  • 举报
回复
db.CursorLocation = adUseClient
//用了客户端游标之后就不要去用动态打开方式了
//re.Open "select * from 数据表 where a>22", db, adOpenDynamic, adLockBatchOptimistic
re.Open "select * from 数据表 where a>22", db, adOpenStatic, adLockBatchOptimistic

============================================
批量删除
dim intNums as integer
//intNums返回删除的记录数量
db.BeginTrans
call db.execute("delete from 数据表 where a>22",intNums)
db.CommitTrans
gump2000 2002-04-23
  • 打赏
  • 举报
回复
建议用标准SQL语句处理,您的方法又慢又容易出问题

dim cnn as new adodb.connection
dim cmd as new adodb.command

cnn.open ....

set cmd.activeconnection=cnn
cmd.commandtype=adcmdtext
cmd.commandtext="delete from 数据表 where a>22"
cmd.execute
zzzwww 2002-04-23
  • 打赏
  • 举报
回复
recordset.Open Source, ActiveConnection, CursorType, LockType, Options

参数

Source 可选,变体型,计算 Command 对象的变量名、SQL 语句、表名、存储过程调用或持久 Recordset 文件名。

ActiveConnection 可选。变体型,计算有效 Connection 对象变量名;或字符串,包含 ConnectionString 参数。

CursorType 可选,CursorTypeEnum 值,确定提供者打开 Recordset 时应该使用的游标类型。可为下列常量之一(参阅 CursorType 属性可获得这些设置的定义)。

常量 说明
AdOpenForwardOnly (默认值)打开仅向前类型游标。
AdOpenKeyset 打开键集类型游标。
AdOpenDynamic 打开动态类型游标。
AdOpenStatic 打开静态类型游标。


LockType 可选。确定提供者打开 Recordset 时应该使用的锁定(并发)类型的 LockTypeEnum 值,可为下列常量之一(参见 LockType 属性可获得详细信息)。

常量 说明
AdLockReadOnly (默认值)只读 — 不能改变数据。
AdLockPessimistic 保守式锁定(逐个) — 提供者完成确保成功编辑记录所需的工作,通常通过在编辑时立即锁定数据源的记录。
AdLockOptimistic 开放式锁定(逐个) — 提供者使用开放式锁定,只在调用Update 方法时才锁定记录。
AdLockBatchOptimistic 开放式批更新—用于批更新模式(与立即更新模式相对)。


Options 可选,长整型值,用于指示提供者如何计算 Source 参数(如果它代表的不是 Command 对象),或从以前保存 Recordset 的文件中恢复 Recordset。可为下列常量之一(参见 CommandType 属性可获得该列表中前五个常量的详细说明)。

常量 说明
adCmdText 指示提供者应该将 Source 作为命令的文本定义来计算。
adCmdTable 指示 ADO 生成 SQL 查询以便从在 Source 中命名的表中返回所有行。
adCmdTableDirect 指示提供者更改从在 Source 中命名的表中返回所有行。
adCmdStoredProc 指示提供者应该将 Source 视为存储过程。
adCmdUnknown 指示 Source 参数中的命令类型为未知。
adCmdFile 指示应从在 Source 中命名的文件中恢复保留(保存的)Recordset。
adAsyncExecute 指示应异步执行 Source。
adAsyncFetch 指示在提取 Initial Fetch Size 属性中指定的初始数量后,应该异步提取所有剩余的行。如果所需的行尚未提取,主要的线程将被堵塞直到行重新可用。
adAsyncFetchNonBlocking 指示主要线程在提取期间从未堵塞。如果所请求的行尚未提取,当前行自动移到文件末尾。



应该选哪个呢?
zzzwww 2002-04-23
  • 打赏
  • 举报
回复
请大家继续关注。谢谢!
zhongminsheng 2002-04-23
  • 打赏
  • 举报
回复
那你改一下db,后面的参数我随手粘过来的没有改!



zzzwww 2002-04-23
  • 打赏
  • 举报
回复
to lihonggen0(李洪根,用VB,标准答案来了):
你的方法好像与我的一样啊。
zzzwww 2002-04-23
  • 打赏
  • 举报
回复
to zhongminsheng(小生)
你的方法我试了,不行。
还是提示:对象或提供者不支持所需的操作。
ivt 2002-04-23
  • 打赏
  • 举报
回复
支持
小生
lihonggen0 2002-04-23
  • 打赏
  • 举报
回复



With Rs_C_Indexerror
If .State = adStateOpen Then
.Close
End If
.ActiveConnection = adoCN
.CursorLocation = adUseClient
.CursorType = adOpenDynamic
.LockType = adLockBatchOptimistic
.Source = "SELECT * FROM C_Indexerror WHERE windowsname='W_JC_SHHY' AND contract='" & W_Jc_Shhy_Sh.Text1(0).Text & "'"
.Open
If .RecordCount > 0 Then
For n = 1 To .RecordCount
.MoveFirst
.Delete
Next
End If
End With

7,759

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧