请问提高向数据库写数据速度的方法

longxueming 2006-03-20 07:03:47
我是用Ado的方式访问Oracle数据库的,同时向两个表写数据,速度很慢,请问有没有提高效率的方法,具体代码如下:
Set cnn = New ADODB.Connection
cnn.Open "DSN=" & str1, str2, str3
Set rs_section = New ADODB.Recordset
Set rs_link = New ADODB.Recordset

sqlstr1 = "select * from " & str4
rs_section.CursorLocation = adUseClient
rs_section.Open sqlstr1, cnn, adOpenDynamic, adLockOptimistic

sqlstr2 = "select * from " & str5
rs_link.CursorLocation = adUseClient
rs_link.Open sqlstr2, cnn, adOpenDynamic, adLockOptimistic

rs_section.AddNew
rs_link.AddNew
For i = 1 To jn


For j = 1 To jsl(i).n
rs_section.Fields(0) = rs_section.AbsolutePosition '//路段路况信息
rs_section.Fields(1) = jsl(i).gridn & jsl(i).linkN
'--------------------------------------------------------------改变时间格式
rs_section.Fields(3) = jsl(i).level
rs_section.Fields(3) = jsl(i).jsects(j).time

rs_section.Fields(4) = jsl(i).n
rs_section.Fields(5) = jsl(i).jsects(j).lev
rs_section.Fields(6) = jsl(i).jsects(j).s
rs_section.Fields(7) = jsl(i).jsects(j).l
rs_section.Update
rs_section.AddNew
Next j
rs_link.Fields(0) = rs_link.AbsolutePosition '//路链路况信息
rs_link.Fields(1) = jsl(i).gridn & jsl(i).linkN
rs_link.Fields(2) = jsl(i).level
rs_link.Fields(3) = jsl(i).time
rs_link.Fields(4) = jsl(i).traveltime
rs_link.Fields(5) = jsl(i).n
rs_link.Fields(6) = jsl(i).lev
rs_link.AddNew

Next i
...全文
176 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
longxueming 2006-03-22
  • 打赏
  • 举报
回复
自己顶一下
longxueming 2006-03-22
  • 打赏
  • 举报
回复
但是我用 Insert into 语句速度还是很慢,下面是我的代码,请看看有什么问题没
Set cnn = New ADODB.Connection
cnn.Open "DSN=" & str1, str2, str3

strs = "INSERT INTO " & str4 & "(MESHCODESEQUENCENUM,LINKLEVEL,TIMESTAMP,JAMSECTIONNUM,JAMDEGREE,DISTANCETOEND,JAMLENGTH)"
strl = "INSERT INTO " & str5 & "(MESHCODESEQUENCENUM,LINKLEVEL,TIMESTAMP,TRAVELTIME,JAMSECTIONNUM,JAMDEGREE)"
For i = 1 To jn
For j = 1 To jsl(i).n
strIn1 = strs & " values(" & jsl(i).gridn & jsl(i).linkN & "," & jsl(i).level & ",to_date('" & jsl(i).jsects(j).time & "','YYYY-MM-DD hh24:mi:ss')," & jsl(i).n & "," & jsl(i).jsects(j).lev & "," & jsl(i).jsects(j).s & "," & jsl(i).jsects(j).l & ")"
cnn.Execute strIn1
Next j
strIn2 = strl & " values(" & jsl(i).gridn & jsl(i).linkN & "," & jsl(i).level & ",to_date('" & jsl(i).time & "','YYYY-MM-DD hh24:mi:ss')," & jsl(i).traveltime & "," & jsl(i).n & "," & jsl(i).lev & ")"
cnn.Execute strIn2
Next i
gdgf 2006-03-22
  • 打赏
  • 举报
回复
向数据库插入记录,不能使用记录集方式,应使用SQL 的Insert语句是最佳选择.
viena 2006-03-21
  • 打赏
  • 举报
回复
打开记录集时锁定方式用批量乐观锁定
viena 2006-03-21
  • 打赏
  • 举报
回复
UpdateBatch
viena 2006-03-21
  • 打赏
  • 举报
回复
所谓切断记录集就是,打开后记录集立即断开连接(活动连接设为nothing),就像ADO.NET中的DataSet;

每次Update只更新本地内存中的记录集,最后重新连接,调用UpdaBatch更新到数据库
viena 2006-03-21
  • 打赏
  • 举报
回复
使用断开连接的静态记录集(客户端游标),批更新方式,此记录集只用来添加记录,取空记录集即可,sql语句where条件后面加上类似 1=0
iget 2006-03-21
  • 打赏
  • 举报
回复
用RS来更新数据库本来就是最慢的手法,而且你还使用了最慢的游标类型adOpenDynamic。adopenstatic可能会好一点。
如果可能的话,使用存储过程或者直接insert语句添加数据库会比较快。
另外表里面的索引字段越少,添加记录也会快。
存储过程的参数似乎不可以用数组阿。
饮水需思源 2006-03-21
  • 打赏
  • 举报
回复
试试:cnn.execute "insert into tablename(...) values(...)"
longxueming 2006-03-21
  • 打赏
  • 举报
回复
使用存储过程的话,是否能提高效率啊,另外存储过程的参数能否是数组啊
longxueming 2006-03-21
  • 打赏
  • 举报
回复
确实是这样的,请问有什么改进的方法吗
fj182 2006-03-21
  • 打赏
  • 举报
回复
据我所知在客户端直接执行SQL语句根本就没有用Recordset本身来得快,不信你试试。
longxueming 2006-03-21
  • 打赏
  • 举报
回复
按上述方法,还是很慢,我查了一下,时间主要耗费在 rs.updatebatch 这条语句上了,请问问题可能出在哪啊,谢谢

1,216

社区成员

发帖
与我相关
我的任务
社区描述
VB 数据库(包含打印,安装,报表)
社区管理员
  • 数据库(包含打印,安装,报表)社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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