GELÖST - HILFE!! Plötzliche Exception

Datenbanklösungen mit AOO/LO

Moderator: Moderatoren

Brizzl
**
Beiträge: 34
Registriert: Di, 05.07.2011 13:50

GELÖST - HILFE!! Plötzliche Exception

Beitrag von Brizzl »

Hallo Leute,

ich weiss nicht mehr weiter, alle Versuche meinem Problem auf die Spur zu kommen bleiben ohne Erfolg. Bitte bitte helft mir :shock: :shock:

Folgende Ausgangssituation:
Windoof XP, OO3.2.1, JRE 6 U26, MySQL Server 5.1.49

In einem Writer Dokument gibt es ein Listenfeld, dass ich per Makro aus dem Resultset einer SQL Query füllen lasse. Das Makro wird über ein Ereignis beim Öffnen gestartet (ist jedoch irrelevant, da der Fehler auch kommt, wenn ich das Makro händisch starte).
Das Makro:

Code: Alles auswählen

	' Datenbankkontext erzeugen für SQL Zugriff
	oDatenbankKontext = CreateUnoService ( "com.sun.star.sdb.DatabaseContext" )
	' Datenquelle auswählen
	oDatenquelle = oDatenbankKontext.getByName( "MySQL-DB" )
	' Verbindung zur DB herstellen
	oVerbindung = oDatenquelle.getConnection( "user" , "password" )
	' Statement erzeugen
	oStatement = oVerbindung.createStatement
	
	' SQL Abfrage durchführen (SQL="SELECT `Kundenanschrift_lang` FROM `kunden` ORDER BY `Kundenanschrift_lang`")
	oResultSet = oStatement.executeQuery( sSQL )
	' SQL Datenbank schliessen
	oVerbindung.close()

	oDoc = thisComponent 							' das Dokument
	oDocCrl = oDoc.getCurrentController()			' 
	oDrawpage = oDoc.Drawpage 						' Zeichenfläche des Formulars einer Datenbank
	oForm = odrawpage.Forms.getByName("Formular") 	' Das Formular selbst
	oList = oForm.getByName(sListName) 				' Das Kontrollelement
	oCtlListView = oDocCrl.GetControl(oList)		' View auf das Kontrollelement

	' Listenfeld vor dem Füllen leeren
	oCtlListView.removeItems ( 0, oCtlListView.getItemCount() )

	EintragNr = 1
	If Not IsNull ( oResultSet ) Then
XXX		While oResultSet.next
			oCtlListView.addItem ( oResultSet.getString ( iStringNoInResult ), EintragNr )
			EintragNr = EintragNr + 1
		Wend 
	End If
An der Stelle XXX wird beim Ausführen die Fehlermeldung:

BASIC-Laufzeitfehler.
Es ist eine Exception aufgetreten
Type: com.sun.star.lang.DisposedException
Message: .

ausgegeben.
Jetzt habe ich schon versucht das ganze zu debuggen - also Breakpoint bei XXX gesetzt und im "Beobachten"-Fenster das Object "oResultSet" aktiviert. Nach Makrostart bleibt die Ausführung am Breakpunkt stehen und er zeigt mir im Fenster:
[+] oResultSet ....... Typ com.sun.star.sdb.OResultSet
an - der Klick auf das [+] wird aber immer(!) ohne Ausnahme mit einem Komplettabsturz der OpenOffice Anwendung quittiert.

Inzwischen habe ich OO3.3 installiert, JavaRunTime neu installiert, OO3.2.1 wieder installiert, Windows geprüft, Registry überprüft.....ohne jeglichen Erfolg.

Die Datenbank-Tabelle bekomme ich mit den OO-Datenquellen-Navigator angezeigt, ich kann sie öffnen und die Datensätze ausgeben lassen. An der DB Verbindung scheint es also nicht zu liegen.

