(gelöst) Vorbereitete SQL-Befehle mit Parametern

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

Moderator: Moderatoren

CADdy
*
Beiträge: 14
Registriert: Mo, 31.03.2014 14:37

(gelöst) Vorbereitete SQL-Befehle mit Parametern

Beitrag von CADdy »

Hallo allemiteinander,

ich möchte per Makro Datensätze in eine MySQL-Datenbank schreiben, so wie es im LibreOffice 4.2 Base-Handbuch auf Seite 329 beschrieben steht. Das Programm sieht folgendermaßen aus:

Code: Alles auswählen

REM in Datenbank schreiben

Sub datawrite

DIM oDatabaseContext AS OBJECT
DIM oDatasource AS OBJECT
DIM oConnection AS OBJECT
DIM oSQL_Statement AS OBJECT
DIM stSql AS STRING
DIM iResult AS INTEGER

oDatabaseContext =createUnoService("com.sun.star.sdb.DatabaseContext")
oDatasource =oDatabaseContext.getByName("gta")
oConnection =oDatasource.GetConnection("","")


	stSql = "INSERT INTO `gta`.`palettenzettel` " _
	& "(`lfdnr`, `scancode`, `palettennr`, `artikelnr`, `menge`, `zeit`, `datum`)" _
	& " VALUES " _
	& "(lfdnr = NULL, scancode = ?, palettennr = ?, artikelnr = ?, menge = ?, zeit = ?, datum = ?)"

REM Das Feld "lfdnr" ist in der Datenbank "auto_increment" definiert
	
   oSQL_Statement= oConnection.prepareStatement(stSql)

	oSQL_Statement.setString(1, lfdnr)
	oSQL_Statement.setInt(2, scancode)
	oSQL_Statement.setInt(3, palettennr)
	oSQL_Statement.setInt(4, artikelnr)
	oSQL_Statement.setInt(5, menge)
	oSQL_Statement.setTime(6, zeit)
	oSQL_Statement.setDate(7, datum)

	iResult = oSQL_Statement.executeUpdate

End Sub
Wenn ich das im Einzelschritt durchgehe, funktioniert es bis zur Zeile

Code: Alles auswählen

oSQL_Statement.setTime(6, zeit)
Hier bekomme ich die Meldung "BASIC-Laufzeitfehler. Objektvariable nicht belegt."
Ich verstehe nicht, warum das so ist. Ich habe mich genau an die Vorgaben gehalten.
Könnte mir bitte jemand einen Tipp geben, was ich falsch mache?

Danke und servus
Peter
Zuletzt geändert von CADdy am So, 04.05.2014 01:20, insgesamt 1-mal geändert.
LO 4.2, LinuxMint16
F3K Total
********
Beiträge: 3724
Registriert: Mo, 28.02.2011 17:49

Re: Vorbereitete SQL-Befehle mit Parametern

Beitrag von F3K Total »

Moin,es müßte so sein:

Code: Alles auswählen

.setdate()
benötigt ein Date-Struct vom Typ com.sun.star.util.Date
daher sollte dies funktionieren:

Code: Alles auswählen

dim oDate as new com.sun.star.util.Date
with oDate
     .day = 12
     .month = 4
     .year = 2014
end with
.
.
.
oSQL_Statement.setDate(7, oDate)
HTH R
CADdy
*
Beiträge: 14
Registriert: Mo, 31.03.2014 14:37

Re: Vorbereitete SQL-Befehle mit Parametern

Beitrag von CADdy »

Hi,

danke für Deine Antwort.
Ich habe es noch um die Zeit erweitert:

Code: Alles auswählen

DIM oDate as new com.sun.star.util.Date
DIM oTime as new com.sun.star.util.Time
...
with oTime
	.Seconds = 00
	.Minutes = 51
	.Hours = 22
end with

with oDate
     .Day = 12
     .Month = 4
     .Year = 2014
end with
...
	oSQL_Statement.setTime(6, oTime)
	oSQL_Statement.setDate(7, oDate)

