FireBird.au3 mit FDB Datenbank - ExecuteSelect Rückgabewert

  • Hallo Ihr,

    ich versuche gerade einige Daten aus einer Firebird Datenbank auszulesen. Das Klappt auch ganz gut, jedoch ist die Dokumentation nicht sonderlich groß.

    Letztlich ist mir nicht ganz klar, in welchem Format der Rückgabewert eines _FireBird_ExecuteSelect ist. Scheint mir eine XML Syntax zu sein.


    Hier mal der Code:

    [autoit]


    #include <Array.au3>
    #include <String.au3>
    #include <FireBird.au3>

    [/autoit][autoit][/autoit][autoit]

    Global $h_fbDll = DllOpen(@ScriptDir & "\fbdll4vb20.dll")Global $servername=@ComputerName
    Global $sDBName="D:/xammp/htdocs/amicron/database/DATA.FDB"
    Global $sUsername="SYSDBA"
    Global $sPassword="masterkey"
    _FireBird_ConnectDatabase($h_fbDll, $servername, $sDBName, $sUsername, $sPassword)

    [/autoit][autoit][/autoit][autoit]

    dim $result
    $select = _FireBird_ExecuteSelect($h_fbDll,"select VORNAME from ADRESSEN WHERE TRIM(NR) = '200020'", $result)

    [/autoit][autoit][/autoit][autoit]

    MsgBox(0, "FBD Result", $result);ConsoleWrite($result)
    dim $vorname = _StringBetween($result, "<VORNAME><![CDATA[", "]]></VORNAME>")

    [/autoit][autoit][/autoit][autoit]

    MsgBox(0, "FBD Result",$vorname)

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

    ConnectionDllClose($h_fbDll)

    [/autoit]


    Abfrage ($result per Konsole) ergibt:

    Code
    <results><metadata><fields><name value="VORNAME" alias="VORNAME" type="5" size="30" scale="0" /></fields></metadata><data><row num="1" ><VORNAME><![CDATA[Tobias]]></VORNAME></row></data></results>>Exit code: 0    Time: 0.508


    Daher dachte ich mir, ich könnte das mit _StringBetween lösen, jedoch kommt immer ein leeres Ergeniss, weiß einer warum?

    • Offizieller Beitrag

    Aus deinem Skript ist nicht ersichtlich, wie du SQL-Execute vollziehst. (FireBird.au3 ist eine UDF, solltest du drauf verlinken, wenn du diese verwendest. Mir ist sie nicht bekannt.)

    Hier mal die Funktionen, die ich mir für die Interaktion mit Firebird erstellt habe:

    Spoiler anzeigen
    [autoit]

    ;===============================================================================
    ; Function Name: _oSQLDB_Connect($connStr)
    ; Description:: erstellt eine Objektreferenz auf eine Firebird-DB
    ; Parameter(s): $connStr Connection-String enthält die Verbindungsparameter
    ; Requirement(s): Firebird und installierte FB-ODBC-Treiber
    ; Return Value(s): Erfolg Referenz des ADODB-Objektes
    ; Fehler 1, @error 1
    ; Author(s): BugFix
    ;===============================================================================
    Func _oSQLDB_Connect($connStr)
    Local $objConnection = ObjCreate("ADODB.Connection")
    If Not IsObj($objConnection) Then Return SetError(1,0,1)
    $objConnection.Open($connStr)
    Return $objConnection
    EndFunc ;==>_oSQLDB_Connect

    [/autoit] [autoit][/autoit] [autoit]

    ;===============================================================================
    ; Function Name: _oSQLDB_Execute($oConn, $strCommand, $Options=-1)
    ; Description:: führt Kommandostring (SQL-Sequenz) aus
    ; Parameter(s): $oConn Referenz des FB-Objektes
    ; $strCommand Kommandostring
    ; optional $Options CommandTypeEnum (http://msdn.microsoft.com/en-us/library/ms675946(VS.85).aspx) oder
    ; ExecuteOptionEnum (http://msdn.microsoft.com/en-us/library/ms676517(VS.85).aspx)
    ; Return Value(s): Eine Recordset Objekt-Referenz, ein Stream oder Nichts
    ; Author(s): BugFix
    ;===============================================================================
    Func _oSQLDB_Execute($oConn, $strCommand, $Options=-1)
    Local $recAffected
    Return $oConn.Execute($strCommand, $recAffected, $Options)
    EndFunc ;==>_oSQLDB_Execute

    [/autoit] [autoit][/autoit] [autoit]

    ;===============================================================================
    ; Function Name: _oRecSet_Close($oRecSet)
    ; Description:: Beendet ein RecordsetObjekt
    ; Parameter(s): $oRecSet Referenz des Objektes
    ; Author(s): BugFix
    ;===============================================================================
    Func _oRecSet_Close($oRecSet)
    $oRecSet.Close
    EndFunc ;==>_oRecSet_Close

    [/autoit] [autoit][/autoit] [autoit]

    ;===============================================================================
    ; Function Name: _oSQLDB_Close($oConn)
    ; Description:: Beendet eine Firebird-Verbindung
    ; Parameter(s): $oConn Referenz des FB-Objektes
    ; Author(s): BugFix
    ;===============================================================================
    Func _oSQLDB_Close($oConn)
    $oConn.Close
    EndFunc ;==>_oSQLDB_Close

    [/autoit]


    Und hier mal ein Beispiel:

    [autoit]

    Global $data_source = "Lw:/PFAD/DEINER/FB-DB" ; Notation mit "/" beachten!!
    Global $strConnection = "DRIVER=Firebird/InterBase(r) driver; UID=SYSDBA; PWD=masterkey; DBNAME=" & $data_source & ";"

    [/autoit][autoit][/autoit][autoit]

    Global $oFB, $oRS, $sql_str, $arTables, $arFieldType

    [/autoit][autoit][/autoit][autoit]

    $oFB = _oSQLDB_Connect($strConnection)
    If Not IsObj($oFB) Then
    MsgBox(0, 'Datenbank', 'keine Verbindung')
    _close()
    EndIf

    [/autoit][autoit][/autoit][autoit]

    ; #### alle UserTabellen auslesen ####
    $sql_str = "SELECT RDB$RELATION_NAME FROM RDB$RELATIONS WHERE RDB$SYSTEM_FLAG = 0 ORDER BY RDB$RELATION_NAME;"
    $oRS = _oSQLDB_Execute($oFB, $sql_str)
    $arTables = $oRS.GetRows
    _ArrayDisplay($arTables)

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

    ; #### alle UserTabellen mit Feldnamen und FeldTypen ####
    $sql_str = "SELECT RDB$RELATION_NAME, RDB$FIELD_NAME, RDB$FIELD_SOURCE FROM RDB$RELATION_FIELDS WHERE RDB$RELATION_NAME NOT CONTAINING '$' order by RDB$RELATION_NAME, RDB$FIELD_NAME;" ;[0]=Feld, [1]=Tabelle, [2]=Typ-Länge
    $oRS = _oSQLDB_Execute($oFB, $sql_str)
    $arFieldType = $oRS.GetRows ; Tabelle-Feld-Datentyp
    _ArrayDisplay($arFieldType)

    [/autoit][autoit][/autoit][autoit]

    _close()

    [/autoit][autoit][/autoit][autoit]

    Func _close()
    If IsObj($oRS) Then _oRecSet_Close($oRS)
    If IsObj($oFB) Then _oSQLDB_Close($oFB)
    Exit
    EndFunc

    [/autoit]