有两个表New,Savings
定义维数为10000的数组ss
要查找Savings中Name等于ss中的字符
若存在则修改
否则在New中添加
如下:
Dim ss(10000)
conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Persist Security Info=False;Data Source=" & App.Path & "\data.mdb;Persist Security Info=False"
rec1.Open "select * from New", conn, 1, 2
For i = 1 To UBound(ss)
    Rec.Open "select * from Savings where Name='" & ss(i) & "'", conn, 1, 2
    If Rec.RecordCount > 0 Then
        Rec!Type= "faib"
        .....
        .....
        Rec.Update
    Else
        rec1.AddNew
        rec1!Name= "faib"
        .....
        .....
        rec1.Update
    End If
    Rec.Close
Next i
运行时速度很慢,有谁能帮我优化一下?

解决方案 »

  1.   

    这样,你优化一下你的SQL语句就行
    dim tempSQL as string 
    tempSQL="select * from Savings where "
    For i = 1 To UBound(ss)
        tempSQL = tempSQL  + " Name='" & ss(i) & "' or " 
    next i
    tempSQL =left(tempSQL,len(tempSQL)-4)
    Rec.Open tempSQL ,conn, 1, 2
      

  2.   

    修改 
    conn.execute("update Savings set type=new.type ... from savings,new where savings.name=new.name")
    添加
    conn.execute("select * into Savings from new where new.name not in (select name from savings")
      

  3.   

    上面的Sql语句在太长了,得想别的方法....
      

  4.   

    update不太方便
    因为我还要对ss进行判断
    比如是否为空....
      

  5.   

    这样结果集就运行一次,然后循环取出结果集的内容就行了.
    这样,然后你在结果集中查找,UPDATE,然后没有的再添加.
    这样在SQL运行次数减少一些.
    或者使用存储过程.我遇到这种问题就是使用存储过程+事务.
      

  6.   

    确切一点
    我先将一个文件数据加载到一个表格中,示意图:
     ------------------------
    |1   |2   |3   |4   |5   |...
     ------------------------
    |asdf|tqer|5q3 |hadf|7345|...
     ------------------------
    |asdf|tqer|5q3 |hadf|7345|...
    ..........................
     ------------------------
    TxtNumber为文本框,用于输入各字段对应的表格表序号rec1.Open "select * from New", conn, 1, 2
    For i = 1 To Mfgtmp.Rows - 1
        Rec.Open "select * from Savings where 帐号='" & Mfgtmp.TextMatrix(i, CInt(Txtnumber(1)) - 1) & "'", conn, 1, 2
        If Rec.RecordCount > 0 Then
            If CInt(Txtnumber(4)) <> 0 Then
                Rec.Fields(ss & "余额") = CCur(Mfgtmp.TextMatrix(i, CInt(Txtnumber(4)) - 1))
            End If
            If CInt(Txtnumber(5)) <> 0 Then
                Rec.Fields(ss & "积数") = CCur(Mfgtmp.TextMatrix(i, CInt(Txtnumber(5)) - 1))
            End If
            Rec.Update
        Else
            have = True
            rec1.AddNew
            '帐号
            If CInt(Txtnumber(1)) <> 0 Then
                rec1!帐号 = Mfgtmp.TextMatrix(i, CInt(Txtnumber(1)) - 1)
            End If
            '机构名称
            If CInt(Txtnumber(0)) <> 0 Then
            For j = 0 To UBound(Org1)
                If Mfgtmp.TextMatrix(i, CInt(Txtnumber(0)) - 1) = Org1(j).Num Then
                    rec1!机构名称 = Org1(j).Nam
                    Exit For
                Else
                    rec1!机构名称 = Mfgtmp.TextMatrix(i, CInt(Txtnumber(0)) - 1)
                End If
            Next j
            End If
            '客户名称
            If CInt(Txtnumber(3)) <> 0 Then
            rec1!客户名称 = Mfgtmp.TextMatrix(i, CInt(Txtnumber(3)) - 1)
            End If
            '行业
            If CInt(Txtnumber(6)) <> 0 Then
            For j = 0 To UBound(Pro1)
                If Mfgtmp.TextMatrix(i, CInt(Txtnumber(6)) - 1) = Pro1(j).Num Then
                    rec1!行业 = Pro1(j).Nam
                    Exit For
                Else
                    rec1!行业 = Mfgtmp.TextMatrix(i, CInt(Txtnumber(6)) - 1)
                End If
            Next j
            End If
            '科目代码
            If CInt(Txtnumber(2)) <> 0 Then
                rec1!科目代码 = Mfgtmp.TextMatrix(i, CInt(Txtnumber(2)) - 1)
            End If
            '组别
            If CInt(Txtnumber(10)) <> 0 Then
            For j = 0 To UBound(Gro1)
                If Mfgtmp.TextMatrix(i, CInt(Txtnumber(10)) - 1) = Gro1(j).Num Then
                     rec1!组别 = Gro1(j).Nam
                     Exit For
                Else
                    rec1!组别 = Mfgtmp.TextMatrix(i, CInt(Txtnumber(10)) - 1)
                End If
            Next j
            End If
            If CInt(Txtnumber(4)) <> 0 Then
                rec1!余额 = CCur(Mfgtmp.TextMatrix(i, CInt(Txtnumber(4)) - 1))
            End If
            If CInt(Txtnumber(5)) <> 0 Then
                rec1!积数 = CLng(Mfgtmp.TextMatrix(i, CInt(Txtnumber(5)) - 1))
            End If
            If CInt(Txtnumber(9)) <> 0 Then
                rec1!日均存款 = CCur(Mfgtmp.TextMatrix(i, CInt(Txtnumber(9)) - 1))
            End If
            If CInt(Txtnumber(11)) <> 0 Then
                rec1!大客户名称 = Mfgtmp.TextMatrix(i, CInt(Txtnumber(11)) - 1)
            End If
            If CInt(Txtnumber(7)) <> 0 Then
                rec1!开户日期 = Mfgtmp.TextMatrix(i, CInt(Txtnumber(7)) - 1)
            End If
            If CInt(Txtnumber(8)) <> 0 Then
                rec1!销户日期 = Mfgtmp.TextMatrix(i, CInt(Txtnumber(8)) - 1)
            End If
            rec1.Update
        End If
        Rec.Close
    Next i
      

  7.   

    可以把你数组SS中的数据放到一个临时表(Table_temp)中。然后用zhp80(zhp80) 的方法。在三个表之间用Sql语句解决问题:对于在Table_temp表和Saving表中的数据更新Saving表中的内容;往New表中添加在Table_temp表中而不在Saving表中的数据,这样用几条Sql就可搞定。最后删除掉Table_temp表。
      

  8.   

    楼上说的用临时表
    可是到最后
    还是要将临时表中的数据与Savings中的进行比较呀
      

  9.   

    建议把SS中的内容存到表里,再用SQL查询,这样可利用数据库的优化查询技术。
    比如SS中的内容存在表A中的字段SS里。
    conn.execute("update savings inner join A on savings.name=A.ss set type='faib'")
    conn.execute("insert into [new] (name) select A.ss from A left join savings on A.ss=savings.name where savings.name is null")
      

  10.   

    优化你的代码,最好的方法是使用SQL语言
    你的程序一试没法完全读懂,还是把表结构、任务需求贴上来,让大家讨论讨论吧!
      

  11.   

    conns = "insert into new (帐号,机构名称) values('" & tmp(1) & "', '" & tmp(0) & "') where 帐号<>'" & tmp(1) & "'"
        conn.Execute conns, 0, 1提示结尾处无分号(;)?