您的位置:首页 > 数据库

用VB6读写数据库中的图片

2007-02-16 21:18 232 查看

'1,以人名和相关图片为例说明,数据库为Access,


'有如下字段:Name char,


' picture OLE object,


' FileLength Number。


'当为ms sql时,将picture改为lob即可。


'2,示例包含control:commom dialog,picture,listbox。


'源码如下:


Option Explicit




Private Declare Function GetTempFileName Lib "kernel32" Alias "GetTempFileNameA" (ByVal lpszPath As


String, ByVal lpPrefixString As String, ByVal wUnique As Long, ByVal lpTempFileName As String) As Long


Private Declare Function GetTempPath Lib "kernel32" Alias "GetTempPathA" (ByVal nBufferLength As Long,


ByVal lpBuffer As String) As Long


Private Const MAX_PATH = 260




Private m_DBConn As ADODB.Connection




Private Const BLOCK_SIZE = 10000


注释: Return a temporary file name.


Private Function TemporaryFileName() As String


Dim temp_path As String


Dim temp_file As String


Dim length As Long




注释: Get the temporary file path.


temp_path = Space$(MAX_PATH)


length = GetTempPath(MAX_PATH, temp_path)


temp_path = Left$(temp_path, length)




注释: Get the file name.


temp_file = Space$(MAX_PATH)


GetTempFileName temp_path, "per", 0, temp_file


TemporaryFileName = Left$(temp_file, InStr(temp_file, Chr$(0)) - 1)


End Function


Private Sub Form_Load()


Dim db_file As String


Dim rs As ADODB.Recordset




注释: Get the database file name.


db_file = App.Path


If Right$(db_file, 1) <> "" Then db_file = db_file & ""


db_file = db_file & "dbpict.mdb"




注释: Open the database connection.


Set m_DBConn = New ADODB.Connection


m_DBConn.Open _


"Provider=Microsoft.Jet.OLEDB.4.0;" & _


"Data Source=" & db_file & ";" & _


"Persist Security Info=False"




注释: Get the list of people.


Set rs = m_DBConn.Execute("SELECT Name FROM People ORDER BY Name", , adCmdText)


Do While Not rs.EOF


lstPeople.AddItem rs!Name


rs.MoveNext


Loop




rs.Close


Set rs = Nothing


End Sub


Private Sub Form_Resize()


lstPeople.Height = ScaleHeight


End Sub






注释: Display the clicked person.


Private Sub lstPeople_Click()


Dim rs As ADODB.Recordset


Dim bytes() As Byte


Dim file_name As String


Dim file_num As Integer


Dim file_length As Long


Dim num_blocks As Long


Dim left_over As Long


Dim block_num As Long


Dim hgt As Single




picPerson.Visible = False


Screen.MousePointer = vbHourglass


DoEvents




注释: Get the record.


Set rs = m_DBConn.Execute("SELECT * FROM People WHERE Name=注释:" & _


lstPeople.Text & "注释:", , adCmdText)


If rs.EOF Then Exit Sub




注释: Get a temporary file name.


file_name = TemporaryFileName()




注释: Open the file.


file_num = FreeFile


Open file_name For Binary As #file_num




注释: Copy the data into the file.


file_length = rs!FileLength


num_blocks = file_length / BLOCK_SIZE


left_over = file_length Mod BLOCK_SIZE




For block_num = 1 To num_blocks


bytes() = rs!Picture.GetChunk(BLOCK_SIZE)


Put #file_num, , bytes()


Next block_num




If left_over > 0 Then


bytes() = rs!Picture.GetChunk(left_over)


Put #file_num, , bytes()


End If




Close #file_num




注释: Display the picture file.


picPerson.Picture = LoadPicture(file_name)


picPerson.Visible = True




Width = picPerson.Left + picPerson.Width + Width - ScaleWidth


hgt = picPerson.Top + picPerson.Height + Height - ScaleHeight


If hgt < 1440 Then hgt = 1440


Height = hgt




Kill file_name


Screen.MousePointer = vbDefault


End Sub




Private Sub mnuRecordAdd_Click()


Dim rs As ADODB.Recordset


Dim person_name As String


Dim file_num As String


Dim file_length As String


Dim bytes() As Byte


Dim num_blocks As Long


Dim left_over As Long


Dim block_num As Long




person_name = InputBox("Name")


If Len(person_name) = 0 Then Exit Sub




dlgPicture.Flags = _


cdlOFNFileMustExist Or _


cdlOFNHideReadOnly Or _


cdlOFNExplorer


dlgPicture.CancelError = True


dlgPicture.Filter = "Graphics Files|*.bmp;*.ico;*.jpg;*.gif"




On Error Resume Next


dlgPicture.ShowOpen


If Err.Number = cdlCancel Then


Exit Sub


ElseIf Err.Number <> 0 Then


MsgBox "Error " & Format$(Err.Number) & _


" selecting file." & vbCrLf & Err.Description


Exit Sub


End If




注释: Open the picture file.


file_num = FreeFile


Open dlgPicture.FileName For Binary Access Read As #file_num




file_length = LOF(file_num)


If file_length > 0 Then


num_blocks = file_length / BLOCK_SIZE


left_over = file_length Mod BLOCK_SIZE




Set rs = New ADODB.Recordset


rs.CursorType = adOpenKeyset


rs.LockType = adLockOptimistic


rs.Open "Select Name, Picture, FileLength FROM People", m_DBConn




rs.AddNew


rs!Name = person_name


rs!FileLength = file_length




ReDim bytes(BLOCK_SIZE)


For block_num = 1 To num_blocks


Get #file_num, , bytes()


rs!Picture.AppendChunk bytes()


Next block_num




If left_over > 0 Then


ReDim bytes(left_over)


Get #file_num, , bytes()


rs!Picture.AppendChunk bytes()


End If




rs.Update


Close #file_num




lstPeople.AddItem person_name


lstPeople.Text = person_name


End If


End Sub





内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: