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 + "   </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
oh sorry for lauter Fehlerbeschreibung den Fehler vergessen …
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 … 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?
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.
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 …
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.
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 … 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
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.
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.
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.