Announcement

Collapse
No announcement yet.

PictureBox Databindings MSAccess

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • PictureBox Databindings MSAccess

    Hi
    ich habe eine MSAcess Datenbank und möchte mit VB.NET ein OLE Feld was ein
    Bild (Bitmap) darstellt in einer PicureBox anzeigen. Leider kann ich es über die Databindings nicht auswählen !?

    Wo ist das Problem und was kann ich dagegen tun ?

    Danke
    Jörg

  • #2
    Hallo,

    das folgende Beispiel demonstriert, wie man Grafiken aus einer ACCESS-Datenbank einfügen, auslesen und anzeigen kann:

    - ACCESS-Tabelle: Spalte Bild ist vom Typ OLE-Objekt <br>
    - OleDbCommand fügt Grafik über INSERT-Anweisung ein: INSERT INTO BILDER (Name, Bild) VALUES (Name, Bild) <br>
    - OleDbCommand + OleDbDataReader liest die Grafik über SELECT aus: SELECT ID, Name, Bild FROM BILDER WHERE (ID = ?)<br>
    - OleDbDataReader stellt BLOb-Daten zur Verfügung, die in ein Byte-Array abgelegt werden:<br>
    a) VB.NET: Dim aBLOb() As Byte = CType(aDR(2), Byte())<br>
    b) C#: byte[] aBLOb = (byte[])aDR[2];

    <pre>
    Imports System.IO
    Imports System.Data.OleDb
    ...
    Private Sub ButtonOPEN_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonOPEN.Click
    Dim aBMP As Bitmap
    Dim aOFDlg As New OpenFileDialog()
    aOFDlg.InitialDirectory = "C:\Temp"
    aOFDlg.Filter = "JPG-Grafiken (*.jpg)|*.jpg|Alle Dateien (*.*)|*.*"
    aOFDlg.FilterIndex = 1
    If aOFDlg.ShowDialog() = DialogResult.OK Then
    aBMP = New Bitmap(aOFDlg.FileName)
    PictureBox1.Image = aBMP
    End If
    End Sub

    Private Sub ButtonINSERT_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonINSERT.Click
    Dim aMS As MemoryStream = New MemoryStream()
    PictureBox1.Image.Save(aMS, System.Drawing.Imaging.ImageFormat.Jpeg)
    Dim aBLOb(Convert.ToInt32(aMS.Length)) As Byte
    aMS.Position = 0
    aMS.Read(aBLOb, 0, Convert.ToInt32(aMS.Length))
    OleDbConnection1.Open()
    Try
    OleDbCommandINSERT.Parameters(0).Value = TextBoxNAME.Text
    OleDbCommandINSERT.Parameters(1).Value = aBLOb
    Dim iResult As Integer
    iResult = OleDbCommandINSERT.ExecuteNonQuery()
    StatusBar1.Text = iResult.ToString()
    Catch err As System.Exception
    MessageBox.Show("Exception: " & err.Message, "Oops", MessageBoxButtons.OK, MessageBoxIcon.Error)
    Finally
    OleDbConnection1.Close()
    End Try
    End Sub

    Private Sub ButtonSELECT_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonSELECT.Click
    OleDbConnection1.Open()
    Try
    OleDbCommandSELECT.Parameters(0).Value = Convert.ToInt32(TextBoxID.Text)
    Dim aDR As OleDbDataReader = OleDbCommandSELECT.ExecuteReader()
    aDR.Read()
    StatusBar1.Text = aDR(1).ToString()
    Dim aBLOb() As Byte = CType(aDR(2), Byte())
    Dim aMS As MemoryStream = New MemoryStream(aBLOb)
    PictureBox1.Image = Image.FromStream(aMS)
    aDR.Close()
    Catch err As System.Exception
    MessageBox.Show("Exception: " & err.Message, "Oops", MessageBoxButtons.OK, MessageBoxIcon.Error)
    Finally
    OleDbConnection1.Close()
    End Try
    End Sub
    </pre&gt

    Comment


    • #3
      HHmm, danke für die schnelle Antwort, aber das Problem ist mir nicht klar - ich muss doch über den Objektinspector auf den Databindings die Eigenschaft zuweisen - das geht aber nicht

      Das Beispiel ist beantwortet mir die Frage leider auch nicht

      Gruß
      Jör

      Comment


      • #4
        Hallo,

        wenn man im OleDbDataAdapter die Funktion <b>Preview Data...</b> aufruft, wird deutlich, dass die ACCESS-Grafik als Byte-Array zurückgeliefert wird. Die Umwandlung in ein Image muss das eigene Programm erledigen - daher ist die direkte Zuordnung über den Properties Editor (<i>DataBindings | (Advanced) | Image = DataSet11-BILDER.Bild</i>) an dieser Stelle auch nicht erfolgreich. In der ACCESS-Datenbank wird die Spalte als <b>OLE-Objekt</b> deklariert, so dass neben der Grafik alle möglichen binären Daten dort rumliegen können! Hinter .NET steckt jedoch ein typsicheres Konzept, so dass die Verantwortung (Exception im Problemfall) auf <i>Image.FromStream</i> abgeschoben wird

        Comment


        • #5
          Bei ihrem Beispiel bekomme ich beim Select die folgende Meldung
          Exception: Die angegebene Umwandlung ist ungültig

          Das betrifft die CType Zeile

          Warum verstehe ich allerdings nicht
          Danke & Gruß
          J

          Comment


          • #6
            Hallo,

            wird auch wirklich ein binärer Inhalt in diesem Datensatz-Feld vorgefunden? Liefert die Datenbank NULL zurück

            Comment


            • #7
              Hier der Codeauszug
              Dim aDR As System.Data.OleDb.OleDbDataReader = cmd.ExecuteReader
              With aDR
              While .Read
              Dim myItem As New ListViewItem()
              myItem.Text = CStr(aDR("Name"))
              myItem.Tag = aDR("Index")
              myItem.ImageIndex = i

              Dim aBLOb() As Byte = CType(aDR("Bild"), Byte())
              Dim aMS As MemoryStream = New MemoryStream(aBLOb)
              Dim j As Long = aMS.Length()

              'Hier tritt der Fehler auf
              Dim b As Bitmap = New Bitmap(Image.FromStream(aMS))

              PictureBoxInfoLogo.Image = Image.FromStream(aMS)
              ImageListKategorie.Images.Add(Image.FromStream(aMS ))

              ListViewKategorie.Items.Add(myItem)
              i = i + 1
              End While
              End With

              Wo ist das Problem (ich sehe es leider nicht) ?

              Danke & Gruß
              J

              Comment

              Working...
              X