ResultSet was set to forward only

Datenbanklösungen mit AOO/LO

Moderator: Moderatoren

bienlein
*
Beiträge: 13
Registriert: Sa, 16.10.2004 20:01

ResultSet was set to forward only

Beitrag von bienlein »

Hallo Leute,

ich habe ein Problem beim Ansprechen einer Tabelle. Das Öffnen funktioniert noch einwandfrei, wenn ich aber mit "first()" oder "last()" zu einem Datensatz springen will bekomme ich folgende Fehlermeldung:

Basic-Laufzeitfehler
Es ist eine Exception aufgetreten
Type: com.sun.star.sdbc.SQLException
Message: ResultSet was set to forward only

Mit "next()" kann ich die Datensätz wechseln, aber das sagt ja schon die Meldung.

Auchso die Datenbank öffne ich wie folgt und es ist eine HSQLDB:

Code: Alles auswählen

	DatabaseContext = createUnoService("com.sun.star.sdb.DatabaseContext")
	oDatenquelle = DatabaseContext.getByName("bema8")
	oDatVerb = oDatenquelle.getConnection("","")
	oStatement = oDatVerb.createStatement()
	
	sSql = " SELECT ""Autor_ID"", ""Name_Vorname"" From ""Kuenstler_Ansicht"" WHERE ""Name_Vorname"" = '" &_
			 s & "'"

	'Msgbox sSql
	OErgSet = oStatement.executeQuery(sSql)
	OErgSet.first()   'Fehlermeldung
	OErgSet.next()

'	OErgSet.absolute(1)

	Hohl_Autor_ID = OErgSet.GetInt(1)
	OErgSet.Close()	
	oStatement.close()
	oDatVerb.close()

Gibt es noch irgendeine Einstellung um das ResultSet anders zu öffnen, damit auch die Befehle wie first und last funktionieren??

Gruß Matthias
Strat49
**
Beiträge: 40
Registriert: Fr, 15.09.2006 13:19
Wohnort: Bremen
Kontaktdaten:

Beitrag von Strat49 »

Hallo Matthias,

du hast eine Angabe zum ResultSetType vergessen, daher funktioniert das Bewegen innerhalb des ResultSets nicht.

Nach der Zeile

Code: Alles auswählen

oStatement = oDatVerb.createStatement() 
musst du noch den ResultSetType festlegen:

Code: Alles auswählen

oStatement.ResultSetType = com.sun.star.sdbc.ResultSetType.SCROLL_SENSITIVE
Danach geht es dann mit der SQL-Abfrage weiter.

Du musst aber unbedingt darauf achten. dass der ResultSetType vollständig in Großbuchstaben geschrieben wird, sonst klappt 's nämlich nicht. Anstelle des Schlüsselwortes kannst du auch die Konstante 1004 eingeben, die ein Ersatz für das Schlüsselwort ist:

Code: Alles auswählen

oStatement.ResultSetType = com.sun.star.sdbc.ResultSetType = 1004
Gruß
Norbert
OOo 2.0.4 unter Suse Linux 10.0
bienlein
*
Beiträge: 13
Registriert: Sa, 16.10.2004 20:01

Beitrag von bienlein »

Hallo Norbert,

danke für die schnelle Antwort, ich habe es so hinbekommen.
Leider stehe ich schon vor dem nächsten Problem. Ich wollte in einer anderen Funktion einen Datensatz hinzufügen und habe das Resultset auf UPDATABLE umgestellt. Nur bekomme ich bei updateString(1, MajZahl) immer die Fehlermeldung, daß das Resultset auf Readonly steht.

Mein Code sieht so aus:

Code: Alles auswählen

	DatabaseContext = createUnoService("com.sun.star.sdb.DatabaseContext")
	oDatenquelle = DatabaseContext.getByName("bema")
	oDatVerb = oDatenquelle.getConnection("","")
	oStatement = oDatVerb.createStatement()
