Seite 1 von 1

firebird objRec.first

Verfasst: Sa 24. Nov 2018, 18:52
von dimpflmoser
Hallo zusammen,

ich habe die Datentabellen meiner eingebetteten HSQL-Datenbank zu Firebird konvertieren lassen.

Dabei fiel mir in meinen Basic-Modulen auf, dass die Recordsetmethode .first() wohl nicht mehr existiert...:

Code: Alles auswählen

' Kontaktdaten abfragen
strSql = "SELECT NAME1, NAME2, ANREDE, TITEL, ORTSTEIL, STRASSE, PLZ, ORT, " & _
"PLZPOSTFACH, POSTFACH, ANREDEBRF FROM KONTAKTE " & _
"WHERE KONTAKTNR = " & objForm.getByName("txtKontaktNr").Text
objResult = DbConnect.getResultSet(objForm.ActiveConnection, strSql)
' Auf ersten Datensatz positionieren
objResult.first() ' Hier wird eine Fehlermeldung ausgegeben
' Werte aus Resultset übernehmen
strName1 = objResult.getString(1)
strName2 = objResult.getString(2)
Rem ...
Meine Fragen:
Kann jemand helfen?
Gibt es eine Übersicht über die von Firebird unterstützten Basic Datenbank-Eigenschaften und Methoden?

Danke

Re: firebird objRec.first

Verfasst: So 25. Nov 2018, 08:54
von F3K Total
Moin,
dieser Code funktioniert bei mir, W7 LO 613:

Code: Alles auswählen

Sub Test_First
oController = ThisDatabasedocument.currentController
if not oController.isconnected then oController.connect
oConnection = oController.activeConnection
sQLStatement = oConnection.CreateStatement
strSql = "SELECT NAME1, NAME2, ANREDE, TITEL, ORTSTEIL, STRASSE, PLZ, ORT, " & _
"PLZPOSTFACH, POSTFACH, ANREDEBRF FROM KONTAKTE " & _
"WHERE KONTAKTNR = " & objForm.getByName("txtKontaktNr").Text
objResult = sQLStatement.executequery(strSql)
' Auf ersten Datensatz positionieren
objResult.first() ' Hier wird eine Fehlermeldung ausgegeben
' Werte aus Resultset übernehmen
strName1 = objResult.getString(2)
strName2 = objResult.getString(3)
print strName1
print strName2
Rem ...

end sub

Re: firebird objRec.first

Verfasst: So 2. Dez 2018, 14:43
von dimpflmoser
Vielen Dank für deine Antwort. Sie hat in der Tat sehr geholfen.

Ich habe noch experimentiert und festgestellt, dass das eigentliche Problem früher im Code liegt - hier noch ein Beispiel. Die folgende Funktion ermittelt die Anzahl der Datensätze im Recordset. Anschließend wird der Zeiger wieder auf den ersten Datensatz gestellt:

Code: Alles auswählen

Function getRecordCount(objResult As Object) As Long
	Dim intCount As Long
	
	' Count initialisieren
	intCount = 0
	' ResultSet durchlaufen
	While objResult.Next()
		' Count inkrementieren
		intCount = intCount + 1
	Wend
	' Auf ersten Datensatz positionieren
	objResult.First()
	' RecordCount zurückgeben
	getRecordCount = intCount
End Function
Der Fehler wird erst in der Zeile objResult.First() erzeugt. Kommentiere ich den While-Block bzw. die First()-Zeile aus gibt es keine Probleme. Der Datensatzcursor lässt sich also nicht zurück bewegen. Das ist interessant, da das Recordset wie folgt angelegt wird:

Code: Alles auswählen

Function getResultSet(objDbCon As Object, strSql As String) As Object	
	Dim objStatement As Object
	Dim objResult As Object
	
	' Statement erstellen
	objStatement = objDbCon.createStatement()
	objStatement.ResultSetConcurrency = _
		com.sun.star.sdbc.ResultSetConcurrency.UPDATABLE
	objStatement.ResultSetType = _
		com.sun.star.sdbc.ResultSetType.SCROLL_SENSITIVE
	' Abfrage ausfuehren
	objResult = objStatement.executeQuery(strSql)
	' ResultSet zurückgeben
	getResultSet = objResult
End Function
Mit der internen HSQL-Datenbank hingegen läuft der Code problemlos - werden Recordsets by Firebird stets FORWARD_ONLY angelegt?