Statement-Object UPDATABLE machen

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

Moderator: Moderatoren

Colster
**
Beiträge: 27
Registriert: Mi, 14.12.2005 13:44

Statement-Object UPDATABLE machen

Beitrag von Colster »

Hallo liebes Forum,

ich habe gestern einen Tag damit zugebracht, mit einem Recordset in eine Datenbank zu schreiben. Der Code ist ganz einfach:

Code: Alles auswählen

REM  *****  BASIC  *****
option explicit

Sub Main
Dim oDb as Object, oDC as Object, oRsStmt as Object, oRs as Object
Dim Stmt as String
Dim Nr as Long

oDC = createUnoService("com.sun.star.sdb.DatabaseContext")
oDb = oDC.getByName("Ctrl").getConnection("","")
oRsStmt = oDb.createStatement()
oRsStmt.ResultSetType = com.sun.star.sdbc.ResultSetType.SCROLL_SENSITIVE
oRsStmt.ResultSetConcurrency = com.sun.star.sdbc.ResultSetConcurrency.UPDATABLE

Stmt = "Select ""NR"",""SCHRITTID"" From ""SCHRITT"" where ""AUFGABENID"" = 1" _
	+ " And ""NR"" >=1 And ""SCHRITTID"" <> 2 Order by ""NR"""
Nr = 0
oRs = oRsStmt.executeQuery(Stmt)
Nr = Nr + 1
do while oRs.Next
	oRs.updateInt(1,Nr)
	Nr = Nr + 1		
	oRs.updateRow()
Loop
oRs.Dispose

End Sub
Wenn ich mir die Eigenschaften von oRsStmt anschaue, nachdem die Properties gesetzt worden sind: Weder ResultSetType noch ResultSetConcurrency sind verändert worden. Von daher ist es logisch, dass sich das Recordset nicht updaten läßt (Fehler: The result set is read-only..)
Habe ich irgendwas übersehen, brauche ich ein aktuelleres OpenOffice? (Ich arbeite unter XP prof mit OO von Sun 3.1.0. Die Datenbank, die ich verwende, ist die eingebaute HSQL-Db und läßt über Formulare Änderungen zu.
Freue mich auf Antworten.

Colster
Im Ganzen liegt der Nutzen mehr im Gebrauch als im Eigentum! (Aristoteles)
juetho
******
Beiträge: 617
Registriert: Di, 20.04.2010 15:46
Wohnort: Berlin

Re: Statement-Object UPDATABLE machen

Beitrag von juetho »

Die entscheidende Information fehlt noch:

Wie ist die Tabelle Schritt aufgebaut? Ist Nr der Primärschlüssel?

Wenn Nr nicht der Primärschlüssel ist, dann fehlt die betreffende Spalte im SELECT (das ist die unabdingbare Voraussetzung für eine Abfrage, die zum Ändern geeignet ist). Falls Nr der Primärschlüssel ist, dann wird durch deine Routine dieser Wert geändert (im updateInt wird die Nummer der Spalte ab 1 gezählt) und das bringt möglicherweise den Primärschlüssel durcheinander.

Unter Umständen sind noch andere Voraussetzungen nötig. Dazu weiß ich nichts, weil ich zwischen SELECT und INSERT/UPDATE immer trenne. Jürgen
Situation: LibO 3.6 auf Win 7 Home Premium (64-bit) mit MySQL (localhost) über JDBC
Colster
**
Beiträge: 27
Registriert: Mi, 14.12.2005 13:44

Re: Statement-Object UPDATABLE machen

Beitrag von Colster »

Hallo Jürgen,

stimmt, das hatte ich vergessen: Der Primärschlüssel ist SCHRITTID, und ich hatte dieses Feld genau aus dem Grund mit in die Abfrage aufgenommen.

Wenn ich das Programm durchsteppe, kann ich im Statement Objekt die Eigenschaften beobachten. Offensichtlich sind diese Eigenschaften schon schreibgeschützt.(Zu diesem Zeitpunkt kann das Statement noch gar nicht wissen, ob in der Abfrage Primärschlüssel enthalten sind oder nicht.)

Ich habe inzwischen noch etwas ausprobiert: Connecte ich mit mit einer MSSQL-Server Datenbank kann ich mit einem Recordset die Datensätze updaten - sogar ohne in der Tabelle definierten Primärschlüssel.

???

Vielen Dank für Deine Antwort.

Colster
Im Ganzen liegt der Nutzen mehr im Gebrauch als im Eigentum! (Aristoteles)
Colster
**
Beiträge: 27
Registriert: Mi, 14.12.2005 13:44

Re: Statement-Object UPDATABLE machen

Beitrag von Colster »

Heureka,

ich habe es jetzt gefunden, wie ich ein Recordset erzeuge, dass ich updaten kann. Vielleicht hilft es auch anderen weiter. Voraussetzung ist, dass die Tabelle, die ich updaten will, einen PrimaryKey enthält (oder dass dieser zumindest in der Abfrage mit enthalten ist.).
Im Beispiel aktualisiere ich den Datensatz aus der Tabelle Adresse der Datenbank DB, in dem im Nachname "Name" steht. Ich setze dort das Feld "Nummer" auf 2.

Mit Gruß

Colster

Code: Alles auswählen

sub RSUpdate()
Dim oBo as Object, oRowSet as Object, oRs as Object
Dim sStmt as String

Tradiva.ini.InitXML
oBo = Tradiva.ini.Connect("DB")

oRs = createUnoService("com.sun.star.sdbc.ResultSet")
oRs.ActiveConnection = oBo
oRs.CommandType = com.sun.star.sdb.CommandType.COMMAND
oRs.ResultsetType = com.sun.star.sdbc.ResultSetType.SCROLL_SENSITIVE
oRs.ResultsetConcurrency = com.sun.star.sdbc.ResultSetConcurrency.UPDATABLE
oRs.Command = "Select * From Adresse where Nachname = 'Name'"
oRs.Execute()



do while oRs.next
	msgBox oRs.getString(oRs.findColumn("Name"))
loop

oRs.absolute(1)
msgbox oRs.getString(oRs.findColumn("Name"))
mri oRs
oRs.updateInt(oRs.findcolumn("Nummer"),2)
oRs.updateRow()

end Sub 
Im Ganzen liegt der Nutzen mehr im Gebrauch als im Eigentum! (Aristoteles)
Antworten