VB6.0與SQL Server2000,當把圖形存進SQL Server中.然後在窗體上加載此圖片時,如果選擇的圖片超過1M,會產生視覺上的停頓,給人有點不舒服的感覺,我現在試過兩種方式,用於把SQL Server中圖形讀到窗體控件,都一樣,請教有沒有更好的方式,不產生停頓。以下是列出我使用的兩種方式:
一種:使用二進制文件處理方式把圖片數據轉成文件:
Public Sub LoadFromDB(ByRef fld As ADODB.Field, objPic As Object)
Dim byteData() As Byte
Dim SourceFile As Long
Dim strFile As String
Dim FileLength As Long
On Error GoTo errLoad
If IsNull(fld.Value) Then
objPic.Picture = LoadPicture("")
Exit Sub
End If
SourceFile = FreeFile()
strFile = g_WinDir & "\Temp"
Call fCreateDir(strFile)
strFile = strFile & "\~" & GetString(False) & ".tmp"
If FileExists(strFile) Then Kill strFile
Open strFile For Binary Access Write As SourceFile
FileLength = fld.ActualSize
ReDim byteData(FileLength) As Byte
byteData() = fld.GetChunk(FileLength)
Put SourceFile, , byteData()
Close SourceFile
objPic = LoadPicture(strFile)
Kill strFile
Exit Sub
errLoad:
If Err.Number <> 0 Then
MsgBox Err.Number & ";" & Err.Description, vbInformation + vbOKOnly, "加載圖片"
End If
End Sub二種:通過ADO的流操作,直接把圖形數據存為圖形文件後再加載。
Public Sub LoadImageFromDB(ByVal fld As ADODB.Field, objPic As Object)
Dim c As New ADODB.Stream
Dim strFile As String
On Error GoTo errLoad
'如果圖片內容為空
If IsNull(fld.Value) Then
objPic.Picture = LoadPicture("")
Exit Sub
End If
'開始從數據庫中讀取圖片
c.Mode = adModeReadWrite
c.Type = adTypeBinary
c.Open
c.Write (fld.Value)
'生成臨時文件路徑
strFile = g_WinDir & "\Temp"
Call fCreateDir(strFile)
strFile = strFile & "\~" & GetString(False) & ".tmp"
If FileExists(strFile) Then Kill (strFile)
c.SaveToFile strFile, adSaveCreateOverWrite
objPic.Picture = LoadPicture(strFile)
'刪除臨時文件
Kill strFile
Exit Sub
errLoad:
If Err.Number <> 0 Then
MsgBox Err.Number & ";" & Err.Description, vbInformation + vbOKOnly, "加載圖片"
End If
End Sub
一種:使用二進制文件處理方式把圖片數據轉成文件:
Public Sub LoadFromDB(ByRef fld As ADODB.Field, objPic As Object)
Dim byteData() As Byte
Dim SourceFile As Long
Dim strFile As String
Dim FileLength As Long
On Error GoTo errLoad
If IsNull(fld.Value) Then
objPic.Picture = LoadPicture("")
Exit Sub
End If
SourceFile = FreeFile()
strFile = g_WinDir & "\Temp"
Call fCreateDir(strFile)
strFile = strFile & "\~" & GetString(False) & ".tmp"
If FileExists(strFile) Then Kill strFile
Open strFile For Binary Access Write As SourceFile
FileLength = fld.ActualSize
ReDim byteData(FileLength) As Byte
byteData() = fld.GetChunk(FileLength)
Put SourceFile, , byteData()
Close SourceFile
objPic = LoadPicture(strFile)
Kill strFile
Exit Sub
errLoad:
If Err.Number <> 0 Then
MsgBox Err.Number & ";" & Err.Description, vbInformation + vbOKOnly, "加載圖片"
End If
End Sub二種:通過ADO的流操作,直接把圖形數據存為圖形文件後再加載。
Public Sub LoadImageFromDB(ByVal fld As ADODB.Field, objPic As Object)
Dim c As New ADODB.Stream
Dim strFile As String
On Error GoTo errLoad
'如果圖片內容為空
If IsNull(fld.Value) Then
objPic.Picture = LoadPicture("")
Exit Sub
End If
'開始從數據庫中讀取圖片
c.Mode = adModeReadWrite
c.Type = adTypeBinary
c.Open
c.Write (fld.Value)
'生成臨時文件路徑
strFile = g_WinDir & "\Temp"
Call fCreateDir(strFile)
strFile = strFile & "\~" & GetString(False) & ".tmp"
If FileExists(strFile) Then Kill (strFile)
c.SaveToFile strFile, adSaveCreateOverWrite
objPic.Picture = LoadPicture(strFile)
'刪除臨時文件
Kill strFile
Exit Sub
errLoad:
If Err.Number <> 0 Then
MsgBox Err.Number & ";" & Err.Description, vbInformation + vbOKOnly, "加載圖片"
End If
End Sub
使用adodc控件数据绑定图像框,这样效果可能会好点,因启动时,数据已经加载,仅写查询语句查询即可
1、加一个进度条,进度条让人感觉这1秒过得是很多的。
2、加大SQL Server系统缓存,第一次调用时慢,以后就会快。
3、考虑把图片文件名放入数据库,把图片放入一个文件夹,然后调用
如果是局域网,将图片文件存放在服务端的共享目录中,客户端将共享目录映射为固定盘符的本地网络驱动器,就能当作一般文件进行 LoadPicture 了。
如果速度还不理想,你可以在程序启动时,将映射目录中的图片文件复制到本地目录中,本地文件 LoadPicture 应该是最快的了。
将图片放入一个imagelist,然后读取,这样的速度是不是快很多倍.
在开始前把这个picturebox显示出来,隐藏你需要读写的那个picturebox,等到读写完毕再交换过来。有的时候短暂的停顿是可以接受的,关键是让用户感觉到舒服