RuntimeException bei result.Next nach SQL-executeQuery

Programmierung unter AOO/LO (StarBasic, Python, Java, ...)

Moderator: Moderatoren

juetho
******
Beiträge: 617
Registriert: Di, 20.04.2010 15:46
Wohnort: Berlin

RuntimeException bei result.Next nach SQL-executeQuery

Beitrag von juetho »

In einem Makro frage ich zunächst in einem Dialog eine Variable ab, die für die WHERE-Bedingung bei einem SELECT genutzt wird. Zunächst klappte das mehrfach. Seit ich das Arbeitsverzeichnis neu gesetzt hatte, gibt es nur noch Fehler. Mein Arbeitsablauf:

Unproblematischer Teil, aber der Vollständigkeit halber abgedruckt:

Code: Alles auswählen

sub Fachlisten_erstellen
rem Variable 
Dim klasse As String
GlobalScope.BasicLibraries.LoadLibrary("Tools")
Path=createunoservice("com.sun.star.util.PathSettings")
Dim conn As Object 

rem Datenbankzugriff
oDBContext = CreateUnoService("com.sun.star.sdb.DatabaseContext")
dbSource = oDBContext.GetByName("Klassenlisten")    
path.work = DirectoryNameoutofPath(thisComponent.getUrl(), "/")
conn = dbSource.GetConnection("","")
"klasse" im Dialog abfragen und übernehmen, ebenfalls noch problemlos:

Code: Alles auswählen

oDialog1 = LoadDialog("Standard", "Klasse_abfragen")
oDialog1.SetTitle("Vorlagen für Fachliste erstellen")
iResult = oDialog1.Execute()
rem Abbruch bei Cancel oder falschem Wert
klasse = oDialog1.GetControl("input").Text
i = CInt(klasse)
if (iResult = 0) or (i < 1) or (i > 13) then
  exit sub
end if
oDialog1.Dispose()
Jetzt wird der SQL-Befehl vorbereitet und ausgeführt, danach knallt es:

Code: Alles auswählen

rem hole die Fächer der gewünschten Klasse per SQL
cmd = conn.CreateStatement()
cmdString = "SELECT Kuerzel, Titel, Fachname, Lehrer, Teilnahmevermerk " & chr(13) _
		& "FROM Fachliste WHERE Klasse = " & klasse
' msgbox cmdstring   nur zur Kontrolle, er sieht sauber aus
result = cmd.executeQuery(cmdString)
if IsNull(result) then
	msgbox "Keine Datensätze gefunden"