Und jetzt wird's mysteriös - die selbe Vorlage (definitiv nicht geändert) lief vor 1,5 Wochen noch einwandfrei - alles (!) funktionierte auf meinem und auf zwei anderen PC's im Netz. Jetzt funktioniert es weder bei mir noch auf den anderen PC's - überall kommt der selbe Fehler.

Hat irgendwer schonmal ein ändliches Problem gehabt oder kann mir einen Tipp geben wie ich weiter der Ursache auf die Schliche komme?
Ich hatte die Vermutung, dass es an der Installation von OO3.3 lag, da erst danach dieses Problem auftrat - aber da es auf den 3.2.1er PC's im Netzt auch nicht geht, ist auch diese Vermutung nicht belegbar... Ich raufe mir echt meine wenigen Haare aus wenn das nicht mehr funzt...

Im Voraus besten Dank

Grüße
Sascha
Zuletzt geändert von Brizzl am Mo, 01.08.2011 13:52, insgesamt 1-mal geändert.
Brizzl
**
Beiträge: 34
Registriert: Di, 05.07.2011 13:50

Re: HILFE!! Plötzliche Exception

Beitrag von Brizzl »

Neue Erkenntnisse:

Ich hatte vor ein paar Tagen die Base Datenbank, die die Verbindung zur SQL Datenbank herstellt, dahingehend angepasst, dass die Verbindung kein Kennwort benötigt (Datenbank -> Eigenschaften -> Kennwort erforderlich = nein), da ich im Makro das Passwort übergebe.

Ich habe eben diesen Haken wieder reingesetzt, also das Kennwort wieder auf erforderlich gesetzt und dann die Vorlage gestartet. WIeder bleibt er im Makro hängen - bringt jedoch einen Dialog zur Kennworteingabe. Also habe ich die Exception bestätigt dann das Kennwort eingegeben und erneut das Makro händisch gestartet - diesmal lief es durch. Was läuft hier denn falsch?
F3K Total
********
Beiträge: 3720
Registriert: Mo, 28.02.2011 17:49

Re: HILFE!! Plötzliche Exception

Beitrag von F3K Total »

Hi,
nur eine Vermutung, versuch es doch mal mit:

Code: Alles auswählen

   EintragNr = 0
   If Not IsNull ( oResultSet ) Then
        While oResultSet.next
         EintragNr = EintragNr + 1
         oCtlListView.addItem ( oResultSet.getString ( iStringNoInResult ), EintragNr )
      Wend
   End If
nicht dass du über den letzten Datensatz des ResultSet hinauszählst.

Gruß R
Brizzl
**
Beiträge: 34
Registriert: Di, 05.07.2011 13:50

Re: HILFE!! Plötzliche Exception

Beitrag von Brizzl »

nicht dass du über den letzten Datensatz des ResultSet hinauszählst
Danke für den Tipp, hat aber leider keine Änderung gebracht. Beim Debuggen kommt die Exception auch sofort beim ersten Anlauf.
F3K Total
********
Beiträge: 3720
Registriert: Mo, 28.02.2011 17:49

Re: HILFE!! Plötzliche Exception

Beitrag von F3K Total »

Hallo Brizzl,
was mir noch auffällt:
1.) Die Abfrage der Datenbank ist auskommentiert, muss es nicht heissen:

Code: Alles auswählen

sSQL="SELECT `Kundenanschrift_lang` FROM `kunden` ORDER BY `Kundenanschrift_lang`"
2.) Wo ist "iStringNoInResult" definiert? Kann ich nicht finden.
An der Stelle steht normalerweise die laufende Nummer der gefragten Spalte aus dem Resultset, in Deinem Falle ist es die erste Spalte "Kundenanschrift_lang".
Versuch doch noch mal folgendes:

Code: Alles auswählen

   EintragNr = 1
   If Not IsNull ( oResultSet ) Then
     While oResultSet.next
         oCtlListView.addItem ( oResultSet.getString (1), EintragNr )
         EintragNr = EintragNr + 1
      Wend
   End If
