Statement-Object UPDATABLE machen

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: Statement-Object UPDATABLE machen

Re: Statement-Object UPDATABLE machen

von Colster » Mi, 14.09.2016 15:35

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 

Re: Statement-Object UPDATABLE machen

von Colster » Mi, 06.02.2013 18:32

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

Re: Statement-Object UPDATABLE machen

von juetho » Mi, 06.02.2013 16:19

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

Statement-Object UPDATABLE machen

von Colster » Mi, 06.02.2013 15:48

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

Nach oben