Illegal operation on emty result set

Antwort erstellen


BBCode ist eingeschaltet
[img] ist ausgeschaltet
[url] ist eingeschaltet
Smileys sind ausgeschaltet

Die letzten Beiträge des Themas
   

Ansicht erweitern Die letzten Beiträge des Themas: Illegal operation on emty result set

Re: Illegal operation on emty result set

von nahemoth » Fr, 28.05.2010 19:06

ich glaub ich hab den fehler ... das makro wurde 2x ausgeführt, ich hatte es bei Aktion ausführen und bei Maustaste loslassen drin

Re: Illegal operation on emty result set

von DPunch » Fr, 28.05.2010 18:28

Aloha

Offensichtlich werden zwei Inserts ausgeführt.
Einer mit den eingegebenen Strings, einer mit 2 Leerstrings.
Möglicherweise löst Du nach Deinem Makro auch noch mal das "Datensatz speichern" des Formulars aus.

Re: Illegal operation on emty result set

von nahemoth » Fr, 28.05.2010 16:25

naja, er fügt nen datensatz mit einem codierten string hinzu:
Bild
aber eben ohne benutzername, kene ahnung warum er das macht. den namen mit passwort fügt er aber auch passend hinzu.

Re: Illegal operation on emty result set

von DPunch » Fr, 28.05.2010 15:44

Aloha
nahemoth hat geschrieben:spielt das da eigentlich eine Rolle ob man executeUpdate oder executeQuery verwendet ?
Ja.
XStatement: executeQuery

XStatement: executeUpdate

nahemoth hat geschrieben:hm, jetzt setzt er mir immer noch ne Zeile rein, in der kein name steht, aber ein md5-string
Ich verstehe nicht ganz, was Du damit meinst.

Re: Illegal operation on emty result set

von nahemoth » Fr, 28.05.2010 14:33

fast ;)
unten muss es heissen

Code: Alles auswählen

Else
   Statement.executeUpdate("INSERT INTO t_users VALUES('"+oName+"','"+oPasswort+"');")
End If
spielt das da eigentlich eine Rolle ob man executeUpdate oder executeQuery verwendet ?

p.s.: du hättest mir nicht vorkauen müssen, bissel was sollt ich auch noch selbst machen, aber danke !


edit:
hm, jetzt setzt er mir immer noch ne Zeile rein, in der kein name steht, aber ein md5-string

der code sieht mittlerweile wie folgt aus:

Code: Alles auswählen

Sub Main

REM Name aus Textfeld holen
	odoc=thisComponent
 	odrawpage=odoc.drawpage
 	oform=odrawpage.forms.getByName("Benutzer_anlegen")
 	oText=oform.getByName("Name")
 	oName=oText.getCurrentValue()
 	
REM Passwort aus Textfeld Holen
 	oText=oform.getByName("Passwort")
 	oPasswort=oText.getCurrentValue()

REM Daten in Tabelle schreiben	
	DatabaseContext = createUnoService("com.sun.star.sdb.DatabaseContext")
	DataSource = DatabaseContext.getByName("Weblogin")
	Connection = DataSource.GetConnection("","")
	Statement = Connection.createStatement()
REM	ResultSet = Statement.executeUpdate("INSERT INTO t_users VALUES('"+oName+"','"+oPasswort+"');")
	
	ResultSet = Statement.executeQuery("SELECT `name` FROM t_users WHERE `Name` = '" +oName+"'")
	If ResultSet.Next Then
   		If MsgBox("Benutzername bereits vergeben" & Chr(13) & "Passwort für " & oName & " ändern?", 36, "Hinweis") = 6 Then
      		Statement.executeUpdate("UPDATE t_users SET `passwort` = '" & oPasswort & "' WHERE `name` = '" & oName & "'")
		End If
	Else
		Statement.execute("INSERT INTO t_users VALUES('"+oName+"','"+oPasswort+"');")
	End If
	
	
	
	
	
REM Felder zurücksetzen
	oText=oform.getByName("Name")
	oText.Text = ""
	oText=oform.getByName("Passwort")
	oText.Text = ""
	oform.Reload
		
und die beiden trigger:

Code: Alles auswählen

USE `weblogin`;
DELIMITER //

CREATE
TRIGGER `weblogin`.`md5ize_on_insert`
BEFORE INSERT ON `weblogin`.`t_users`
FOR EACH ROW
BEGIN
		SET NEW.Passwort=md5( NEW.Passwort );
END//

CREATE
TRIGGER `weblogin`.`md5ize_on_update`
BEFORE UPDATE ON `weblogin`.`t_users`
FOR EACH ROW
BEGIN
		SET NEW.Passwort=md5( NEW.Passwort );
END//

Re: Illegal operation on emty result set

von DPunch » Fr, 28.05.2010 11:51

Aloha

Das würde ungefähr so aussehen:

Code: Alles auswählen

DatabaseContext = createUnoService("com.sun.star.sdb.DatabaseContext")
DataSource = DatabaseContext.getByName("DB")
Connection = DataSource.GetConnection("","")
Statement = Connection.createStatement()
ResultSet = Statement.executeQuery("SELECT `name` FROM t_users WHERE `name` = '" +oInhalt +"'"
If ResultSet.Next Then
	If MsgBox("Benutzername bereits vergeben" & Chr(13) & "Passwort für " & oInhalt & " ändern?", 36, "Hinweis") = 6 Then
		Statement.executeUpdate("UPDATE t_users SET `passwort` = '" & oPasswort & "' WHERE `name` = '" & oInhalt & "'")
	End If
Else
	Statement.executeUpdate("INSERT INTO t_users VALUES('"+oInhalt+"', '"+oPasswort+"');")
End If

Re: Illegal operation on emty result set

von nahemoth » Fr, 28.05.2010 10:59

das funktioniert wunderbar, danke ! :)