'	oStatement.ResultSetType = com.sun.star.sdbc.ResultSetType.SCROLL_SENSITIVE 
'	oStatement.ResultSetConcurrency = com.sun.star.sdbc.ResultSetConcurrency.UPDATABLE
	oStatement.ResultSetConcurrency = 1008
'	oStatement.ResultSetType = com.sun.star.sdbc.ResultSetType.SCROLL_SENSITIVE 
	oStatement.ResultSetType = 1005
	
	sSql = " SELECT * From ""Autor"" ORDER BY ""Autor_ID"" ASC"

	'Msgbox sSql
	OErgSet = oStatement.executeQuery(sSql)	
	Msgbox isReadOnly(oErgSet)

'	oStatement.setReadonly(false) ' = false
	OErgSet.last()
	if OErgSet.getrow() <> 0 then
		MyZahl = OErgSet.getInt(1)
		MyZahl = MyZahl + 1
			oErgSet.Next()
			Msgbox OErgSet.getrow()
			oErgSet.updateString(1, MyZahl)
			oErgSet.insertRow()
	else
		beep : exit sub
	endif 
Hat jemand eine Idee wo noch ein Fehler stecken könnte?

Gruß Matthias
Strat49
**
Beiträge: 40
Registriert: Fr, 15.09.2006 13:19
Wohnort: Bremen
Kontaktdaten:

Beitrag von Strat49 »

Hallo Matthias,

wenn du noch bis zum Wochenende warten kannst , will ich mich gerne um eine Lösung bemühen, da ich diese so auch nicht aus dem Ärmel schütteln kannst. Leider habe ich vorher keine Zeit zum Ausprobieren und Herumbasteln.

Wenn also ein anderer vorher eine Lösung kennt, bitte posten

Gruß
Norbert
OOo 2.0.4 unter Suse Linux 10.0
bienlein
*
Beiträge: 13
Registriert: Sa, 16.10.2004 20:01

Beitrag von bienlein »

Hallo Norbert,

sicher kann ich auch noch bis zum Wochende warte ich habe ja hier noch genug zu basteln.

Gruß Matthias
Strat49
**
Beiträge: 40
Registriert: Fr, 15.09.2006 13:19
Wohnort: Bremen
Kontaktdaten:

Beitrag von Strat49 »

Hallo Matthias,

offensichtlich hatte noch kein anderer eine Lösung. Leider auch ich nicht.

Ich habe mir eine Datenbank "TestDB" mit der Tabelle "Autor" erstellt mit den Feldern "Autor_ID", "Vorname" und "Nachname". Dann habe ich ein paar Datensätze eingegeben. Das ResultSet in Basic habe ich dann extra auf UPDATABLE gesetzt.

Deinen Code habe ich einmal so verkürzt:

Code: Alles auswählen

	DatabaseContext = createUnoService("com.sun.star.sdb.DatabaseContext")
	oDatenquelle = DatabaseContext.getByName("TestDB")
	oDatVerb = oDatenquelle.getConnection("","")
	oStatement = oDatVerb.createStatement()
	oStatement.ResultSetConcurrency = com.sun.star.sdbc.ResultSetConcurrency.UPDATABLE
	oStatement.ResultSetType = com.sun.star.sdbc.ResultSetType.SCROLL_SENSITIVE
	sSql = "SELECT * FROM ""Autor"" ORDER BY ""Autor_ID"" ASC"
	oErgSet = oStatement.executeQuery(sSql)
	
	oErgSet.Last()
	if OErgSet.getrow() <> 0 then
    	MyZahl = OErgSet.getInt(1)
    	MyZahl = MyZahl + 1
	end if   
	MsgBox MyZahl
	oErgSet.moveToInsertRow()
	oErgSet.updateInt(1, MyZahl)
   oErgSet.insertRow()
