Sauver une image dans une DB Access

Bendes - 16 oct. 2000 à 00:46
cs_psycomel Messages postés 128 Date d'inscription lundi 17 février 2003 Statut Membre Dernière intervention 24 octobre 2006 - 5 janv. 2005 à 13:49
Y'a-t-il moyen de sauver une image dans un champs d'une table sous Access 2000 ?Si oui, sauriez-vous me dire comment. Merci

6 réponses

Oui, il faut déclarer un champ OLE (ou objet binaire dit BLOB !) dans la base.

Pour écrire/lire dans la base, il faut considérer l'image comme un fichier classique (nom.extension) et le traiter comme un fichier binaire, avec les méthodes GetChunck, AppendChunck, etc... ca se traite presque octet par octet. Je n'ai pas le temps de développer cela ici mais il existe de nombreuses solutions, plus ou moins OK, mais parfois très bien, sur le Web...

Amitiés - Renaud -
0
Merci, je v potasser cela...
0
Je viens de retrouver ce code, qui manipule des images (ou tout autre forme de fichier type Word, Excel et tout format d'images) depuis ou vers une base de données. ecrit pour une base ADo (SQL Server en l'occurence), il est facilement transposable.

Espérant que cela te serve !

Amitiés - renaud -

The code....

Private Sub Command1_Click()
MousePointer = vbHourglass
Dim cn As rdoConnection
Dim rs As rdoResultset, TempRs As rdoResultset
Dim cnstr As String, sqlstr As String
cnstr = "Driver={SQLServer};Server=myserver;Database=pubs;Uid=sa;Pwd="
sqlstr = "Select int1, char1, text1, image1 from chunktable"

rdoEnvironments(0).CursorDriver = rdUseServer
Set cn = rdoEnvironments(0).OpenConnection( _
"", rdDriverNoPrompt, False, cnstr)
On Error Resume Next
If cn.rdoTables("chunktable").Updatable Then
'table exists
End If
If Err > 0 Then
On Error GoTo 0
Debug.Print "Creating new table..."
cn.Execute "Create table chunktable(int1 int identity, " & _
"char1 char(30), text1 text, image1 image)"
cn.Execute "create unique index int1index on chunktable(int1)"
End If
On Error GoTo 0
Set rs = cn.OpenResultset(Name:=sqlstr, _
Type:=rdOpenDynamic, _
LockType:=rdConcurRowver)
If rs.EOF Then
rs.AddNew
rs("char1") = Now
rs.Update
rs.Requery
End If
Dim currec As Integer
currec = rs("int1")
rs.Edit
FileToColumn rs.rdoColumns("text1"), App.Path & "README.TXT", 102400
FileToColumn rs.rdoColumns("image1"), App.Path & "SETUP.BMP", 102400
rs("char1") = Now 'need to update at least one non-BLOB column
rs.Update

'this code gets the columnsize of each column
Dim text1_len As Long, image1_len As Long
If rs("text1").ColumnSize = -1 Then
'the function Datalength is SQL Server specific
'so you may have to change this for your database
sqlstr = "Select Datalength(text1) As text1_len, " & _
"Datalength(image1) As image1_len from chunktable " & _
"Where int1=" & currec
Set TempRs = cn.OpenResultset(Name:=sqlstr, _
Type:=rdOpenStatic, _
LockType:=rdConcurReadOnly)
text1_len = TempRs("text1_len")
image1_len = TempRs("image1_len")
TempRs.Close
Else
text1_len = rs("text1").ColumnSize
image1_len = rs("image1").ColumnSize
End If

ColumnToFile rs.rdoColumns("text1"), App.Path & " ext1.txt", _
102400, text1_len
ColumnToFile rs.rdoColumns("image1"), App.Path & "image1.bmp", _
102400, image1_len
MousePointer = vbNormal
End Sub

Sub ColumnToFile(Col As rdoColumn, ByVal DiskFile As String, _
BlockSize As Long, ColSize As Long)
Dim NumBlocks As Integer
Dim LeftOver As Long
Dim byteData() As Byte 'Byte array for LongVarBinary
Dim strData As String 'String for LongVarChar
Dim DestFileNum As Integer, i As Integer

' Remove any existing destination file
If Len(Dir$(DiskFile)) > 0 Then
Kill DiskFile
End If