BTW, wenn ich in oTime .HundredthSeconds angebe, bekomme ich einen Laufzeitfehler, weil dieser Parameter nicht bekannt ist (entgegen von http://www.openoffice.org/api/docs/comm ... /Time.html). Ok, brauche ich auch nicht.

Es funktioniert bis zur letzten Zeile. Da kommt dann
001 Screenshot - 13.04.2014 , 00_20_00.png
001 Screenshot - 13.04.2014 , 00_20_00.png (21.29 KiB) 1668 mal betrachtet
Die jetzt fest eingetragenen Zeit- und Datumswerte kann ich ja dann später als Variable übergeben, denke ich. Zum Testen reicht es mir so.

Servus
Peter
LO 4.2, LinuxMint16
F3K Total
********
Beiträge: 3724
Registriert: Mo, 28.02.2011 17:49

Re: Vorbereitete SQL-Befehle mit Parametern

Beitrag von F3K Total »

CADdy hat geschrieben:BTW, wenn ich in oTime .HundredthSeconds angebe, bekomme ich einen Laufzeitfehler, weil dieser Parameter nicht bekannt ist (entgegen von http://www.openoffice.org/api/docs/common/ref/com/sun/star/util/Time.html). Ok, brauche ich auch nicht.
Nun, du verwendest ja auch Libre Office, da wurde das Time-Struct geändert, es gibt jetzt nanoseconds.
HTH R
CADdy
*
Beiträge: 14
Registriert: Mo, 31.03.2014 14:37

Re: Vorbereitete SQL-Befehle mit Parametern

Beitrag von CADdy »

Hi,
das geänderte Time-Struct hatte ich noch gefunden und auf .NanoSeconds geändert. Das Problem, wie in meinem letzten Posting beschrieben, bleibt aber bestehen. Die Fehlermeldung kommt bei der Zeile

Code: Alles auswählen

oSQL_Statement.setDate(7, oDate)
und da solle es aber passen.

Code: Alles auswählen

with oDate
     .Day = 12
     .Month = 4
     .Year = 2014
end with
Wo kommt der Fehler her?

Servus
Peter
LO 4.2, LinuxMint16
F3K Total
********
Beiträge: 3724
Registriert: Mo, 28.02.2011 17:49

Re: Vorbereitete SQL-Befehle mit Parametern

Beitrag von F3K Total »

Hi,
leider habe ich keine MySql-DB.
Mit einer HSQLDB 1.8. funktioniert dieser Code:

Code: Alles auswählen

Sub datawrite
    DIM oDate as new com.sun.star.util.Date
    DIM oTime as new com.sun.star.util.Time
    nscancode = 555
    npalettennr = 222
    nartikelnr = 333
    nmenge = 1000
    with oTime
       .Seconds = 00
       .Minutes = 51
       .Hours = 22
    end with
    with oDate
         .Day = 12
         .Month = 4
         .Year = 2014
    end with
    oConnection = thisdatabasedocument.currentcontroller.activeconnection
    stSql = "INSERT INTO ""palettenzettel"" ( ""scancode"", ""palettennr"", ""artikelnr"", ""menge"", ""zeit"", ""datum"") VALUES (?, ?, ?, ?, ?, ?)"
    oSQL_Statement = oConnection.prepareStatement(stSql)
    oSQL_Statement.setInt(1, nscancode)
    oSQL_Statement.setInt(2, npalettennr)
    oSQL_Statement.setInt(3, nartikelnr)
    oSQL_Statement.setInt(4, nmenge)
    oSQL_Statement.setTime(5, oTime)
    oSQL_Statement.setDate(6, oDate)
    oSQL_Statement.executeUpdate
End Sub
HTH R
CADdy
*
Beiträge: 14
Registriert: Mo, 31.03.2014 14:37

Re: Vorbereitete SQL-Befehle mit Parametern

Beitrag von CADdy »

Ok, danke Dir. Ich probiere Deinen Code aus und melde mich wieder.

Servus
Peter
LO 4.2, LinuxMint16
CADdy
*
Beiträge: 14
Registriert: Mo, 31.03.2014 14:37

Re: Vorbereitete SQL-Befehle mit Parametern

Beitrag von CADdy »

Hi,
ich habe den Fehler gefunden :D
In der Zeile

Code: Alles auswählen

   stSql = "INSERT INTO `gta`.`palettenzettel` " _
   & "(`lfdnr`, `scancode`, `palettennr`, `artikelnr`, `menge`, `zeit`, `datum`)" _
   & " VALUES " _
   & "(lfdnr = NULL, scancode = ?, palettennr = ?, artikelnr = ?, menge = ?, zeit = ?, datum = ?)"
darf nicht lfdnr = NULL stehen. Es muss ebenfalls ein Fragezeichen vorhanden sein. Den Wert "NULL" muss ich mit der entspr. Variablen übergeben.

Darauf gekommen bin ich, weil in Deinem Code überall Fragezeichen waren. Vielen Dank für Deine Hilfe.

Servus
Peter
LO 4.2, LinuxMint16
Antworten