热情软件屋

 

如何用SQL存储图片,再用VB调用这些图片


编号:QA004082
建立日期: 2001年4月9日 最后修改日期:2001年9月11日
所属类别:

鬼怪:
    操作系统: winnt
    编程工具: sql,vb
    问题: 如何用SQL存储图片???再用VB调用这些图片???
    水平: 刚入门

回答:

    Specner Yang的意见:
    较佳方式是使用 Stream object。微软有提供范例,而且使用对象刚好是SQL Server。
    微软的Knowledge Base的文章:“Q258038 HOWTO: 使用 ADO Stream 对象访问并修改 SQL Server BLOB 数据”
    
    徐法兵的意见:
    注:写图片文件到数据库
    Col为栏位名,ImgFile为要写到数据库的图片文件名,BockSize为每次写多少字节,缺省为每次写8K字节到数据库
    Public Sub WriteDB(Col As ADODB.Field, ImgFile As String, Optional BlockSize As Long=8192)
     Dim byteData() As Byte, FileLength As Long, NumBlocks As Integer
     Dim LeftOver As Long, SourceFileNum As Integer, i As Integer
    
     SourceFileNum = FreeFile
     Open ImgFile For Binary As SourceFileNum
     FileLength = LOF(SourceFileNum)
     If FileLength > 50 Then
     NumBlocks = FileLength \ BlockSize
     LeftOver = FileLength Mod BlockSize
    
     ReDim byteData(LeftOver)
     Get SourceFileNum, , byteData()
     Col.AppendChunk byteData()
     ReDim byteData(BlockSize)
     For i = 1 To NumBlocks
     Get SourceFileNum, , byteData()
     Col.AppendChunk byteData()
     Next
     End If
     Close SourceFileNum
    End Sub
    
    
    ImgFile为从数据库读出数据写到磁盘的文件名,BlockSize为每次向文件写多少个字节,缺省为8K字节,当ReadDB=True,得到图片文件後,可以用LoadPicter(图片文件名)显示图片到PictureBox或Image框中.
    Public Function ReadDB(Col As ADODB.Field, ImgFile As String,Optional BlockSize As Long=8192) As Boolean
     Dim byteData() As Byte, NumBlocks As Integer
     Dim LeftOver As Long, DestFileNum As Integer, i As Integer
     Dim ColSize As Long
    
     On Error GoTo ErrRead
     ReadDB = False
    
     'If Dir(ImgFile) <> "" Then Kill ImgFile
    
     DestFileNum = FreeFile
     Open ImgFile For Binary As #DestFileNum
    
     ColSize = Col.ActualSize
     NumBlocks = ColSize \ BlockSize
     LeftOver = ColSize Mod BlockSize
    
     ReDim byteData(LeftOver)
     byteData() = Col.GetChunk(LeftOver)
     Put DestFileNum, , byteData()
     ReDim byteData(BlockSize)
     For i = 1 To NumBlocks
     byteData() = Col.GetChunk(BlockSize)
     Put #DestFileNum, , byteData()
     Next
     If LOF(DestFileNum) > 200 Then ReadDB = True
     Close #DestFileNum
     Exit Function
    
    ErrRead:
     MsgBox "READ PICTURE ERR:" & Err.Number
     ReadDB = False
     Exit Function
    End Function//如果ReadDB=False则写文件失败。
    还有用此纯代码读取图片时,在代码调试中不会出现错误,在运行时如果快速浏览带有图片的记录时,会出现莫名其妙的程序死机.如上述代码,我都用了错误控制技术,但还是出现。
    我用的是VB6.0 ADO方法 + SQL SERVER 7.0(都是英文版)C/S架构,如有能够解决此死机问题的,请在下面继续贴出。
    
    xibeilang的意见:
    VB是0 BASE的数组,a(1)实际有两个元素,a(0),a(1),将
    ReDim byteData(LeftOver)
    改为ReDim byteData(LeftOver-1)
    并应该判断leftover是否为零。
    
    唐劲松的意见:
    建立连接 Adodc, 用Image 绑定该字段。
    
    fanfan的意见:
    可以试试用SQL Server来编写一个存储过程,通过参数传递image数据类型,并且可以在存储过程中将日志关闭,避免日志溢出,最后在vb里调用存储过程,就可以了。具体细节可以看vb和sqlserver的帮助文件。

此问题由徐法兵等回答。

附加关键字:编程, 源程序, programming, source code, Visual Basic, VB, 数据库, database, query

 
把这个问题推荐给朋友
   
   
您的意见类别
您的名字
您的电子邮件
您的建议(请尽可能详细)
 
 

版权所有 1997-2008 热情软件屋
如果您有任何建议和意见, 请给我发个电子邮件 askpro@china-askpro.com
Web Designed by ZebraStudio