Announcement

Collapse
No announcement yet.

Bilder über VB.NET in ORDImage speichern

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

  • Bilder über VB.NET in ORDImage speichern

    Hallo liebe Forum Nutzer,

    Ich versuche schon seit einer Woche über VB ein Bild in eine ORACLE datenbank 11g zu speichern. Das Feld, in welches ich das Bild abspeichern möchte ist vom Objekt ORDSYS.ORDImage. Was ich bisher geschafft hab ist ein ORDImage-Objekt mit ORDImage.init() auf das Feld zu Instanziieren

    Ich greife mit einem OleDb Treiber auf die Datenbank zu. Mein code dazu sieht auszugsweise so aus:

    [highlight=vbnet]Dim oCommand As OleDb.OleDbCommand
    Dim sSQL As String = "INSERT INTO tblPicture (Name, Picture, Description) VALUES (?, ORDSYS.ORDImage.init(), ?)"

    oCommand = New OleDb.OleDbCommand(sSQL, Connection)

    Try
    With oCommand

    CommandType = CommandType.Text

    Dim name As OleDb.OleDbParameter = New OleDb.OleDbParameter("name", OleDb.OleDbType.Variant)
    name.Value = "someName"
    .Parameter.Add(name)

    Dim descr As OleDb.OleDbParameter = New OleDb.OleDbParameter("descr", OleDb.OleDbType.Variant)
    descr .Value = "Description"
    .Parameter.Add(descr )

    .ExecuteNonQuery()

    End With
    Catch ex As Exception

    MessageBox.Show(ex.ToString, "FAIL",......)
    End Try[/highlight]

    So bekomme ich schon mal einen Datensatz in die Tabelle.
    Jetzt möchte ich gerne das Bild in das ORDImage-Objet schreiben.
    Das mache ich indem ich ein UPDATE Statement mit Parametern ausführe:

    [highlight=vbnet]sSQLUpdate As String = "UPDATE tblPicture SET Picture=" & _
    "ORDSYS.ORDImage(ORDSYS.ORDSource(?,?,?,?,?,?),?,? ,?,?,?,?,?)"[/highlight]

    Diesen SQL String übergebe ich, wie zuvor, dem OleDbCommand und lege für die "?" folgende Parameter fest

    [highlight=vbnet]
    ORSYS.ORDImage(ORDSYS.ORDSource(conetent As BLOB,
    srcType as varchar2,
    srcLocation as varchar2,
    srcName as varchar2,
    updateTime as Date,
    local as Number),
    height as Number,
    Width as Number,
    ContentLength as Number,
    FileFormat as Number,
    ContentFormat as Number,
    CompresstionFormat as Number,
    MimeType as Number)[/highlight]

    Der content Parameter ist ein Byte Array den ich vom Bild erstellt habe:

    [highlight=vbnet]
    Dim asPicture as Byte() {}
    fs = New FileStream("DateiName", FileMode.Open)
    fi = New FileInfo("DateiName")

    Try
    Dim lTemp As Long = fi.Length
    Dim iLength As Integer = Convert.ToInt32(lTemp)
    ReDim abPicture(iLength - 1)

    fs.Read(abPicture, 0, iLength)
    fs.Close()

    Catch ex As Exception
    m_oMessages.ShowException(ex.ToString)

    End Try[/highlight]

    Die Parameterübergabe für das UPDATE Statement sieht so aus:

    [highlight=vbnet]
    Try

    sSQL = "UPDATE " & sTable & " SET PICTURE=ORDSYS.ORDImage(ORDSYS.ORDSource(?,?,?,?,? ,?),?,?,?,?,?,?,?) " & _
    "WHERE ID=323"
    oCommand = New OleDb.OleDbCommand(sSQL, m_oConnection)
    With oCommand
    .CommandType = CommandType.Text

    Dim blob As OleDb.OleDbParameter = New OleDb.OleDbParameter("blob", OleDb.OleDbType.LongVarBinary)
    blob.Value = abPicture
    blob.Direction = ParameterDirection.Input
    .Parameters.Add(blob)

    Dim srcType As OleDb.OleDbParameter = New OleDb.OleDbParameter("srcType", OleDb.OleDbType.Variant)
    srcType.Value = "FILE"
    srcType.Direction = ParameterDirection.Input
    .Parameters.Add(srcType)

    Dim srcLocation As OleDb.OleDbParameter = New OleDb.OleDbParameter("srcLocation", OleDb.OleDbType.Variant)
    srcLocation.Value = "C:\Bilder"
    srcLocation.Direction = ParameterDirection.Input
    .Parameters.Add(srcLocation)

    Dim srcName As OleDb.OleDbParameter = New OleDb.OleDbParameter("srcName", OleDb.OleDbType.Variant)
    srcName.Value = "DateiName.jpg"
    srcName.Direction = ParameterDirection.Input
    .Parameters.Add(srcName)

    Dim updateTime As OleDb.OleDbParameter = New OleDb.OleDbParameter("updateTime", OleDb.OleDbType.Date)
    updateTime.Value = System.DateTime.Today
    updateTime.Direction = ParameterDirection.Input
    .Parameters.Add(updateTime)

    Dim local As OleDb.OleDbParameter = New OleDb.OleDbParameter("local", OleDb.OleDbType.Decimal)
    local.Value = 1
    local.Direction = ParameterDirection.Input
    .Parameters.Add(local)


    Dim height As OleDb.OleDbParameter = New OleDb.OleDbParameter("height", OleDb.OleDbType.Decimal)
    height.Value = 480
    height.Direction = ParameterDirection.Input
    .Parameters.Add(height)

    Dim width As OleDb.OleDbParameter = New OleDb.OleDbParameter("width", OleDb.OleDbType.Decimal)
    width.Value = 640
    width.Direction = ParameterDirection.Input
    .Parameters.Add(width)

    Dim contentLength As OleDb.OleDbParameter = New OleDb.OleDbParameter("contentLength", OleDb.OleDbType.Decimal)
    contentLength.Value = abPicture.Length
    contentLength.Direction = ParameterDirection.Input
    .Parameters.Add(contentLength)

    Dim fileFormat As OleDb.OleDbParameter = New OleDb.OleDbParameter("fileFormat", OleDb.OleDbType.Variant)
    fileFormat.Value = ".jpg"
    fileFormat.Direction = ParameterDirection.Input
    .Parameters.Add(fileFormat)

    Dim contentFormat As OleDb.OleDbParameter = New OleDb.OleDbParameter("contentFormat", OleDb.OleDbType.Variant)
    contentFormat.Value = "byteArray"
    contentFormat.Direction = ParameterDirection.Input
    .Parameters.Add(contentFormat)

    Dim compressionFormat As OleDb.OleDbParameter = New OleDb.OleDbParameter("compressionFormat", OleDb.OleDbType.Variant)
    compressionFormat.Value = "jpg"
    compressionFormat.Direction = ParameterDirection.Input
    .Parameters.Add(compressionFormat)

    Dim mimeType As OleDb.OleDbParameter = New OleDb.OleDbParameter("mimeType", OleDb.OleDbType.Variant)
    mimeType.Value = "image/jpeg"
    mimeType.Direction = ParameterDirection.Input
    .Parameters.Add(mimeType)

    .ExecuteNonQuery()


    End With
    Catch ex As Exception
    MessageBox.Show(ex.ToString(),"FAIL",......)
    End Try[/highlight]

    Wenn ich den Code ausführe, bekomme ich zwar keine Fehlermeldung aber in der Datenbank steht immer noch nichts.
    Ich habe eine Web Applikation, mit der ich kontrollieren kann ob ich ein Bild speichern konnte oder nicht.
    Weiterhin kann ich über die Web App die Bilder aus der Datenbank Downloaden. Das habe ich für meinen Datensatz gemacht, jedoch kann ich das Bild weder öffnen, da es von einem Unbekannten Typ ist, noch hat die Datei eine anzahl von Bytes > 0

    Meine Frage ist nun: Wie kann ich über VB.NET ein ORDImage Objekt so ansprechen, dass ich die verschiedenen Felder für dieses Objekt richtig setzten kann.

    Ich habe in verschiedenen Foren gelesen das man über Java sich direkt ein Objekt im Programm anlegen kann. Gibt es so etwas vielleicht in VB auch? Das würde die ganze sache erheblich erleichtern, wenn man sich ein Objekt im Programm vom Typ ORDImage erstellt und das fertige Objekt dann nur noch hoch schicken brauch.

    Außerdem weiß ich das es eine Methode von ORDImage gibt, die die Parameter automatisch setzt

    [highlight=vbnet]setProperties()[/highlight]

    Ich weiß nur nicht wie ich diese Methode auf das Feld richtig ausführen soll.

    Danke für eure Hilfe schon im Vorraus!

    Ich hoffe dieser Beitrag ist besser geworden als der erste^^ Tut mir leid. Das ist mein erster Forum Beitrag.

    lg max
    Zuletzt editiert von rieber34; 12.04.2010, 12:53. Reason: [highlight=vbnet] eingefügt, künftig bitte selbst erledigen! Außerdem Einrückungen und etwas mehr Rechtschreibung (Großbuchstaben, Satzzeichen) bitte!

  • #2
    Hallo Max und willkommen,

    Originally posted by rieber34 View Post
    Ich weiß ich drück mich manchmal nicht ganz deutlich aus aber falls irgendjemand schon mal damit gearbeitet hat oder es schon mal hinbekommen hat BITTE meldet euch. das würde mir sehr weiter helfen!
    So ist es. Ohne Code-Formatierung, Einrückungen, Satzzeichen, Großbuchstaben machst du einem das Verständnis wirklich sehr schwer. Du willst Hilfe, also solltest du an die Helfer denken. Deshalb:

    Bitte gehe auf deinen ersten Beitrag mit "Editieren", dann auf "Erweitert", formuliere deine Frage verständlicher und kontrolliere es über die "Vorschau". Danke! Jürgen

    Comment


    • #3
      Hallo Max,

      ja, so ist es besser.

      Zur Sache kann ich sehr wenig sagen, da ich keine Erfahrung mit Oracle, VB und Bildern habe und auch den Vergleich mit Web/Java nicht kenne. Ich empfehle aber dringend, von Oledb zu einem speziellen Oracle-Provider zu wechseln: OleDb sollte nur verwendet werden, wenn es nichts anderes gibt; aber jeder spezielle DbProvider ist der allgemeinen Notlösung vorzuziehen.

      Siehe unter connectionstrings, wo auch Links zu finden sind.

      Gruß Jürgen

      Comment


      • #4
        Sehr vielen dank für deine Antwort. Ich werd es gleich mal ausprobieren!

        Falls jedoch noch irgend jemand Erfahrung in diesem Bereich hat würde ich mich sehr über Tips freuen!

        grüße, Max

        Comment


        • #5
          Ich habe jetzt den ODAC treiber 11.1 installiert und möchte mich zu der Oracle DB Verbinden.
          Beim öffnen der Verbindung bekomme ich diese Exception:

          Stack Trace:

          Code:
          Oracle.DataAccess.Client.OracleException     
          bei Oracle.DataAccess.Client.OracleException.HandleErrorHelper(Int32 errCode, OracleConnection conn, IntPtr opsErrCtx, OpoSqlValCtx* pOpoSqlValCtx, Object src, String procedure)
             bei Oracle.DataAccess.Client.OracleException.HandleError(Int32 errCode, OracleConnection conn, IntPtr opsErrCtx, Object src)
             bei Oracle.DataAccess.Client.OracleConnection.Open()
          Ich verbinde mich ganz normal mit einer OracleConnection:

          Code:
          Dim conn As OracleConnection = New OracleConnection("User Id = user; Password = passwort; Data Source = source)
          conn.Open()
          Hast du da vielleicht eine Idee woran das liegen könnte? Ich kann es aus der Fehlermeldung jedenfalls nicht erkennen.

          Danke schon mal im vorraus

          grüße, Max

          Comment


          • #6
            Ich habe keine Idee. Du kannst mit anderen Hinweisen auf connectionstrings herumspielen und probieren, oder du kannst zusätzlich den OracleConnectionStringBuilder verwenden.

            Jürgen

            Comment


            • #7
              Okay...danke

              Comment


              • #8
                Es klappt jetzt endlich! Das problem war anscheinend das ich SAP auf dem Rechner drauf hatte und dadurch ein Konflikt mit den Oracle Treibern hatte, da ja SAP auch auf eine Oracle DB zugreift

                Comment


                • #9
                  Originally posted by rieber34 View Post
                  Es klappt jetzt endlich! Das problem war anscheinend das ich SAP auf dem Rechner drauf hatte und dadurch ein Konflikt mit den Oracle Treibern hatte, da ja SAP auch auf eine Oracle DB zugreift
                  guten abend,
                  dieser fred liegt zwar schon ne weile zurück.
                  möchte aber das thema nochmal aufgreifen, da ich demnächst eine ähnliche aufgabe bekommen. lichtbilder (passbilder) in eine oracle-datenbank laden.

                  auf was hat sich dein "es klappt endlich" bezogen? auf den connect oder/und auf das ablegen des bildes als blob in der oracle-tabelle ?

                  bei mir werden es irgendwelche jpg-dateien sein.

                  viell. sollte ich noch erwähnen, das ich bzgl. von auslesen/anzeigen von bildern schonmal ein formular gebastelt habe. das wurden die bilder aber von einem java-programm eines kollegen, das eine oracle-prozedur aufgerufen hat, in die db eingeladen.

                  was ich jetzt machen möchte, ist eine auswahl eines bildes über den filedialog und anschliessend mit vb mitteln direkt in die db speichern.
                  Zuletzt editiert von tioga63; 31.08.2010, 20:54.

                  Comment


                  • #10
                    Hallo

                    Ich kann dir nur erklären wie das beim SQL Server funktioniert jedoch denke ich, dass dies auch für Oracle funktionieren sollte.

                    Code:
                            Dim obSearchImage As New OpenFileDialog
                            obSearchImage.Filter = "JPG Bilder (*.jpg)|*.jpg"
                            If obSearchImage.ShowDialog = Windows.Forms.DialogResult.OK Then
                                Dim txFile As String = obSearchImage.FileName
                                Dim obCommand As New SqlClient.SqlCommand("INSERT INTO tblImages(Image) VALUES(@Image)", pobConnection)
                                'Liest das File in ein Byte Array
                                Dim obFileStream As New IO.FileStream(txFile, IO.FileMode.Open)
                                Dim obBinaryReader As New IO.BinaryReader(obFileStream)
                                Dim arBytes() As Byte = Nothing
                                arBytes = obBinaryReader.ReadBytes(obFileStream.Length)
                                'Erstellt einen Parameter
                                Dim obImageParameter As New SqlClient.SqlParameter("@Image", SqlDbType.Binary, CObj(arBytes))
                                obCommand.Parameters.Add(obImageParameter)
                                'Führt das SQL Statement aus
                                pobConnection.Open()
                                obCommand.ExecuteNonQuery()
                                pobConnection.Close()
                            End If

                    Comment

                    Working...
                    X