Gruß R
Brizzl
**
Beiträge: 34
Registriert: Di, 05.07.2011 13:50

Re: HILFE!! Plötzliche Exception

Beitrag von Brizzl »

Hi F3K Total,
Wo ist "iStringNoInResult" definiert? Kann ich nicht finden.
Die Variable kommt als Übergabeparameter in die Sub:

Code: Alles auswählen

Sub FillListFeld ( sListName, sSQL, iStringNoInResult )
Da ich diese Sub für mehrere Listenfelder in dem Dokument verwende sind die Parameter nicht konstant. In diesem Exception-Fall wird eine 1 übergeben. sSQL wird auch übergeben, ebenso der Name des Listenfeldes.

Trotzdem vielen Dank für den Tipp.

Grüße
Sascha
F3K Total
********
Beiträge: 3720
Registriert: Mo, 28.02.2011 17:49

Re: HILFE!! Plötzliche Exception

Beitrag von F3K Total »

Hallo Brizzl,
da bin dann mit meinem Latein am Ende, aber:
viewtopic.php?f=8&t=29462&start=0
Hier wurde ein ähnliches Problem schonmal gelöst, vielleicht hilft Dir der Thread.

Gruß R
DPunch
*******
Beiträge: 1112
Registriert: Mo, 02.11.2009 16:16
Wohnort: Marburg

Re: HILFE!! Plötzliche Exception

Beitrag von DPunch »

Aloha

Nimm mal

Code: Alles auswählen

oVerbindung.close()
raus.
Die Verbindung wird sowieso mit dem Sterben des Verbindungsobjektes geschlossen - wenn Du "oVerbindung" nicht als Private/Public/Global deklariert hast also mit dem Ende der Prozedur, in der Du das Verbindungsobjekt erstellt hast.
Brizzl
**
Beiträge: 34
Registriert: Di, 05.07.2011 13:50

GELÖST - Re: HILFE!! Plötzliche Exception

Beitrag von Brizzl »

Hi,

ich habe den Code

Code: Alles auswählen

oVerbindung.close()
rausgenommen und es funktioniert.
Durch die Einstellung "Kennwort erforderlich" in der Base Datenbank tritt der Fehler ebenfalls nicht mehr auf.

Warum jedoch die Anweisung

Code: Alles auswählen

If Not IsNull ( oResultSet )
nicht greift und er dennoch den Zugriff auf oResultSet zuläßt ist mir ein Rätsel. Eigentlich sollte die Abfrage
genau diesen Zugriff auf den Nullpointer verhindern.

Jedenfalls vielen vielen Dank für die Hilfe. :D :D :D
DPunch
*******
Beiträge: 1112
Registriert: Mo, 02.11.2009 16:16
Wohnort: Marburg

Re: GELÖST - Re: HILFE!! Plötzliche Exception

Beitrag von DPunch »

Aloha
Brizzl hat geschrieben:Warum jedoch die Anweisung

Code: Alles auswählen

If Not IsNull ( oResultSet )
nicht greift und er dennoch den Zugriff auf oResultSet zuläßt ist mir ein Rätsel.
Weil "oResultSet" nicht NULL ist und mit dieser Zuweisung

Code: Alles auswählen

oResultSet = oStatement.executeQuery( sSQL )
auch nie NULL sein kann. Du kannst Dir die Sicherheitsabfrage mit "isNull" also sparen - sie ist schlicht wirklungslos.
Was hier passiert, ist, dass durch das Schliessen der Verbindung das Statement disposed (geschlossen) wird und dadurch wiederum das ResultSet - das ResultSet ist keine Nullreferenz, sondern nur ein Objekt, dass quasi keine Funktionalität mehr bereitstellt. Wird trotzdem versucht, darauf zuzugreifen, muss das ResultSet die DisposedException werfen.
Antworten