else
	while result.Next()		''' Hier knallt es !!!!!!
		Fachliste_Erstellen(	 conn,	 					  _
			klasse,				 result.getString(1), _
			result.getString(2), result.getString(3), _
			result.getString(4), result.getString(5) )
	wend
end if
end sub
Die Sicherheitsabfrage IsNull wird mit false festgestellt. Bei result.Next kommt eine seltsame Fehlermeldung:
Fehlermeldung hat geschrieben:BASIC-Laufzeitfehler.
com.sun.star.uno.RuntimeException
Message: .
Was kann da passiert sein? Datensätze sind unverändert vorhanden, es sei denn, sie werden (warum auch immer) nicht mehr bereitgestellt. Welche Möglichkeiten habe ich, die Exception genauer zu untersuchen? Muss ich die Connection freigeben? Wenn ja, wann und wie? (Bisher habe ich sie offen gelassen, weil sie in der while-Schleife in jedem Durchgang für einen weiteren SELECT-Befehl benötigt wird.)

Ich habe viel versucht, auch den Parameter klasse (der als String deklariert ist, der einem Integer entspricht) in Hochkommata oder chr(34) eingebunden - keine Änderung.

Hilfe! Jürgen
Situation: LibO 3.6 auf Win 7 Home Premium (64-bit) mit MySQL (localhost) über JDBC
DPunch
*******
Beiträge: 1112
Registriert: Mo, 02.11.2009 16:16
Wohnort: Marburg

Re: RuntimeException bei result.Next nach SQL-executeQuery

Beitrag von DPunch »

Aloha
juetho hat geschrieben:Die Sicherheitsabfrage IsNull wird mit false festgestellt.
Ich weiss nicht, warum diese Sache teilweise auch in "Fach"-literatur so dargestellt wird, aber:
Das Ergebnis einer Abfrage über den DatabaseContext ist nie Null. Die Sicherheitsabfrage in dieser Form kannst Du Dir also sparen.

Code: Alles auswählen

cmdString = "SELECT Kuerzel, Titel, Fachname, Lehrer, Teilnahmevermerk " & chr(13) _
      & "FROM Fachliste WHERE Klasse = " & klasse
Zwei Sachen dazu, ohne dass es letztendlich die Ursache für den Fehler sein muss:
Ein Zeilenumbruch in einer SQL-Abfrage ist an sich keine gute Idee und immer eine potenzielle Fehlerquelle, je nach DBMS - spar dir das "Chr(13)", das, was Du erreichen willst, tut schon der Unterstrich (nämlich dass Du den Code über zwei Zeilen schreiben kannst).
Desweiteren *muss* die Abfrage von klasse in Hochkommata erfolgen, wenn es um einen String geht.

Die Fehlermeldung an sich ist nicht mit einem ganz bestimmten Fehler verbunbden, daher kann ich jetzt nicht viel dazu sagen, aber Du musst definitiv keine "Connection freigeben".
Ich würde an Deiner Stelle mal die "super" ( :? ) Debug-Möglichkeiten der OOo-IDE zum Einsatz bringen und einen Haltepunkt vor dem "Knallpunkt" setzen und die entsprechenden Variablen in den Beobachter packen.
juetho
******
Beiträge: 617
Registriert: Di, 20.04.2010 15:46
Wohnort: Berlin

Re: RuntimeException bei result.Next nach SQL-executeQuery

Beitrag von juetho »

Danke für die Hilfeversuche.
DPunch hat geschrieben:Das Ergebnis einer Abfrage über den DatabaseContext ist nie Null. Die Sicherheitsabfrage in dieser Form kannst Du Dir also sparen.
Das war ein Versuch, den Fehler einzugrenzen. Ich hatte es der Vollständigkeit halber hier angegeben.
Ein Zeilenumbruch in einer SQL-Abfrage ist an sich keine gute Idee und immer eine potenzielle Fehlerquelle...
Wenn das zu Fehlern führen kann, verzichte ich darauf. Ich wollte es nicht nur im Code, sondern auch in der MessageBox strukturiert lesen. Aber das ist natürlich unwichtig.
Desweiteren *muss* die Abfrage von klasse in Hochkommata erfolgen, wenn es um einen String geht.
Davon bin ich ausgegangen (schließlich habe ich das unter Wikibooks: Einführung in SQL selbst erläutert). Aber da der Inhalt eine Zahl ist, habe ich alles andere ausprobiert; und das war nicht der Fehler.
aber Du musst definitiv keine "Connection freigeben".
Gut zu wissen. Ich arbeite hauptsächlich mit dem Microsoft .NET Framework, und unter ADO.NET gibt es ConnectionPooling, und jede DbConnection ist "unverzüglich" mit Close und Dispose aufzulösen.
Die Fehlermeldung an sich ist nicht mit einem ganz bestimmten Fehler verbunden,..
Ich würde an Deiner Stelle mal die "super" ( :? ) Debug-Möglichkeiten der OOo-IDE ...
Unter .NET gibt es so etwas wie InnerException, StackTrace u.a. für genauere Untersuchungen; deswegen hatte ich so gefragt. Der Debugger ist natürlich eine Möglichkeit (beim nächsten Mal werde ich selbst daran denken); hier hat er aber zur weiteren Verwirrung beigetragen:
  1. Haltepunkt in der Zeile mit dem Fehler war zu spät: Die Exception kam zuerst.
  2. Haltepunkt in der Zeile davor hielt an. Einen Schritt weiter habe ich den "Beobachter" eingeschaltet und result untersucht.
  3. Beim Öffnen des Statements verabschiedete sich OOo komplett mit einer Fehlermeldung (die ich mir dummerweise nicht notiert hatte).
  4. Beim Neustart musste das Textdokument, das ich geöffnet hatte, wiederhergestellt werden; und es wurde ein Fehlerbericht erstellt.
  5. Beim Neustart des Makros lief es fehlerfrei durch!
Wir müssen es also als Mysterium zur Kenntnis nehmen - als einen Fehler, der durch eine unklare Arbeitssituation aufgetreten sein mag, sich manchmal wiederholen kann oder auch nach einem Neustart verschwindet.

Gibt es eine Möglichkeit, den Fehlerbericht einzusehen? (Ich bin per DSL ständig Online, also kann er bereits verschickt worden sein.)

Nun ja, niemand ist vollkommen, die EDV schon gar nicht. Wer wüsste das besser als ein Programmierer. :mrgreen:

Schönen Sonntag! Jürgen
Situation: LibO 3.6 auf Win 7 Home Premium (64-bit) mit MySQL (localhost) über JDBC
juetho
******
Beiträge: 617
Registriert: Di, 20.04.2010 15:46
Wohnort: Berlin

Re: RuntimeException bei result.Next nach SQL-executeQuery

Beitrag von juetho »

juetho hat geschrieben:Wir müssen es also als Mysterium zur Kenntnis nehmen - als einen Fehler, der durch eine unklare Arbeitssituation aufgetreten sein mag, sich manchmal wiederholen kann oder auch nach einem Neustart verschwindet.
So ist es offensichtlich. Inzwischen ist eine solche Exception an zwei anderen Stellen aufgetreten und war etwa nach dem dritten Neustart des Programms wieder verschwunden. Also gilt für mich die Devise: nicht ärgern, nur wundern! Jürgen
Situation: LibO 3.6 auf Win 7 Home Premium (64-bit) mit MySQL (localhost) über JDBC
Antworten