| |

ADO.NET / DatenbankenAnlagen in Access 2007 Datenbank - Bug ??? | |  | Autor: Coolzero | Datum: 08.06.10 19:49 |
| Da es mit Access 2007 ja nun endlich auch möglich ist Bilder und andere Dokumente direkt in der Datenbank zu speichern und zu verwalten (dafür gibt es den nene Felddatentyp 'Anlage'), wollte ich diese Möglichkeit gleich mal nutzen und in meinem aktuellen Projekt verwenden.
Nähere Infos dazu gibt es hier: http://blogs.msdn.com/b/access/archive/2007/08/24/adding-removing-and-saving-files-from-the-new-attachment-field-in-access-2007.aspx
In meiner Datenbank sind lediglich Mitgliederdaten enthalten (ID, Name, Bild, ...).
Im Bildfeld wird das Mitgliederbild binär (als Anlage) gespeichert.
Zum auslesen der Bilder benutze ich eine abgeänderte Version des Codes aus dem obigen Link (SaveAttachment) - Funktioniert einwandfrei . .
'Konstanten die zum abrufen von Anhängen in der Datenbank benötigt werden
Const m_strFieldFileName As String = "FileName" ' Der Name der angehängten Datei
Const m_strFieldFileType As String = "FileType" ' Die Dateiendung der
' angehängten Datei
Const m_strFieldFileData As String = "FileData" ' Der Inhalt der angehängten
' Datei (binär)
Shared dbEngine As New Dao.DBEngine
Shared db As Dao.Database
Shared rsMitglieder As Dao.Recordset
Shared rsMitglieder2 As Dao.Recordset2
Shared rsMitgliederField2 As Dao.Field2
db = dbEngine.OpenDatabase("Mitglieder.accdb", _
Microsoft.Office.Interop.Access.Dao.RecordsetTypeEnum.dbOpenSnapshot)
rsMitglieder = db.OpenRecordset("SELECT ID, Name, Bezahlt, Anwesend, Datum," & _
"Bild FROM Mitglieder")
While Not rsMitglieder.EOF
rsMitglieder2 = rsMitglieder.Fields("Bild").Value
While Not rsMitglieder2.EOF
rsMitgliederField2 = rsMitglieder2.Fields(m_strFieldFileData)
Dim ba(rsMitgliederField2.FieldSize - 20) As Byte
Array.Copy(rsMitgliederField2.Value, 20, ba, 0, _
rsMitgliederField2.FieldSize - 20)
Dim lvi As New ListViewItem
lvi.Text = rsMitglieder.Fields("Name").Value
Main.ImageList1.Images.Add(Bilder.ByteArray2Bitmap(ba))
lvi.ImageIndex = Main.ImageList1.Images.Count - 1
rsMitglieder2.MoveNext()
End While
rsMitglieder.MoveNext()
End While
Shared Function ByteArray2Bitmap(ByVal ByteArray As Byte()) As Bitmap
Using ms = New MemoryStream(ByteArray)
Dim img As Bitmap = DirectCast(Image.FromStream(ms), Bitmap)
Return img
End Using
End Function Hier habe ich nun ein kleines Problem bzw. eine Frage:
Den Anhang den man aus der Datenbank abfragt bekommt man als bytarray (rsMitgliederField2.Value) zurück.
Das Bild kann aber nicht angezeigt werden, da es am Anfang 20 Bytes zu viel hat. Um das zu verdeutlichen habe ich mal ein png erstellt: http://img18.imageshack.us/img18/9587/testti.png
Speichere ich das Bytearray direkt ab, erhalte ich dies (Hexansicht): ............p.n.g....PNG......
Bei dem Originalbild sieht das ganze so aus: .PNG........IHDR... ... .....s
Man sieht das die ersten 20 bytes gelöscht werden müssen um das PNG wieder anzeigbar zu machen.
Das erledige ich indem ich ein neues Bytearray erzeuge mit der Größe des Bytearray's des auszulesenden Bildes und dann einfach 20 bytes abziehe. Anschliessend wird mittels Array.Copy das Original Bytearray, beginnend ab Position 20, in das neue Bytearray kopiert.
Man kann die Bilder auch direkt auf die Festplatte in eine Datei speichern:
rsMitgliederField2.SaveToFile(rsMitglieder2.Fields(m_strFieldFileName).Value)) Ich will die Bilder aber im Programm verwenden ohne diese erst auf der Festplatte auszulagern.
(Sonst könnte ich mir ja die ganze Geschichte mit den Anhängen sparen )
Um nach dem ganzen erklären und zeigen nun mal zu meiner Frage zu kommen :
Ist das mit den 20 Bytes die zu viel sind ein Bug ? Oder kennt jemand eine einfachere Methode das Array zu 'kürzen' ?
http://coolzero.aucb.de |  |
 | Sie sind nicht angemeldet! Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.
Einloggen | Neu registrieren |
  |
|
Neu! sevEingabe 3.0 
Einfach stark!
Ein einziges Eingabe-Control für alle benötigten Eingabetypen und -formate, inkl. Kalender-, Taschenrechner und Floskelfunktion, mehrspaltige ComboBox mit DB-Anbindung, ImageComboBox u.v.m. Weitere InfosTipp des Monats Access-Tools Vol.1 
Über 400 MByte Inhalt
Mehr als 250 Access-Beispiele, 25 Add-Ins und ActiveX-Komponenten, 16 VB-Projekt inkl. Source, mehr als 320 Tipps & Tricks für Access und VB
Nur 24,95 EURWeitere Infos
|
|
|
Copyright ©2000-2025 vb@rchiv Dieter Otter Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.
Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel
|
|