ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 2808|回复: 8

求助:外网访问速度,原来不是网速的问题!

[复制链接]

TA的精华主题

TA的得分主题

发表于 2007-6-24 23:06 | 显示全部楼层 |阅读模式

终于做成了从外网访问公司里的SQL2000,太高兴了!

但速度太慢!给个我写的程序给大家看下,能否指出慢的原因,速度差了10~20倍!

不服气将每个工作的时间作了记录,如下:

Private Sub UserForm_Initialize()           '初始化
On Error GoTo 9
        Dim arr, StrSql$, i&, j&
        Dim ooo!, aaa!, Msg$
        aaa = Timer:        ooo = Timer
        单号 = "" '确保不要出现以前的情况砂
       
        If CNN.State = 0 Then CNN.Open pthStr1 '找出最近一星期内完成的客户及单号工程及状态
        Msg = Msg & "\连接时间:" & Format(Timer - ooo, "0.00") & "S" & Chr(10)
        ooo = Timer
       
       
        StrSql = " Select  客户 ,单号 ,输入日期  ,工程,总片数,总面积 ,完成日期 from 单资料  WHERE  完成日期>'" & Date - 7 & "' or  完成日期 is null "
       
        Set RS1 = Nothing
        Set RS1 = CreateObject("ADODB.Recordset")       '目标:不用引用!
       
        Msg = Msg & "\定义记录集时间:" & Format(Timer - ooo, "0.00") & "S" & Chr(10)
        ooo = Timer
      
      
        RS1.Open StrSql, CNN, 1, 1, 1
       
        Msg = Msg & "\打开记录集时间:" & Format(Timer - ooo, "0.00") & "S" & Chr(10)
        ooo = Timer
       
       
        Dim Mycollection As New Collection, A           '将唯一性加入
        Arr_Row = RS1.RecordCount
        Arr_Col = RS1.Fields.Count
        ReDim Arr_rs(0 To Arr_Row, 1 To Arr_Col)
       
        Msg = Msg & "\定义集合与数组的时间:" & Format(Timer - ooo, "0.00") & "S" & Chr(10)
        ooo = Timer
       
        For j = 1 To Arr_Col: Arr_rs(0, j) = RS1.Fields(j - 1).Name: Next '记录表头
       
        Msg = Msg & "\产生表头的时间:" & Format(Timer - ooo, "0.00") & "S" & Chr(10)
        ooo = Timer
       
        For i = 1 To Arr_Row
            For j = 1 To Arr_Col
                If IsNull(RS1.Fields(j - 1)) Then Arr_rs(i, j) = "" Else Arr_rs(i, j) = RS1.Fields(j - 1)
            Next
            RS1.MoveNext
        Next
        Set RS1 = Nothing
       
        Msg = Msg & "\将记录集存放在数组内的时间:" & Format(Timer - ooo, "0.00") & "S" & Chr(10)
        ooo = Timer
       
       
        On Error Resume Next
        For i = 1 To Arr_Row
            A = Arr_rs(i, 1)
            Mycollection.Add A, CStr(A)
        Next
        Err.Clear: On Error GoTo 0
       
        Msg = Msg & "\形成集合唯一性的时间:" & Format(Timer - ooo, "0.00") & "S" & Chr(10)
        ooo = Timer
      
       
        ReDim arr(1 To Mycollection.Count, 1 To 2)
       
        For i = 1 To UBound(arr)
            arr(i, 1) = Mycollection.Item(i)
            arr(i, 2) = 1
        Next
        Set Mycollection = Nothing
        Call Initpage(arr)
        TreeView1.Sorted = True              '排列顺序
        TreeView1.SetFocus
       
        Msg = Msg & "\形成树形的时间:" & Format(Timer - ooo, "0.00") & "S" & Chr(10)
       
       
        MsgBox Msg & "总时间为:" & Format(Timer - aaa, "0.00") & "S  OK  可以查询了!"
        Exit Sub
9:
      MsgBox Err.Description & "  多是上不了网的问题,再试试吧"
     
End Sub

