vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
NEU! sevCoolbar 3.0 - Professionelle Toolbars im modernen Design!  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2025
 
zurück

 Sie sind aktuell nicht angemeldet.Funktionen: Einloggen  |  Neu registrieren  |  Suchen

ADO.NET / Datenbanken
Anlagen 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

alle Nachrichten anzeigenGesamtübersicht  |  Zum Thema  |  Suchen

 ThemaViews  AutorDatum
Anlagen in Access 2007 Datenbank - Bug ???6.165Coolzero08.06.10 19:49
Re: Anlagen in Access 2007 Datenbank - Bug ???4.315ModeratorDaveS08.06.10 21:37

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

Funktionen:  Zum Thema  |  GesamtübersichtSuchen 

nach obenzurück
 
   

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