有一个表中有十多个字段,除了主键外均为img类型,每个字段存贮的图片都大约有800多K,当存储了几百条记录后,为了添加记录,在运行select语句很慢,请问怎么能提速select的查询速度!!如下:Public adors As ADODB.Recordset
Set adors = New ADODB.Recordset'*************************************************************
adors.Open "SELECT * FROM (表名) where 1=2", adocn, adOpenDynamic, adLockOptimistic
'********************************************这条语句特别慢
adors.addnew
adors.Fields("XH").value = n
Call FileToDB(adors(4), App.Path & "\tif\DDXFB.tif")
Call FileToDB(adors(5), App.Path & "\tif\DDXFB.tif")
Call FileToDB(adors(6), App.Path & "\tif\DDXFB.tif")
Call FileToDB(adors(7), App.Path & "\tif\Pole.tif")
Call FileToDB(adors(8), App.Path & "\tif\Pole.tif")
Call FileToDB(adors(9), App.Path & "\tif\Pole.tif")
Call FileToDB(adors(10), App.Path & "\tif\JCKYW.tif")
Call FileToDB(adors(11), App.Path & "\tif\JCKYW.tif")
Call FileToDB(adors(12), App.Path & "\tif\JCKYW.tif")
Call FileToDB(adors(13), App.Path & "\tif\lx.tif")
Call FileToDB(adors(14), App.Path & "\tif\lx.tif")
Call FileToDB(adors(15), App.Path & "\tif\lx.tif")
adors.Updateadors.Close
Public Sub FileToDB(ByRef fld As ADODB.Field, DiskFile As String)Dim byteData() As Byte '字节数据数组
Dim NumBlocks As Long '块数
Dim FileLength As Long '文件长度
Dim LeftOver As Long '余数值
Dim SourceFile As Long '数据源文件
Const BLOCKSIZE = 4096
Dim i As Long
On Error GoTo ErrorHandlerSourceFile = FreeFile 'FreeFile函数提供尚未使用的文件号
Open DiskFile For Binary Access Read As SourceFile 'OPEN函数激活对文件的(I/O),二进制
FileLength = LOF(SourceFile) 'LOF函数表示以OPEN语句打开的文件以字节数表示的文件大小'''如果图象文件存在,将其保存到数据库
If FileLength = 0 Then
Close SourceFile 'CLOSE函数关闭OPEN函数打开的(I/O)文件
MsgBox DiskFile & " 无内容或不存在!", 64, "提示"
Else
NumBlocks = FileLength \ BLOCKSIZE
LeftOver = FileLength Mod BLOCKSIZE '取块数后的余数值
ReDim byteData(1 To BLOCKSIZE)
For i = 1 To NumBlocks
Get SourceFile, , byteData() 'GET函数将一个以打开的磁盘文件读入一个变量之中
fld.AppendChunk byteData() 'AppendChunk属性添加数据到二进制字段
Next i
ReDim byteData(1 To LeftOver)
Get SourceFile, , byteData()
fld.AppendChunk byteData()
Close SourceFile 'CLOSE函数关闭OPEN函数打开的(I/O)文件
End IfExit Sub
ErrorHandler:End Sub
Set adors = New ADODB.Recordset'*************************************************************
adors.Open "SELECT * FROM (表名) where 1=2", adocn, adOpenDynamic, adLockOptimistic
'********************************************这条语句特别慢
adors.addnew
adors.Fields("XH").value = n
Call FileToDB(adors(4), App.Path & "\tif\DDXFB.tif")
Call FileToDB(adors(5), App.Path & "\tif\DDXFB.tif")
Call FileToDB(adors(6), App.Path & "\tif\DDXFB.tif")
Call FileToDB(adors(7), App.Path & "\tif\Pole.tif")
Call FileToDB(adors(8), App.Path & "\tif\Pole.tif")
Call FileToDB(adors(9), App.Path & "\tif\Pole.tif")
Call FileToDB(adors(10), App.Path & "\tif\JCKYW.tif")
Call FileToDB(adors(11), App.Path & "\tif\JCKYW.tif")
Call FileToDB(adors(12), App.Path & "\tif\JCKYW.tif")
Call FileToDB(adors(13), App.Path & "\tif\lx.tif")
Call FileToDB(adors(14), App.Path & "\tif\lx.tif")
Call FileToDB(adors(15), App.Path & "\tif\lx.tif")
adors.Updateadors.Close
Public Sub FileToDB(ByRef fld As ADODB.Field, DiskFile As String)Dim byteData() As Byte '字节数据数组
Dim NumBlocks As Long '块数
Dim FileLength As Long '文件长度
Dim LeftOver As Long '余数值
Dim SourceFile As Long '数据源文件
Const BLOCKSIZE = 4096
Dim i As Long
On Error GoTo ErrorHandlerSourceFile = FreeFile 'FreeFile函数提供尚未使用的文件号
Open DiskFile For Binary Access Read As SourceFile 'OPEN函数激活对文件的(I/O),二进制
FileLength = LOF(SourceFile) 'LOF函数表示以OPEN语句打开的文件以字节数表示的文件大小'''如果图象文件存在,将其保存到数据库
If FileLength = 0 Then
Close SourceFile 'CLOSE函数关闭OPEN函数打开的(I/O)文件
MsgBox DiskFile & " 无内容或不存在!", 64, "提示"
Else
NumBlocks = FileLength \ BLOCKSIZE
LeftOver = FileLength Mod BLOCKSIZE '取块数后的余数值
ReDim byteData(1 To BLOCKSIZE)
For i = 1 To NumBlocks
Get SourceFile, , byteData() 'GET函数将一个以打开的磁盘文件读入一个变量之中
fld.AppendChunk byteData() 'AppendChunk属性添加数据到二进制字段
Next i
ReDim byteData(1 To LeftOver)
Get SourceFile, , byteData()
fld.AppendChunk byteData()
Close SourceFile 'CLOSE函数关闭OPEN函数打开的(I/O)文件
End IfExit Sub
ErrorHandler:End Sub
解决方案 »
- VB怎么用command控制列表框中删除文本框中相同字符项
- 关于VB里的一个小问题.
- 大家帮忙看看为什么用串口调试助手接收是好的,但用我自己编写的程序接收却总有几个字符变成了16进制3F(附串口调试助手和我的程序接收的16进制数据供分析)
- 吗的,真他妈的无耻
- 如何根据数值来使用变量,即由字符串和数值来使用变量名(在线等待)
- 怎么能像flashget一样,在点击网页的时候,可以在右键菜单有“使用网际快车下载“这样的按钮
- 50分求以SQL语句--字段的删除(在线等待,得到答案立即结贴)
- 石油行业软件是不是用vb编程?有用C++吗?
- 如何让一个不相应Enter的控件响应Enter键!就是在KeyPress事件可以响应Enter键!
- 怎样用代码生成控件数组并能响应事件?
- 二百分求,VB程序中一条select语句的提速与优化方法!!
- 二百分求,VB程序中一条select语句的提速与优化方法!!
如果你光是为了增加一条记录,打开记录集的时候,可以用:
select top 0 * from 表名 这样没有数据的检索,得到的只是字段信息,速度会很快的!如果你要进行SELECT检索,最好数据量不要太大,一条,应该没问题!
参考:
http://expert.csdn.net/Expert/topic/1594/1594455.xml?temp=.6181757http://expert.csdn.net/Expert/topic/1840/1840356.xml?temp=.8678858http://expert.csdn.net/Expert/topic/1814/1814676.xml?temp=.850918
中海的方法比较好。