一直以为是网速的问题,于是就将所有的过程都加了一个计时器,最后发现,最耗时间的地方是在

 For i = 1 To Arr_Row
            For j = 1 To Arr_Col
                If IsNull(RS1.Fields(j - 1)) Then Arr_rs(i, j) = "" Else Arr_rs(i, j) = RS1.Fields(j - 1)
            Next
            RS1.MoveNext
        Next
        Set RS1 = Nothing
       
        Msg = Msg & "\将记录集存放在数组内的时间:" & Format(Timer - ooo, "0.00") & "S" & Chr(10)
        ooo = Timer


总时间在28S的初始化工作,却在上面的花了23S,与想象的网速完全不是一回事!

即如下面兄弟说的用了  getrows   也不能快点点

再请高手们指示一下

多谢了

[此贴子已经被作者于2007-6-26 10:47:08编辑过]

TA的精华主题

TA的得分主题

发表于 2007-6-25 10:14 | 显示全部楼层

ADO的代码别人比较难找原因,因为不好调试。

我看了一下,觉得用

        For i = 1 To Arr_Row
            For j = 1 To Arr_Col
                If IsNull(RS1.Fields(j - 1)) Then Arr_rs(i, j) = "" Else Arr_rs(i, j) = RS1.Fields(j - 1)
            Next
       
            A = RS1("客户")
            Mycollection.Add A, CStr(A)
            RS1.MoveNext
        Next
通过两重循环来把数据存入数组效率太低,楼主可以去看一下getrows方法,好像可以把一个recordset直接存入数组,如果那样的话应该对提高速度有所帮助。

由于对collect对象不太熟悉,只大概了解了一下一般都是用于消除重复。我不了解为不在SQL语句中直接用distinct来直接去除重复?

TA的精华主题

TA的得分主题

 楼主| 发表于 2007-6-25 13:01 | 显示全部楼层

现在还有一个状况,就是时好时坏,经测试最快只用10S就连上了,有时要1分多钟,有时却只是提示一般性网络错误!

这种情况总是说网络,或硬件有问题行吗?

单从语句的角度来说,再做更改可能也只是1~2S之间的差别,

所以本人还以为是有些东西可能未做好导致的!

请各位高手再指点

TA的精华主题

TA的得分主题

发表于 2007-6-25 14:21 | 显示全部楼层
QUOTE:
以下是引用sunsoncheng在2007-6-25 13:01:39的发言:

现在还有一个状况,就是时好时坏,经测试最快只用10S就连上了,有时要1分多钟,有时却只是提示一般性网络错误!

这种情况总是说网络,或硬件有问题行吗?

单从语句的角度来说,再做更改可能也只是1~2S之间的差别,

所以本人还以为是有些东西可能未做好导致的!

请各位高手再指点

读外网数据库,最好采用复制到本地硬盘后读取,这样一旦复制成功后读取非常快,即便复制成功后断网也无妨。用后再删除。

TA的精华主题

TA的得分主题

 楼主| 发表于 2007-6-25 14:57 | 显示全部楼层

你说得对!前天我就犯了这个错,昨天改过来的,但总不将整个数据库copy过来吧?

最多只是将记录集处理在数组中而已

现在的测试中发现,就是第一次读取记录集时出现问题

谢谢楼上的回复

再请教

TA的精华主题

TA的得分主题

 楼主| 发表于 2007-6-26 10:44 | 显示全部楼层

谢各位老师再来指点一下!

TA的精华主题

TA的得分主题

 楼主| 发表于 2007-6-26 11:56 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助

补充一点:

记录集的行为数512行

机器配置为XP+2000内存为512M

按说怎么都不会慢的!偏偏就在没想到的角落出了事!

TA的精华主题

TA的得分主题

 楼主| 发表于 2007-6-28 10:19 | 显示全部楼层

经自己的多次测试

原来将记录集赋值到数组的方式,最快的是全部copyfromcordset到工作表再将已用范围赋值,对我上面的例子速度是约5~10倍!

TA的精华主题

TA的得分主题

发表于 2011-1-22 18:25 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册

外网访问SQL

怎么样联接,不会,有没有哪个老师可以指导一下
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-10-5 14:26 , Processed in 0.039564 second(s), 9 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表