Datenbankscript auslagern - Teil 2

  • Hallo,

    ich hatte vor 2 Jahren mit diesem Projekt mal hier angefangen, jedoch bin ich seither einfach nicht dazugekommen, was zu machen. Da ich gerade etwas Leerlauf habe, gehe ich die Sache jetzt neu an und möchte hier auch einen neuen Thread starten.

    Aktuell habe ich folgendes.

    Eine INI Datei mit folgendem Aufbau

    Mein Script sieht bisher so aus

    Hier noch Teil aus der MSSQL.au3 für _MSSQL_Con

    Laut der Erklärung sollte ich doch ein "Database-handle" zurück bekommen.

    Wenn ich die EXE auf dem entsprechenden System laufen lasse, bekomme ich hinter

    ConsoleWrite($sLeseName & " hat den $sqlCon Rückgabewert: " & $sqlCon & @CRLF) leider gar nichts angezeigt.

    Muss ich das anders schreiben, oder habe ich ein anderes Problem?

    • Offizieller Beitrag

    $sqlCon ist ein Objekt, das kannst du nicht mit ConsoleWrite ausgeben. Du kannst aber prüfen, ob es existiert: If IsObj($sqlCon) Then ConsoleWrite('OK')

    Auf die Inhalte des Objektes musst du mit den Funktionen der <MSSQL.au3> zugreifen, die das Objekt (Datenbank-Handle) als Parameter erwarten.

  • Hallo Bugfix,

    danke erstmal, das hat funktioniert. Wie ich auf die Inhalte zugreife, denke ich zu wissen, da ich das ja in meinen alten Scripten schon gemacht habe. Aber folgender Umstand bereitet mir gerade noch Kopfzerbrechen.

    Das Script hier im Thread soll ja mein "allgemeines Datenbank Verwaltungsscript sein". D.h. wenn sich was an den DBs ändert oder eine neue hinzukommt, mache ich die Anpassung in der INI und gut ist.

    Jetzt erstelle ich "in der Zukunft" ein Script MyScriptA.au3 oder Script MyScriptB.au3 usw, welches unterschiedliche Funktionen hat, aber beide Scripte benötigen die verschiedenen Datenbankzugänge. Gehen wir mal davon aus, das mein "allgemeines Datenbank Verwaltungsscript" den Namen MyDB.au3 hätte.

    Ich kann jetzt im Script MyScriptA.au3 doch ein #include <MyDB.au3> einfügen, um auf die Datenbank zuzugreifen.

    Wie greife ich denn im MyScriptA.au3 die einzelnen Durchläufe ab, die ich im MyDB.au3 mit

    Code
    For $i = 1 To UBound($arDatenbanken) - 1
                _LeseINI($arDatenbanken[$i])
    Next

    erzeuge.

    Ich will erreichen, das MyScriptA.au3 das MyDB.au3 aufruft, die ersten Datenbankverbindung öffnet, dann kommt ein definiertes SQL Statement, dann wird die erste Datenbankverbindung wieder geschlossen und aus MyScriptA.aus soll dann ebenfalls in einer Schleife MyDB.au3 erneut aufgerufen werden, jetzt soll aber die 2. Datenbankverbindung usw. genutzt werden.

    Kannst Du mir da vielleicht ein kleines Konstrukt bauen, wo ich die Logik erkennen kann? Wahrscheinlich ist das nicht schwer, aber mit eigenen includes habe ich noch nie gearbeitet.

    Vielen Dank

  • Huh? Ein Include ist erst mal nichts anderes als die Datei in eine andere zu inkludieren. Beispiel:

    Code
    File.au3
    ;~ Some code
    ;~ More code
    C
    File.au3
    ;~ Code
    #include "File.au3"
    ;~ Code

    Das würde dann entsprechend der Preprozessor folgendermaßen zusammensetzen:

    Code
    Script.au3
    ;~ Code
    ;~ Some code
    ;~ More code
    ;~ Code

    Es reicht also aus, wenn du die Datenbankverbindungen in ein Array packst und das Array dann in deinem Skript einfach ausließt / verwendest. Zudem bin ich mir nicht sicher ob ich dich richtig verstanden habe, es klingt nämlich so als ob du solch ein Konstrukt versuchst bzw. haben willst:

    Code
    Script.au3
    
    For $i = 0 to ;~ blah
        #include "File.au3"
    Next

    Könntest du ggf. dein Anliegen nochmal anders beschreiben? Kann sein dass ich dich da einfach missverstehe.

    • Offizieller Beitrag

    MyScriptA.aus soll dann ebenfalls in einer Schleife MyDB.au3 erneut aufgerufen werden

    Das ist quatsch.

    Mittels #include 'MyDB.au3' ist die Datei doch bereits eingebunden. Sie wird nicht ausgeführt, sondern die darin enthaltenen Funktionen und Konstanten stehen in deinem Hauptskript zur Verfügung.

    Also kannst du in jedem Skript, indem du die Funktionalität benötigst, deine Datei mit den Funktionen einbinden.

  • Das bedeutet dann, das ich den Aufruf _DBArray() aus der MyDB.au3 entferne und diesen dann in die MyScriptA.au3 übernehme. Es werden also in den includierten Scripten nur Funktionen und Konstanten geschrieben, aber keine weitere Ablauflogik. Die ist dann im Hauptscript enthalten. Richtig?

  • Es werden also in den includierten Scripten nur Funktionen und Konstanten geschrieben, aber keine weitere Ablauflogik. Die ist dann im Hauptscript enthalten. Richtig ?

    Das includierte Skript wird an die Stelle eingefügt, wo #include steht.

    Du könntest den Code quasi auch von Hand dorthin kopieren.

    Dass Includes grundsätzlich auch eine Ablauflogik, also nicht nur Funktionen und Konstanten haben können, verdeutlicht :

    Mainscript.au3 :

    C
    ; Hauptskript :
    Global $sText = "Dies ist ein Text"
    ConsoleWrite('@@ 1. $sText = ' & $sText & @CRLF)
    
    #include "Inludescript.au3"
    
    ConsoleWrite('@@ 3. $sText = ' & $sText & @CRLF)

    Inludescript.au3 :

    Code
    ; Includeskript :
    ConsoleWrite('@@ 2. $sText = ' & $sText & @CRLF)

    Edit : Ausgabe

    @@ 1. $sText = Dies ist ein Text

    @@ 2. $sText = Dies ist ein Text

    @@ 3. $sText = Dies ist ein Text

    Gruß Musashi

    86598-musashi-c64-png

    "Am Anfang wurde das Universum erschaffen. Das machte viele Leute sehr wütend und wurde allenthalben als Schritt in die falsche Richtung angesehen."

  • So recht will das noch nicht laufen!

    Ich habe jetzt ein Script, welches mir das MyDB.au3 Script includiert

    C
    #Region ;**** Directives created by AutoIt3Wrapper_GUI ****
    #AutoIt3Wrapper_Change2CUI=y
    #EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
    #include <MyDB.au3>
    ConsoleWrite($sDatenbanken & @CRLF)
    _DB()

    Der Aufruf ConsoleWrite($sDatenbanken & @CRLF) funktioniert sauber, aber beim _DB() bleibt es hier hängen.

    Code
    $sqlCon = _MSSQL_Con($sLeseIP, $sLeseDBUser, $sLeseDBPassword, $sLeseDBName)
    If IsObj($sqlCon) Then
            ConsoleWrite("DB konnte verbunden werden" & @crlf)
    Else
            ConsoleWrite("DB konnte nicht verbunden werden" & @crlf)
    EndIf

    In der Programmierumgebung habe ich keinen Zugang zur Datenbank, aber ich müsste dann doch die ConsoleWrite("DB konnte nicht verbunden werden" & @crlf) ansprechen

    Vielleicht ist der Timeout für $sqlCon noch nicht erreicht. Wo kann ich denn sowas einstellen?

  • Kleine Entwarnung. Prinzipiell geht es, wenn ich die Datei in den DB Umgebung laufen lasse. Das Problem ist, dass die Zeile

    $sqlCon = _MSSQL_Con($sLeseIP, $sLeseDBUser, $sLeseDBPassword, $sLeseDBName)

    nach ca. 90 Sekunden in der Programmierumgebung abbricht und das Script dann gar nicht in die If Schleife kommt.

    Also kann ich erst mal weiter machen