Dieser Code entspricht auch dem Beispiel im Buch von Toxitom über OOo-Makros auf den Seiten 505/506 (Schreibfehler habe ich jedenfalls nicht entdeckt). Trotzdem bleibt das ResultSet auf ReadOnly, was ich nicht verstehe. Auch Rumbasteleien mit Hochkommas, Klammern und dgl. haben nur wieder zu irgendwelchen anderen Fehlern geführt. Jetzt bin ich natürlich auch ratlos, da ich in ein paar Tagen in meiner Datenbank auch so weit bin, dass ich neue Daten aus Dialogen über Makros einfügen möchte. Bisher hatte ich mich erst mit dem Design und noch nicht mit der "Technik" beschäftigt. Das hier entmutig mich natürlich schon ein wenig.

Gruß von einem hilflosen
Norbert
OOo 2.0.4 unter Suse Linux 10.0
bienlein
*
Beiträge: 13
Registriert: Sa, 16.10.2004 20:01

Beitrag von bienlein »

Hallo Norbert,

ich habe es so bis jetzt auch noch nicht hinbekommen. Allerdings habe ich meine Funktion so verändert, daß ich jetzt mit der INSERT Methode direkt einen neuen Datensatz erzeuge.

Allerding ist hiermit immer noch nicht das Problem behoben, wenn man einen vorhandenen Datensatz verändern will.

Vielleicht finden wir ja noch eine Lösung.

Gruß Matthias
Mihilist
****
Beiträge: 120
Registriert: Di, 25.04.2006 15:27
Wohnort: Nürnberg
Kontaktdaten:

Anderes Problem

Beitrag von Mihilist »

Strat49 hat geschrieben:du hast eine Angabe zum ResultSetType vergessen, daher funktioniert das Bewegen innerhalb des ResultSets nicht.

Nach der Zeile

Code: Alles auswählen

oStatement = oDatVerb.createStatement() 
musst du noch den ResultSetType festlegen:

Code: Alles auswählen

oStatement.ResultSetType = com.sun.star.sdbc.ResultSetType.SCROLL_SENSITIVE
Danach geht es dann mit der SQL-Abfrage weiter.
Ich hab das mal probiert und nun ein sehr seltsames Problem... Erstmal mein Code:

Code: Alles auswählen

	IF pfdia.GetControl("cmbFeld").Text = "" THEN
		sFilter = ""
	ELSE
		sFilter = "WHERE " + pfdia.GetControl("cmbFeld").Text + " " + pfdia.GetControl("cmbVerkn").Text + " " + pfdia.GetControl("cmbWert").Text 
	END IF

	oStatement = ThisComponent.Drawpage.Forms.getByName("frmMain").ActiveConnection.CreateStatement
	oStatement.ResultSetType = com.sun.star.sdbc.ResultSetType.SCROLL_SENSITIVE
	IF pfdia.Model.Step = 1 THEN
		'Personendaten holen...
		oRS = oStatement.ExecuteQuery("SELECT PID, Anrede, Titel, Name, Vorname FROM test_Person " + sFilter + " ORDER BY Name")
	ELSE
		'Firmendaten holen...
		oRS = oStatement.ExecuteQuery("SELECT FID, Firmenname, Ort, Land, Branche FROM test_Firma " + sFilter + " ORDER BY Firmenname")
	END IF

	oListbox = pfdia.GetControl("ListBox1")
	oListbox.removeItems(0, oListbox.getItemcount)

	oRS.Last
	msgbox oRS.getRow
Soweit, so gut. Beim ersten Ausführen sprach die MsgBox von 0, beim zweiten Mal von 29 und seit dem dritten mal von ca. 19x.xxx.xxx Zeilen... die x-Stellen variieren jedesmal. Die tatsächliche Zeilen-Anzahl ist 10911... sieht jemand meinen Fehler? Ich vermute, dass es irgendwas mit dem scrollbaren ResultSet zu tun hat, weil ich sowas bisher nicht verwendet hab, und so ein Fehler bisher nicht auftrat.
Falls jemand Rat weiß... ich bin nämlich inzwischen reichlich ratlos :(

Grüße
Thomas
Antworten