for next语句 提速 ?
运行速度奇慢 我是下面这么写的with vsflexgird1
for i = 1 to .rows-1
for j = 0 to .cols-1
conn.execute "update 工资表 set '"& .textmatrix(0,i) &"'='"& .textmatrix(i,j) &"'"
next j
next i
end with
有什么好办法解决速度的问题吗?
表格大约2000行左右,38列
--------------------编程问答-------------------- LZ:运行循环代码前将vsflexgird1的属性Visible设置为False,那循环在内存进行. --------------------编程问答-------------------- VB的确是慢了些 --------------------编程问答-------------------- 隐藏就能提速吗?窗体也不好看啊? --------------------编程问答-------------------- 让表格不刷新就会快很多的。 --------------------编程问答-------------------- 把SQL拼接起来执行,将next后面的变量去掉
with vsflexgird1--------------------编程问答--------------------
for i = 1 to .rows-1
for j = 0 to .cols-1
sql = sql & "update 工资表 set '"& .textmatrix(0,i) &"'='"& .textmatrix(i,j) &"'"
next
next
conn.execute sql
end with
这样根本不行,visible设为false时,运行时窗格不可见,肯定是不行的
你的代码有个致命的弊端,由于你的表格数量多,你的循环代码会使得你
每插入或修改一个表格时,代码将会从从头到尾全刷新一次,这样你的速度
太慢了,个人建议你每次只刷新你修改的表格,这样的话速度会快不少
--------------------编程问答-------------------- 修正一下 update前加个空格,VB本身没有事务,所以这样用连接的事务也可以实现回滚.一行一次执行电脑也会累哈 呵呵
sql = sql & " update 工资表 set '"& .textmatrix(0,i) &"'='"& .textmatrix(i,j) &"'"--------------------编程问答-------------------- 楼主试一试一行行的添加呢?而不是一个单元格一个单元格的修改。
不知可行否?
'设置Rst=工资表
Dim Rst As ADODB.Recordset
Set Rst = New ADODB.Recordset
set Rst.Activeconnection=conn
rst.open "工资表"
with vsflexgird1
for i = 1 to .rows-1
'for j = 0 to .cols-1
' conn.execute "update 工资表 set '"& .textmatrix(0,i) &"'='"& .textmatrix(i,j) &"'"
'next j
rst.addnew 一行记录
rst.update
//或者用insert into的SQL语句
next i
end with
--------------------编程问答-------------------- 另外,最好把游标设置在服务器端
conn.CursorLocation = adUseServer --------------------编程问答-------------------- 参与学习下 --------------------编程问答-------------------- 改成下面的更快
--------------------编程问答--------------------
dim strSql As String
with vsflexgird1
for i = 1 to .rows-1
strSql="update 工资表 set "
for j = 0 to .cols-1
strSql = strSql & .textmatrix(0,i) &"='"& .textmatrix(i,j) &"', "
next j
strSql=right(strSql,len(strSql)-2)
strSql=strSql & " where 条件"
conn.excecute strSql
next i
end with
楼主的代码问题有二:
1 你的循环中,每一单元格所执行的操作,是更新所有记录的同一字段为同一值。带来的后果不仅仅是慢,数据也是错误的。
2 数据库记录更新是以记录为单位的,你的一条记录有 38 个待更新字段,操作 38 次。不合理。
--------------------编程问答-------------------- 不讨论你程序目的,下面的代码只用一次 execute,就与你的执行结果一致
--------------------编程问答-------------------- 我认为最好的办法是设置表格不刷新,速度会提高很多.最起码提高2倍.耗时是原来的1/3.
dim sSql as string
dim i as long
dim j as long
with vsflexgird1
i = .rows-1
sSQl = "update 工资表 set "
for j = 0 to .cols-1
if j>0 then sSql = sSql & ", "
sSql = sSql & "'"& .textmatrix(0,i) &"'='"& .textmatrix(i,j) &"'"
next j
conn.execute sSql
end with
如果记录在5000条以上,建议增加进度条感觉会好很多.
建议在循环前增加:
vsflexgrid1.redraw=false '设置表格不刷新
.....
循环后再刷新:
vsflexgrid1.redraw=true '刷新表格
--------------------编程问答--------------------
楼主的代码确实有问题! --------------------编程问答-------------------- 看到大家的帮忙很感动,我先去试验,成功后回来告诉大家,感谢!!! --------------------编程问答-------------------- 我来凑个热闹 其他的上面的热你都说了
你可以在后面加个where 1 = 1 不过不知道适不适合你的程序
http://upipp.cn刷ip流量排名 --------------------编程问答-------------------- up --------------------编程问答-------------------- 12楼 那我应该怎么做呢? --------------------编程问答-------------------- 6楼 怎么判断刷新的表格? --------------------编程问答--------------------
如果换我来做,我不会用 UPDATE 来更新原有的表。宁可开一个临时表,把新纪录写进去。然后删除旧表所有记录,将新表内容 INSERT 进去。 --------------------编程问答-------------------- 还是没太懂 怎么建临时表 insert 比update 快吗? --------------------编程问答--------------------
那什么语言能快点呢? --------------------编程问答--------------------
如果你不担心更新过程中断电等意外失败的话,直接删除原表中的记录,用 vsflexgird 中的数据直接添加记录就可以了。那就不需要临时表了。 --------------------编程问答-------------------- Dim strFields As String, strValues As String
conn.execute "Delete From 工资表"
with vsflexgird1
for i = 0 to .cols - 1
strFields = IIf(strFields > "", ",", "") & .textmatrix(0,i)
Next i
for i = 1 to .rows - 1
strValues = ""
For j = 0 to .cols - 1
strValues = IIf(strValues > "", ",'", "") & .textmatrix(i,j) & "'"
Next j
conn.execute "Insert Into 工资表(" & strFields & ") Values('" & strValues & ")"
next i
end with
补充:VB , 基础类