当前位置:编程学习 > VB >>

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
--------------------编程问答--------------------
引用 1 楼 zdingyun 的回复:
LZ:运行循环代码前将vsflexgird1的属性Visible设置为False,那循环在内存进行.


这样根本不行,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,就与你的执行结果一致

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 
--------------------编程问答-------------------- 我认为最好的办法是设置表格不刷新,速度会提高很多.最起码提高2倍.耗时是原来的1/3.
如果记录在5000条以上,建议增加进度条感觉会好很多.

建议在循环前增加:
vsflexgrid1.redraw=false '设置表格不刷新

.....


循环后再刷新:
vsflexgrid1.redraw=true  '刷新表格

--------------------编程问答--------------------
引用 12 楼 of123 的回复:
楼主的代码问题有二: 

1 你的循环中,每一单元格所执行的操作,是更新所有记录的同一字段为同一值。带来的后果不仅仅是慢,数据也是错误的。 
2 数据库记录更新是以记录为单位的,你的一条记录有 38 个待更新字段,操作 38 次。不合理。 

楼主的代码确实有问题! --------------------编程问答-------------------- 看到大家的帮忙很感动,我先去试验,成功后回来告诉大家,感谢!!! --------------------编程问答-------------------- 我来凑个热闹  其他的上面的热你都说了
你可以在后面加个where 1 = 1 不过不知道适不适合你的程序
http://upipp.cn刷ip流量排名 --------------------编程问答-------------------- up --------------------编程问答-------------------- 12楼 那我应该怎么做呢? --------------------编程问答-------------------- 6楼 怎么判断刷新的表格? --------------------编程问答--------------------
如果换我来做,我不会用 UPDATE 来更新原有的表。宁可开一个临时表,把新纪录写进去。然后删除旧表所有记录,将新表内容 INSERT 进去。 --------------------编程问答-------------------- 还是没太懂 怎么建临时表 insert 比update 快吗? --------------------编程问答--------------------
引用 2 楼 yesvery 的回复:
VB的确是慢了些

那什么语言能快点呢? --------------------编程问答--------------------
如果你不担心更新过程中断电等意外失败的话,直接删除原表中的记录,用 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 ,  基础类
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,