首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VB >

查询一个80万的IP地址数据库,VB程序会在查询的时候停顿,必须在查询完成后才能进行其它操作,如何避免

2012-03-08 
查询一个80万的IP地址数据库,VB程序会在查询的时候停顿,必须在查询完成后才能进行其它操作,请教高手如何处

查询一个80万的IP地址数据库,VB程序会在查询的时候停顿,必须在查询完成后才能进行其它操作,请教高手如何处理?
查询一个80万的IP地址数据库,VB程序会在查询的时候停顿,必须在查询完成后才能进行其它操作,请教高手如何处理?


VB code
Function fwip(ipp)Call LinkDBDim iCount As Long    Dim strUsers As String    Dim adoRs As New ADODB.Recordset    Dim strTemp As String    'ipp = "25.65.45.78"If ipp <> "unknown" And ipp <> "" And InStr(ipp, ".") > 1 Thensip = Split(ipp, ".")ssip = sip(0) * 256 * 256 * 256 + sip(1) * 256 * 256 + sip(2) * 256 + sip(3)SQL = ("select top 1 ip2,country,city from address where ip2 > " & ssip & " order by ip2 asc ")adoRs.open SQL, Conns, 1, 1If Not adoRs.EOF ThenAdd = adoRs("country") & adoRs("city")ElseAdd = "未知地址"End IfadoRs.CloseEnd IfConns.CloseSet adoRs = NothingSet Conns = NothingEnd FunctionPrivate Function LinkDB() '连接数据库代码    On Error GoTo LinkDB_Err        Dim strConn As String        strConn = "Provider=Microsoft.Jet.OLEDB.4.0;" & _        "Data Source=" & App.Path & "\msnabaga.mdb" '设置连接字串,连接数据库    Conns.open strConn       Exit FunctionLinkDB_Err:    MsgBox Err.Number & vbCrLf & Err.Description, , GstrAppTitleEnd Function


[解决办法]
ADO默认是阻塞的,如果查询的操作比较耗时,你可以考虑用ActiveX Exe做多线程,或者是用ADO的异步模式。
[解决办法]
用ADO的异步模式
[解决办法]
这个正巧我有过一点实际经验。
我的应用范围纯真IP库.条数41W条
想快注意几点
1.IP1,IP2在数据库里建立索引
2.查询时不要用rs.open用set rs=con.execute()
这样查起来非常快。根据经验普通比较好的个人PC上能实现1秒钟10-20条查询
[解决办法]
补本句
你上面的
SQL = ("select top 1 ip2,country,city from address where ip2 > " & ssip & " order by ip2 asc ")
这样写不对头
因为IP库都是这样的原理

起始IP(ip1) 结束IP(ip2) 地区名 国家名

无需top来取回多条记录
所以应该这样来
Set sRs = sCon.Execute("select country from IPLIST Where ip1<=" & rIP & " And ip2>=" & rIP)

上面提的都注意到了每秒上10条是很容易的

热点排行