库里已有的二进制数据,怎么把它读出来并播放呢?而且,不知道以前是以什么格式存进去的,怎么解决呢?
Option Explicit
Private Enum MediaTypes 枚举各媒体文件类型
MTGraphic
MTWave
MTAVI
MTMP3
End Enum
Dim rs As Recordset 记录集,用于存放打开的纪录
Dim DataFile As Integer, Fl As Long, Chunks As Integer
Dim Fragment As Integer, Chunk() As Byte, I As Integer
Const ChunkSize As Integer = 16384
Dim filename As String
Dim NameWanted As String
Dim db As Database
Dim Description As String
Dim lMaxHeight As Long
Dim lMaxWidth As Long
Dim CurMediaType As MediaTypes
Private Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long
Const SW_SHOWNORMAL = 1
Private Sub FixFinalSize()
设置各控件大小与位置
Dim lTempWidth As Long
Dim lTempHeight As Long
Dim X As Single
Dim Y As Single
lMaxHeight = Shape1.Height - 20
lMaxWidth = Shape1.Width
X = lMaxHeight / Picture1.Height
With picFinal
.Width = Picture1.Width - 10
.Height = Picture1.Height - 10
.Width = .Width * X
.Height = .Height * X
. = Shape1.
If .Width > lMaxWidth Then
Y = lMaxWidth / .Width
.Width = .Width * Y
.Height = .Height * Y
End If
End With
Me.Refresh
End Sub
Private Sub ReadFromDB()
从数据库中读出文件
Dim MediaTemp As String
Dim lngOffset As Long
Dim lngTotalSize As Long
Dim strChunk As String
Dim mediaid As Long
On Error Resume Next
If fa.MouseRow = 0 Then Exit Sub
mediaid = Val(fa.TextMatrix(fa.MouseRow, 1))
Set rs = db.OpenRecordset("SELECT tblMedia.MediaBLOB, tblMedia.MediaType FROM tblMedia WHERE tblMedia.MediaID = " & mediaid, dbOpenSnapshot)
打开选中的纪录的记录集
If rs.RecordCount = 0 Then
若为空纪录,退出
MsgBox "error retrieving object"
rs.Close
Set rs = Nothing
Exit Sub
End If
CurMediaType = rs!MediaType
Select Case CurMediaType
针对各种媒体文件类型以下将数据库中文件存为对应的媒体文件名
Case MTGraphic
MediaTemp = App.path & "\mdiatemp.tmp"
Case MTWave
MediaTemp = App.path & "\mdiatemp.wav"
Case MTAVI
MediaTemp = App.path & "\mdaitemp.avi"
Case MTMP3
MediaTemp = App.path & "\mdaitemp.mp3"
Case Else
rs.Close
Set rs = Nothing
MsgBox "Error retrieving object"
Exit Sub
End Select
Kill (MediaTemp)
若已经存在对应的媒体文件,则删除
DataFile = 1
Open MediaTemp For Binary Access Write As DataFile
打开对应的媒体文件(MediaTemp)往里写
If Err.Number = 70 Then
如果格式不支持,则报错并退出
MsgBox Err.Number & vbCr & vbCr & Err.Description & vbCr & vbCr & "this error may be due to " & _
"the media player holding a lock on a wav or avi file." & vbCr & "Close the mediaplayer and try again.", vbInformation, "SMITH MEDIA DEMO"
Err.Clear
rs.Close
Set rs = Nothing
Exit Sub
End If
lngTotalSize = rs!MediaBLOB.FieldSize
得到文件大小
Chunks = lngTotalSize \ ChunkSize
得到每个数据块大小
Fragment = lngTotalSize Mod ChunkSize
ReDim Chunk(ChunkSize)
从新申请所需的空间
Chunk() = rs!MediaBLOB.GetChunk(lngOffset, ChunkSize)
Put DataFile, , Chunk()
写入第一块
lngOffset = lngOffset + ChunkSize
Do While lngOffset < lngTotalSize
连续写入,直至完成
Chunk() = rs!MediaBLOB.GetChunk(lngOffset, ChunkSize)
Put DataFile, , Chunk()
lngOffset = lngOffset + ChunkSize
Loop
Close DataFile
关闭
filename = MediaTemp
ShellPlay MediaTemp
打开媒体文件
End Sub
Private Sub RefillGrid()
刷新网格显示纪录
Dim sSQL As String
Dim rs As Recordset
Dim lCurRow As Long
sSQL = "SELECT tblMedia.MediaID, tblMedia.MediaName, " & _
"tblMedia.MediaType, tblMedia.MediaDescription FROM " & _
"tblMedia ORDER BY tblMedia.MediaName"
Set rs = db.OpenRecordset(sSQL, dbOpenForwardOnly)
得到新的纪录集
With fa
setup grid
.Cols = 5
.FixedCols = 1
.ColWidth(1) = 0
.ColWidth(0) = 300
.AllowUserResizing = flexResizeBoth
.Rows = 1
.TextMatrix(0, 2) = "MediaName"
.TextMatrix(0, 3) = "Type"
.TextMatrix(0, 4) = "Description"
设置列头
fill grid
Do While Not rs.EOF
一行一行的添加纪录
lCurRow = .Rows
.Rows = .Rows + 1
.TextMatrix(lCurRow, 1) = CStr(rs!mediaid)
.TextMatrix(lCurRow, 2) = rs!MediaName
.TextMatrix(lCurRow, 3) = rs!MediaType
.TextMatrix(lCurRow, 4) = rs!MediaDescription
rs.MoveNext
Loop
rs.Close
Set rs = Nothing
End With
End Sub
Private Sub ResetForm()
清空各提示
txtName = ""
txtDescription = ""
Label3.Caption = ""
End Sub
Private Sub ShellPlay(ByVal sPath As String)
调用API函数ShellExecute打开对应的文件
Dim lret As Long
Dim sText As String
sText = Trim$(sPath)
lret = ShellExecute(hwnd, "open", sText, vbNull, vbNull, SW_SHOWNORMAL)
If lret >= 0 And lret <= 32 Then
MsgBox "error opening viewer program"
End If
End Sub
Private Sub Command1_Click()
删除纪录
Dim sSQL As String
sSQL = "DELETE * FROM tblMedia" 你这没加条件where...,应该是删除所有的纪录
db.Execute sSQL, dbFailOnError
RefillGrid
End Sub
Private Sub fa_Click()
得到选中纪录的ID值,用于标志选中的纪录
Dim mediaid As Long
If fa.MouseRow = 1 Then Exit Sub
mediaid = Val(fa.TextMatrix(fa.MouseRow, 1))
did = mediaid
End Sub
Private Sub fa_DblClick()
双击时先清空个提示信息,然后打开选中的文件
If fa.MouseRow = 0 Then Exit Sub
quick demo style
ResetForm
ReadFromDB
End Sub
具体参见http://expert.csdn.net/Expert/topic/2290/2290220.xml?temp=9.823024E-03
你可以先从数据库中读出存为一个临时文件,然后用API函数ShellExecute 打开此文件,他回自己调用相关联的程序打开文件的
读数据库就不用说了吧,播放就用API把读取得字节数组播放出来就可以了,哪有那么麻烦
API函数
Public Declare Function PlaySound Lib "winmm.dll" Alias "PlaySoundA" (ByVal lpszName As any, ByVal hModule As Long, ByVal dwFlags As Long) As Long
用得着如此麻烦么?使用ADODB中的Stream对象进行读出到硬盘,然后使用PlaySound播放