Problem mit Bildern (lo) / VB

Hallo liebe Community,

Ich habe ein kleines Problemchen und versuche es mal so detailiert wie möglich zu schildern und ich hoffe jemand kann mir helfen.

Erstmal einpaar fact´s:

Was tut der Programmteil?
Erstellen von druckbaren Berichten mit Bildinhalt

  • Bisher PostgreSQL 8.0 DB + ODBC Treiber 8.0 - KEINE PROBLEME
  • PostgreSQL 8.4 DB + ODBC Treiber 8.4 - PROBLEME
  • PostgeSQL 8.4 DB + ODBC Treiber 8.0 - KEINE PROBLEME

Kann es sein das sich irgendwie die syntax für large objects geändert hat?

Wie gesagt, unter 8.0 hat alles wunderbar funktioniert, hier ein Codeausschnitt aus dem Visual Basic Projekt.

Vielen Dank schonmal!

Function ADO_Fetch_Picture_FOR_PRINT(Adress_ID As Long, Optional Wund_Nr As Long, Optional LoescheFiles As Boolean) As String
On Error GoTo ADO_Fetch_Picture_FOR_PRINT_Error
   

   ' Fetch the first record present in MYTABLE with a lo object stored
   Dim SQL            As String
   Dim rs             As New ADODB.Recordset
   Dim fd             As Integer
   Dim flen           As Long
   Dim chunk()        As Byte
   Dim sngAspectRatio As Single
   Dim sngWidth       As Single
   Dim sngHeight      As Single
   Dim sngPosX        As Single
   Dim sngPosY        As Single
   Dim stdPic         As StdPicture
   Dim TempPath_DokuCare As String
   Dim HTML           As String
   
  

   ADO_Fetch_Picture_FOR_PRINT = ""
   
   TempPath_DokuCare = GetTempDir()    'Temp-Path einlesen
   
   If tmpZaehler = 0 Then
      tmpZaehler = 1
   End If
   
   If LoescheFiles = True Then
      Call Loesche_TMP_Files
   End If
   
   If Wund_Nr > 0 Then
      SQL = "select * from t_grafik where adress_id = " + Trim(Adress_ID) + " and grafikart_id = 2 and wund_nr = " + Trim(Wund_Nr) + " order by wund_nr, lupd "
   Else
      SQL = "select * from t_grafik where adress_id = " + Trim(Adress_ID) + " and grafikart_id = 2 order by wund_nr, lupd "
   End If
   Call rs.Open(SQL, db, adOpenDynamic, adLockOptimistic)

   If rs.BOF Then
      rs.Close
      Exit Function
   End If
   
   rs.MoveLast
   rs.MoveFirst
   
   Do While Not rs.EOF
   
      
      HTML = HTML + " <table border='0' width='100%' id='BildBewohner' > "
      
      ' Get the len of the stored object
      flen = rs!image.ActualSize
   
      ' Initialize the file where to store the blob
      fd = FreeFile
      Open TempPath_DokuCare + "\Nr" + Trim(tmpZaehler) + ".tnp" For Binary Access Write As fd
      
      ReDim chunk(1 To flen)
   
      ' Get it from the database
      chunk() = rs!image.GetChunk(flen)
      ' ... and store in the file
      Put fd, , chunk()
      
   
         HTML = HTML + " <tr>"
         HTML = HTML + "       <td width='70%' valign='top' > "
            HTML = HTML + " &nbsp   </td>"
         HTML = HTML + " </tr>"
         
   
         HTML = HTML + " <tr>"
         HTML = HTML + "       <td width='70%' valign='top' > "
            HTML = HTML + "  Wund-Nr:    " + Trim(rs.Fields("wund_nr")) + ";       " + "  Wunddatum:    " + Trim(rs.Fields("wann")) + ";       " + "  Wundbeschreibung:    " + Trim(rs.Fields("grafik_text")) + " </td>"
         HTML = HTML + " </tr>"
         
         HTML = HTML + " <tr>"
         HTML = HTML + "       <td width='70%' valign='top' > "
            HTML = HTML + "       <img border='0' src='" + Trim(TempPath_DokuCare) + "\Nr" + Trim(tmpZaehler) + ".tnp'  height='300' align='left'></td> "
         HTML = HTML + " </tr>"
   
      Close #fd
      HTML = HTML + " </table> "
      
      tmpZaehler = tmpZaehler + 1
      rs.MoveNext
   
   Loop
   
   ADO_Fetch_Picture_FOR_PRINT = HTML
   
   
   Exit Function
   
ADO_Fetch_Picture_FOR_PRINT_Error:
   
   ADO_Fetch_Picture_FOR_PRINT = ""
   
   Call error_handler(Err, "ADO_Fetch_Picture_FOR_PRINT", True)
   
   Set stdPic = Nothing
   
   Exit Function
   
   Resume
   
End Function

Und was ist jetzt genau das Problem? Wo tritt ein Fehler auf und welche Fehlermeldung erscheint?

oh sorry for lauter Fehlerbeschreibung den Fehler vergessen :wink:

also ich bekomm ne Fehlermeldung vom Programm beim generieren des Berichtes.
Beim Debugen hab ich festgestellt das er nach nach

ReDim chunk(1 to flen)

in den Error Handler springt :frowning: … flen is hierbei komischerweise “0”
zuvor wird ja flen bestimmt aus

flen = rs!image.ActualSize

… evtl is dort der Haase begraben?

Ich versuche halt herauszufinden was postgresql 8.4 hier anderst macht als 8.0…

Die eigentlich Fehlermeldung lautet “Index außerhalb des gültigen Bereichs in Funktion ADO_FETCH_PICTURE_FOR_PRINT”, dann wird der Bericht generiert aber ohne das Bild welches es anzeigen soll…