DestFileNum = FreeFile
Open DiskFile For Binary As DestFileNum

NumBlocks = ColSize BlockSize
LeftOver = ColSize Mod BlockSize
Select Case Col.Type
Case rdTypeLONGVARBINARY
byteData() = Col.GetChunk(LeftOver)
Put DestFileNum, , byteData()
For i = 1 To NumBlocks
byteData() = Col.GetChunk(BlockSize)
Put DestFileNum, , byteData()
Next i
Case rdTypeLONGVARCHAR
For i = 1 To NumBlocks
strData = String(BlockSize, 32)
strData = Col.GetChunk(BlockSize)
Put DestFileNum, , strData
Next i
strData = String(LeftOver, 32)
strData = Col.GetChunk(LeftOver)
Put DestFileNum, , strData
Case Else
MsgBox "Not a ChunkRequired column."
End Select
Close DestFileNum

End Sub

Sub FileToColumn(Col As rdoColumn, DiskFile As String, _
BlockSize As Long)
'moves a disk file to a ChunkRequired column in the table
'A Byte array is used to avoid a UNICODE string
Dim byteData() As Byte 'Byte array for LongVarBinary
Dim strData As String 'String for LongVarChar
Dim NumBlocks As Integer
Dim filelength As Long
Dim LeftOver As Long
Dim SourceFile As Integer
Dim i As Integer
SourceFile = FreeFile
Open DiskFile For Binary Access Read As SourceFile
filelength = LOF(SourceFile) ' Get the length of the file
If filelength = 0 Then
Close SourceFile
MsgBox DiskFile & " empty or not found."
Else
' Calculate number of blocks to read and left over bytes
NumBlocks = filelength BlockSize
LeftOver = filelength Mod BlockSize
Col.AppendChunk Null

Select Case Col.Type
Case rdTypeLONGVARCHAR
' Read the 'left over' amount of LONGVARCHAR data
strData = String(LeftOver, " ")
Get SourceFile, , strData
Col.AppendChunk strData
strData = String(BlockSize, " ")
For i = 1 To NumBlocks
Get SourceFile, , strData
Col.AppendChunk strData
Next i
Close SourceFile
Case rdTypeLONGVARBINARY
' Read the left over amount of LONGVARBINARY data
ReDim byteData(0, LeftOver)
Get SourceFile, , byteData()
Col.AppendChunk byteData()
ReDim byteData(0, BlockSize)
For i = 1 To NumBlocks
Get SourceFile, , byteData()
Col.AppendChunk byteData()
Next i
Close SourceFile
Case Else
MsgBox "not a chunkrequired column."
End Select
End If

End Sub
0
Tous simplement merci
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_psycomel Messages postés 128 Date d'inscription lundi 17 février 2003 Statut Membre Dernière intervention 24 octobre 2006
5 janv. 2005 à 13:48
Salut à tous. Je moccupe en ce moment de stocker par programmation une image (ou fichier) dans un champ de type OLE dans une base Access.

Le but est de stocker une image dans la base de données afin de pouvoir les visualiser a travers un état.

Quand je me sert des methodes de conversion en longbinary, ainsi que les fonctions appendChunk (pour découper le fichier) (voir ici : [ http://www.vbfrance.com/forum.v2.aspx?ID=2790] ou http://www.vbfrance.com/code.aspx?ID=192); le fichier est stocké dans la base dans une valeur binaire et quand j'affiche l'état correspondant à la table j'ai des champs vides.

Quand j'insere dans ma table par exemple une image dans le champ de type OLE en faisant clik droit sur le champ et en choisissant le chemin du fichier il me renseigne sur l'exetuable qui va lire le fichier dans la cellule et le document est automatiquement visible dans l'état correspondant à la table.

quelle serait la solution pour faire comprendre à access quel type d'application peut ouvrir le fichier et ainsi qu'il puisse le lire dans l'état ??

Merci par avance.
0
cs_psycomel Messages postés 128 Date d'inscription lundi 17 février 2003 Statut Membre Dernière intervention 24 octobre 2006
5 janv. 2005 à 13:49
quelle serait la solution pour faire comprendre à access quel type d'application peut ouvrir le fichier et ainsi qu'il puisse le lire dans l'état ?? !! Par programmation !!!
0
Rejoignez-nous