von hfr » Sa, 24.10.2009 17:36
Hallo eBayer,
das ist ja ein lustig-mehrdeutiger Name -
Ich habe die Variablen-Typen-Handhabung nach gearbeitet und dabei vielleicht übertrieben, weil Basic dabei locker ist.
Der erste Schleifen-Durchlauf führt wie vor der Nacharbeitung wieder zu einem erfolgreichen Update der Tabelle
aber der 2. Schleifendurchlauf erzeugt dieselbe Fehlermeldung wie zuvor bei der Zeile
Fehler 0: Es ist eine Exception aufgetreten
Type: com.sun.star.lang.DisposedException
Message: .
In line 50
24.10.2009 10:45:37
Hier der nach-gearbeitete Code mit besserer Kommentierung z.B. bzgl. Variablen etc.:
Code: Alles auswählen
REM ***** BASIC *****
Sub Main
End Sub
Sub SQL_testen_04
' 2009-10-24 hfr
' Anfängliche Quelle01: "http://www.ooowiki.de/BaseApi" z.B. im Abschnitt 'SQL-Kommunikationskanal aufbauen' und folgende.
' Anfängliche Quelle02: "http://www.ooowiki.de/FortlaufendeRechnungsnummer" 'als ein Beispiel-Makro
' Deklaration der Datenbankobjekte (nur zur Klarheit 1.Buchstabe: n INTEGER, o OBJECT, s STRING, ...)
DIM oDatabaseContext AS OBJECT
DIM oDatenquelle AS OBJECT
DIM oVerbindung AS OBJECT
DIM oAuthentifizierung AS OBJECT
DIM oSQL_Anweisung AS OBJECT
DIM sSuch_Zeichenfolge AS STRING
DIM sSql AS STRING
DIM oAbfrageergebnis AS OBJECT
DIM nSql_WHERE AS INTEGER 'ein Integer-Primärschlüssel wird erwartet
DIM sSql_Update AS STRING
ON ERROR GOTO Fehlerbehandlung
'Allgemeines:
' Datenbankkontext erzeugen
oDatabaseContext = createUnoService("com.sun.star.sdb.DatabaseContext")
' oDatenquelle wählen
oDatenquelle = oDatabaseContext.getByName("Hfr Datenbank 2009")' "Name der in OO registrierten Datenbank"
' oVerbindung zur oDatenquelle aufbauen
' Empfohlener Code für die BenutzeroAuthentifizierung bei Bedarf.
' bei Bedarf Dialog für Passwortschutz aufrufen
IF NOT oDatenquelle.IsPasswordRequired THEN
oVerbindung = oDatenquelle.GetConnection("","")' ("Benutzername","Passwort")
ELSE
oAuthentifizierung = createUnoService("com.sun.star.sdb.InteractionHandler")
oVerbindung = oDatenquelle.ConnectWithCompletion(oAuthentifizierung)
END IF
' SQL-Kommunikationskanal aufbauen
oSQL_Anweisung = oVerbindung.createStatement()
' Update-Anweisungen vorbereiten (Where-Bedingungen ermitteln ähnlich verschachtelter SQL's)
sSuch_Zeichenfolge = INPUTBOX("[Hfr] Bitte eine Zeichenfolge, nach der gesucht werden soll, eingeben:")
sSql = "SELECT IdTest FROM tests WHERE Untersucher LIKE '%"+sSuch_Zeichenfolge+"%'"
oAbfrageergebnis = oSQL_Anweisung.executeQuery(sSql)
' Abfrageergebnis auswerten und pro gefundenem Datensatz je ein Update ausführen:
IF NOT ISNULL(oAbfrageergebnis) THEN
WHILE oAbfrageergebnis.next
'MsgBox oAbfrageergebnis.getString(1)' Erstes Datenfeld anzeigen (optional zu Testzwecken)
nSql_WHERE = VAL(oAbfrageergebnis.getString(1)) 'Oben wurde nur ein (1) Datenfeld [IdTest als Int-Zahl Prim-Schl] pro Datensatz selektiert
'Die Funktion Val wandelt eine Zeichenfolge in eine Zahl um,
'erwartet darin jedoch immer einen Punkt als Dezimaltrennzeichen.
' Update-Anweisungen
' funktionieren beim ersten Schleifendurchlauf
' ??? versagen aber beim 2. Durchlauf ohne Fehler-Message-Text
' z.B.: sSql_Update = "UPDATE tests SET Untersucher = 'U_Update_A' WHERE IdTest = 1"
sSql_Update = "UPDATE tests SET Untersucher = 'U_Update_A' WHERE IdTest = " + CStr(nSql_WHERE)
' Untersucher ist ein Feldname
' 'U_Update_A' ist ein beliebiger Feldinhalt
' IdTest ist der tests-Tabellen-Primärschlüssel vom Typ INT(11)
' nSql_WHERE d.h. mit den oben gefundenen Where-Bedingungen, meistens mehrere.
' CStr(Var): konvertiert jeden Datentyp in den Typ String (Zeichenfolge)
oSQL_Anweisung.executeUpdate (sSql_Update) 'Update ausführen
WEND ' nächster Datensatz
END IF
GOTO Ende
Fehlerbehandlung:
Msg = "Fehler " & ERR & ": " & ERROR$ + CHR(13) + "In line : " + ERL + CHR(13) + NOW
MsgBox Msg,16,"Fehler aufgetreten"
Ende:
End Sub ' SQL_testen_04
Hallo eBayer,
das ist ja ein lustig-mehrdeutiger Name - 8)
Ich habe die Variablen-Typen-Handhabung nach gearbeitet und dabei vielleicht übertrieben, weil Basic dabei locker ist.
Der erste Schleifen-Durchlauf führt wie vor der Nacharbeitung wieder zu einem erfolgreichen Update der Tabelle
aber der 2. Schleifendurchlauf erzeugt dieselbe Fehlermeldung wie zuvor bei der Zeile
[code]WHILE Abfrageergebnis.next [/code]
[color=#FF00FF]Fehler 0: Es ist eine Exception aufgetreten
Type: com.sun.star.lang.DisposedException
Message: .
In line 50
24.10.2009 10:45:37[/color]
Hier der nach-gearbeitete Code mit besserer Kommentierung z.B. bzgl. Variablen etc.:
[code]
REM ***** BASIC *****
Sub Main
End Sub
Sub SQL_testen_04
' 2009-10-24 hfr
' Anfängliche Quelle01: "http://www.ooowiki.de/BaseApi" z.B. im Abschnitt 'SQL-Kommunikationskanal aufbauen' und folgende.
' Anfängliche Quelle02: "http://www.ooowiki.de/FortlaufendeRechnungsnummer" 'als ein Beispiel-Makro
' Deklaration der Datenbankobjekte (nur zur Klarheit 1.Buchstabe: n INTEGER, o OBJECT, s STRING, ...)
DIM oDatabaseContext AS OBJECT
DIM oDatenquelle AS OBJECT
DIM oVerbindung AS OBJECT
DIM oAuthentifizierung AS OBJECT
DIM oSQL_Anweisung AS OBJECT
DIM sSuch_Zeichenfolge AS STRING
DIM sSql AS STRING
DIM oAbfrageergebnis AS OBJECT
DIM nSql_WHERE AS INTEGER 'ein Integer-Primärschlüssel wird erwartet
DIM sSql_Update AS STRING
ON ERROR GOTO Fehlerbehandlung
'Allgemeines:
' Datenbankkontext erzeugen
oDatabaseContext = createUnoService("com.sun.star.sdb.DatabaseContext")
' oDatenquelle wählen
oDatenquelle = oDatabaseContext.getByName("Hfr Datenbank 2009")' "Name der in OO registrierten Datenbank"
' oVerbindung zur oDatenquelle aufbauen
' Empfohlener Code für die BenutzeroAuthentifizierung bei Bedarf.
' bei Bedarf Dialog für Passwortschutz aufrufen
IF NOT oDatenquelle.IsPasswordRequired THEN
oVerbindung = oDatenquelle.GetConnection("","")' ("Benutzername","Passwort")
ELSE
oAuthentifizierung = createUnoService("com.sun.star.sdb.InteractionHandler")
oVerbindung = oDatenquelle.ConnectWithCompletion(oAuthentifizierung)
END IF
' SQL-Kommunikationskanal aufbauen
oSQL_Anweisung = oVerbindung.createStatement()
' Update-Anweisungen vorbereiten (Where-Bedingungen ermitteln ähnlich verschachtelter SQL's)
sSuch_Zeichenfolge = INPUTBOX("[Hfr] Bitte eine Zeichenfolge, nach der gesucht werden soll, eingeben:")
sSql = "SELECT IdTest FROM tests WHERE Untersucher LIKE '%"+sSuch_Zeichenfolge+"%'"
oAbfrageergebnis = oSQL_Anweisung.executeQuery(sSql)
' Abfrageergebnis auswerten und pro gefundenem Datensatz je ein Update ausführen:
IF NOT ISNULL(oAbfrageergebnis) THEN
WHILE oAbfrageergebnis.next
'MsgBox oAbfrageergebnis.getString(1)' Erstes Datenfeld anzeigen (optional zu Testzwecken)
nSql_WHERE = VAL(oAbfrageergebnis.getString(1)) 'Oben wurde nur ein (1) Datenfeld [IdTest als Int-Zahl Prim-Schl] pro Datensatz selektiert
'Die Funktion Val wandelt eine Zeichenfolge in eine Zahl um,
'erwartet darin jedoch immer einen Punkt als Dezimaltrennzeichen.
' Update-Anweisungen
' funktionieren beim ersten Schleifendurchlauf
' ??? versagen aber beim 2. Durchlauf ohne Fehler-Message-Text
' z.B.: sSql_Update = "UPDATE tests SET Untersucher = 'U_Update_A' WHERE IdTest = 1"
sSql_Update = "UPDATE tests SET Untersucher = 'U_Update_A' WHERE IdTest = " + CStr(nSql_WHERE)
' Untersucher ist ein Feldname
' 'U_Update_A' ist ein beliebiger Feldinhalt
' IdTest ist der tests-Tabellen-Primärschlüssel vom Typ INT(11)
' nSql_WHERE d.h. mit den oben gefundenen Where-Bedingungen, meistens mehrere.
' CStr(Var): konvertiert jeden Datentyp in den Typ String (Zeichenfolge)
oSQL_Anweisung.executeUpdate (sSql_Update) 'Update ausführen
WEND ' nächster Datensatz
END IF
GOTO Ende
Fehlerbehandlung:
Msg = "Fehler " & ERR & ": " & ERROR$ + CHR(13) + "In line : " + ERL + CHR(13) + NOW
MsgBox Msg,16,"Fehler aufgetreten"
Ende:
End Sub ' SQL_testen_04
[/code]