UPDATE

also es liegt definits an dem

flen = rs!image.ActualSize

habe das Programm nochmal laufen lassen mit PostgreSQL 8.0 und alle Werte/Parameter/Variablen sind Identisch zu beiden. Der Unterschied ist das flen unter 8.0 einen richtigen Wert ausgibt und nicht einfach nur “0”. Aber wie fixe ich das? Is da die Syntax nun anderst?

hat niemand eine idee die mich vielleicht weiterbringt ? :frowning:

Was gibt es denn konkret aus und was möchtest du erreichen?

Btw, läuft deine PostgreSQL Datenbank unter Windows?

ich möchte einfach die alte Funktionalität wie sie mit 8.0 funktioniert hat.
Ein blob (in dem fald eine Grafik) soll angezeigt werden in meinem Bericht.

Mit 8.0 Ging das problemlos aber seit 8.4 kommt die besagte Fehlermeldung.

Ja, der Server läuft unter Windows…

Gut, zuerst einmal: 8.0 unter Windows ist aufgrund diverser kritischer Fehler nicht mehr unterstützt.

Dann: kannst du eingrenzen, bis wohin das gleich funktioniert? Wenn du die Anfragen auf der Konsole eingibst, gibt es das gleiche Ergebnis? Wenn ja, ist entweder im ODBC-Treiber etwas kaputt oder in deiner Anwendung.
Wenn nicht: hast du den Fehler schon gefunden.

Bisher versuchst du, ausgehend von deiner als richtig und funktionierend eingestuften Anwendung (was aber falsch sein kann) von oben über dem Problem zu kreisen. Da drunter gibt es aber diverse Komponenten, die ausgetauscht wurden und die allesamt für den Fehler verantwortlich sein können.

es funktioniert alles identisch bis auf die stelle wo die “flen” berechnet wird aus “rs!image.GetActualSize”.
Dort wird eine 0 für flen zurückgegeben und nicht (wie in 8.0) die richtige grösse des Blobs…


hoffe ich hab deine frage richtig verstanden und das geantwortet was du hören wolltest :stuck_out_tongue:

Nun, was genau macht diese Stelle? Bisher sehe ich nur deinen Funktionscode, man kann aber nicht sehen, ob und wie dort irgendwelche Datenbankaktionen ausgeführt werden.

nunja, Datenbanktechnisch wird ja das SQL statement abgesetzt wie du aus dem oben codeausschnitt sehen kannst.
Beide SQL Statements sind gültig und im Debug-Direkfenster bekomme ich ein gültiges SQL Statement für 8.0 und 8.4 raus.
Ich sehe auch dass die Datenbankverbindung in beiden Fällen korrekt ist und das die db aufgemacht wird.

Was nun das rs!getActualSize genau macht kann ich dir nicht sagen da es eine vorgefertigte Funktion ist die zum ADO Teil gehört.
Ich finde einfach keinen Hinweis darauf warum er mir keine Feldlänge für mein Blob zurückgibt weil da liegt der haase begraben. Die Fehlermeldung kommt ja nur deswegen weil er mit der “0” als “flen” nichts anfangen kann.

Wenn du in beiden Fällen das exakt gleiche Ergebnis aus der Datenbank bekommst, kann es schon mal kein Datenbankproblem mehr sein.

Kann man das ADO debuggen? Zumindest das AdoDB von PHP kann man debuggen und man kann schauen, was das macht.
Vielleicht haben sich Datenstrukturen geändert oder Funktionsaufrufe … ab hier ist das aber eher ein VB Problem.

Hast Du es mal mit NPGSQL statt mit ODBC versucht? Npgsql - .Net Data Provider for Postgresql

wird warscheinlich nicht gehen da das Projekt nicht in .Net geschrieben ist. Is noch nen altmodisches VB6 Programm.

Ich hab etwas beim debuggen festgestellt.

An der Stelle (siehe Code)

rs.moveLast
rs.moveFirst

Wenn ich hier “rs.moveFirst” auskommentiere funktionierts. Aber nur für 1 Bild. Sobald es darum geht mehrere Bilder im Bericht anzuzeigen kommt wieder der gleiche fehler :frowning: … weiss jetzt net ob das ne besserung is ;D.

Ich würde nicht behaupten, dass das eine Verbesserung ist. Allerdings würde ich behaupten, dass du einfach nur blind herumsuchst :wink:
Wie wäre es, wenn du nun mal wirklich schaust, wie sich die Applikationen im Detail anders verhalten - und welche AdoDB Funktionen sich anders verhalten.
Meines Wissens hat deine Programmiersprache auch einen eingebauten Debugger.

danke erstmal für alle tipps :slight_smile:

also nochmal zur info, es liegt definitiv daran das der cursor/zeiger nicht richtig auf den datensatz zeigt. Hab das jetzt beim Debuggen festgestellt.

Gibts denn eine andere möglichkeit in VB per ODBC mehrere bilder in einer schleife anzeigen zu lassen? Beispielcode wäre richtig toll, bin ein relativer neuling im programmieren.

Hast du schon mal in einem VB Forum gefragt?

ups, ich dachte dashier wäre das postgresql Programmiererforum :slight_smile: … gitbs da noch ne extra VB sektion? Hab ich garnet gesehn :astonished: .

Das hier ist das PostgreSQL-Forum, richtig.
Aber keines, das sich um Programmieren mit VB dreht. Von daher würdest du wohl eher eine Antwort bekommen, wenn du in einem anderen Forum, welches sich mehr um das Programmieren mit VB dreht, deine Frage stellst. Hier programmieren imho recht wenig Leute mit VB.

Wenn dir DAO zur Verfügung steht (MS-Jet) könntest du testweise versuchen ADO zu ersetzen, um die Fehlerquelle besser einzugrenzen.