noch nebenbei ... wie kann man püfen, ob eine abfrage mit ExecuteQuery einen Datensatz zurückgegeben hat ? dann baue ich nämlich noch ein, dass wenn ein usernamen vorhanden ist, dass dann gefragt wird, ob das passwort geändert werden soll oder nicht. der username ist ja pk. so umgehe ich dann den fehler, dass ein pk 2x vorkommt.

thx!

Re: Illegal operation on emty result set

von DPunch » Do, 27.05.2010 20:42

Aloha

häng einfach ans Ende von Deinem Insert-Makro

Code: Alles auswählen

oText=oform1.getByName("Name")
oText.Text = ""
oText=oform1.getByName("Passwort")
oText.Text = ""
oform1.Reload

Re: Illegal operation on emty result set

von nahemoth » Do, 27.05.2010 14:28

ja, die heissen so, ich hab das formular neu angelegt ... nu bin ich weiter ... jetzt hängt er bei
ResultSet = Statement.executeQuery("INSERT INTO t_users VALUES('"+oInhalt+"','"+oPasswort+"');")
Cannot issue database manipulation statements with execute query.

edit: mit ExecuteUpdate gehts :)
jetzt sollten sich noch die felder resetten, dann würds passen.
mit

Code: Alles auswählen

oForm = thisComponent.Drawpage.Forms(0)
oForm.Reload
gehts nicht und wenn ich dem button die aktion zuweise, dass die form resettet wird, dann resettet er erst und führt dann das makro aus

Re: Illegal operation on emty result set

von DPunch » Do, 27.05.2010 12:13

Heisst Dein Textfeld denn auch "Name" (bzw. "Passwort")?
(Kontrollfeld-Eigenschaften -> Name)

Re: Illegal operation on emty result set

von nahemoth » Do, 27.05.2010 12:06

jap, aber da zeigt er dann nur die datensätze an, die gerade in den entsprechenden tabellen sind.
aber ich habe das rictige gefunden, glaube ich, siehe edit meines letzten postings

Re: Illegal operation on emty result set

von DPunch » Do, 27.05.2010 12:02

Nein

Geh mal in den Entwurfsmodus des Formulars und aktiviere die Symbolleiste "Formular-Entwurf" (Menupunkt Ansicht -> Symbolleisten)
In der Symbolleiste gibt es ein Symbol namens "Formular-Navigator".

Die Formulare werden standardmässig "Standard" (bzw "Standard 1", "Standard 2" etc) genannt.

Re: Illegal operation on emty result set

von nahemoth » Do, 27.05.2010 11:57

meinst du den Ansicht -> Navigator (F5) ?
da finde ich keine Forms, da zeigt er nur Überschriften, Tabellen, Textforms etc. und da ist aber nirgends was drin.

edit:
ok, rechtsklick auf ein element und dann unter formular, das hab ich jetzt :)

jetzt mekkert er, dass er das net kennt: oInhalt=oText.getCurrentValue()

Re: Illegal operation on emty result set

von DPunch » Do, 27.05.2010 11:45

Aloha

Vermutlich heisst Dein Formular an sich "Benutzer anlegen" - der Name des Formulardokuments hat allerdings erst mal gar nichts mit der Form zu tun, die Du ansprechen willst.
Mach mal im Formular den Formular-Navigator auf. Dort siehst Du unter "Formulare" die Forms, die im Formulardokument vorhanden sind sowie deren Name.

In Deinem Fall wird es reichen, wenn Du das

Code: Alles auswählen

oform1=odrawpage.forms.getByName("Benutzer anlegen") 
durch

Code: Alles auswählen

oform1=odrawpage.forms.getByName("Standard") 
ersetzt.

Re: Illegal operation on emty result set

von nahemoth » Mi, 26.05.2010 19:17

hm, kann das sein, dass das daran liegt, das ich OO 3.2.0-9 verwende ?
ich würde eben gerne neue datensätze anlegen, aber ich versuch das mal über nen sql befehl, der durch den button ausgelöst wird, und dann eben ein insert macht.

so ungefähr:

Code: Alles auswählen

REM Name aus Textfeld holen
	odoc=thisComponent
 	odrawpage=odoc.drawpage
 	oform1=odrawpage.forms.getByName("Benutzer anlegen")
 	oText=oform1.getByName("Name")
 	oInhalt=oText.getCurrentValue()
 	
REM Passwort aus Textfeld Holen
 	oText=oform1.getByName("Passwort")
 	oPasswort=oText.getCurrentValue()

REM In Tabelle schreiben	
	DatabaseContext = createUnoService("com.sun.star.sdb.DatabaseContext")
	DataSource = DatabaseContext.getByName("DB")
	Connection = DataSource.GetConnection("","")
	Statement = Connection.createStatement()
	ResultSet = Statement.executeQuery("INSERT INTO t_users VALUES('"+oInhalt+"', '"+oPasswort+"');")
bei oform1=odrawpage.forms.getByName("Benutzer anlegen") mekkert er "com.sun.star.container.NoSuchElementException"

Nach oben