#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_UseX64 = N
#AutoIt3Wrapper_UseUpx = N ; interne UPX Komprimierung ausschalten (Default=An)
#AutoIt3Wrapper_Res_SaveSource = N
#AutoIt3Wrapper_Res_Description = ODBC-ADO Test
#AutoIt3Wrapper_Res_Fileversion = 1.0.0.0
#AutoIt3Wrapper_Res_LegalCopyright = 2018 by Musashi
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****

; =========================================================================================
; ODBC Zugriff auf eine PostgreSQL-Datenbank mittels ADODB.Connection :
; Author : Musashi (aus dem AutoIt.de Forum)
; Stand  : 29.11.2018
; =========================================================================================
; WICHTIGER HINWEIS :
; DIESES BEISPIEL IST SO NICHT LAUFFÄHIG, DA PASSWORT ETC. NATÜRLICH ENTFERNT WURDEN :-)
;
; Es lässt sich aber ausführbar machen, wenn man :
; - sich eine eigene Datenbank mit einer Tabelle erstellt
; - im ConnectionString :
;   - DATABASE=xxx
;   - UID=xxx
;   - Pwd=xxx
;   xxx mit den eigenen Daten füllt
;
; - Bei $sSQLCommand = ... ein gültiges Statement einfügt
;   Beispiel : "SELECT * FROM Tabellenname ORDER BY Tabellenfeld"
; =========================================================================================
#include <MsgBoxConstants.au3>
#include <Array.au3>

Opt('MustDeclareVars', 1)
Opt("GUICloseOnESC", 0)

Global $objCOMError = ObjEvent("AutoIt.Error","_COM_Error")

; Datenbankvariablen :
; =======================================
; Info zu : DSN-Less ConnectionString :
; ---------------------------------------
; Erfordert keinen DSN-Eintrag (also DSN-Less)
; Übergibt die Werte, die sonst im 'ODBC Datenquellen-Administrator'
; (-> DSN ) eingetragen werden müssten.
; Parameter :
;   DRIVER   = ODBC Treiber ( 32-Bit ={PostgreSQL UNICODE} ; 64-Bit ={PostgreSQL UNICODE(x64)} )
;   SERVER   = Servername (z.B. 127.0.0.1 oder Localhost)
;   PORT     = Default 5432 (ich nehme zur Sicherheit 5433)
;   DATABASE = Name der Datenbank
;   UID      = PostgreSQL Username (nicht der Windowsuser eines Dienstes)
;   PWD      = Passwort

Global $objDBConn            ; DB-Verbindungsobjekt
Global $objRecSet            ; Recordset nach Ausführung eines SQL-Statements
Global $sSQLCommand          ; SQL-Statement
Global $sDBConnectionString
Global $aDBRecArray          ; Array zur Speicherung eines Recordsets

$sDBConnectionString = "DRIVER={PostgreSQL UNICODE};SERVER=Localhost;PORT=5433;DATABASE=dbname;UID=username;Pwd=passwort;"

; DB-Verbindungsobjekt erstellen :
$objDBConn = _objDB_Connect($sDBConnectionString)
If @error Then
	MsgBox($MB_SYSTEMMODAL+$MB_ICONERROR, "DB Error:", "Keine Verbindung zur Datenbank ! " & @CRLF & @CRLF)
	Exit
EndIf

; SQL-Statement mittels Execute Methode ausführen ==> gibt ein Recordset zurück :
$sSQLCommand = "" ; Hier ein passendes SQL-Statement eintragen

$objRecSet   = _objDB_Execute($objDBConn, $sSQLCommand)
If @error Then
	MsgBox($MB_SYSTEMMODAL+$MB_ICONERROR, "Execute Error:", "Fehler beim Ausführen des SQL-Statements ! " & @CRLF & @CRLF)
	_Close()
	Exit
EndIf

; Recordset in ein Array eintragen :
$aDBRecArray = $objRecSet.GetRows
If Not IsArray($aDBRecArray) Then
	MsgBox($MB_SYSTEMMODAL+$MB_ICONERROR, "Error:", "<DBRecArray> ist kein gültiges Array ! " & @CRLF & @CRLF)
	_Close()
	Exit
EndIf

; Recordset als Array anzeigen :
_ArrayDisplay($aDBRecArray, "Recordset-Daten als Array", Default, 32) ; 32=No buttons displayed
_Close()

; -------------------------------------------------------------------------------------------------------------------------------
; Funktion     : _Close
; -------------------------------------------------------------------------------------------------------------------------------
Func _Close()
	If IsObj($objRecSet) Then _objRecSet_Close($objRecSet)
	If IsObj($objDBConn) Then _objDBConn_Close($objDBConn)
EndFunc	;==>_Close

; -------------------------------------------------------------------------------------------------------------------------------
; Funktion     : _objDB_Connect
; Beschreibung : Objektreferenz auf Datenbank gemäß $sDBConnectionString erstellen
;                (Der ConnectionString enthält die Verbindungsparameter)
; Parameter    : $sDBConnectionString
; Returns      : OK = Referenz des ADODB-Objektes , Fehler=1, @error=1
; -------------------------------------------------------------------------------------------------------------------------------
Func _objDB_Connect($sConnStr)
	Local $objConnection

	$objConnection = ObjCreate("ADODB.Connection")
	If Not IsObj($objConnection) Then Return SetError(1,0,1)
	$objConnection.Open($sConnStr)
	Return $objConnection
EndFunc	;==>_objDB_Connect

; -------------------------------------------------------------------------------------------------------------------------------
; Funktion     : _objDB_Execute
; Beschreibung : führt den Befehlsstring (SQL-Statement) aus
; Parameter    : - Referenz des Verbindungsobjektes
;                - SQL-Statement
; Returns      : Recordset Objekt-Referenz, Stream oder Nichts
; -------------------------------------------------------------------------------------------------------------------------------
Func _objDB_Execute($objDBConn, $sCommand, $iOptions=-1)
	Local $iRecordsAffected
 	Return $objDBConn.Execute($sCommand, $iRecordsAffected, $iOptions)
EndFunc	;==>_objDB_Execute

; -------------------------------------------------------------------------------------------------------------------------------
; Funktion     : _objRecSet_Close
; Beschreibung : Recordset-Objekt beenden
; Parameter    : Referenz des Recordset-Objektes
; -------------------------------------------------------------------------------------------------------------------------------
Func _objRecSet_Close($objRecSet)
	$objRecSet.Close
EndFunc	;==>_objRecSet_Close

; -------------------------------------------------------------------------------------------------------------------------------
; Funktion     : _objDBConn_Close
; Beschreibung : Verbindung zur Datenbank beenden
; Parameter    : Referenz des Verbindungsobjektes
; -------------------------------------------------------------------------------------------------------------------------------
Func _objDBConn_Close($objDBConn)
	$objDBConn.Close
EndFunc	;==>_objDBConn_Close

; -------------------------------------------------------------------------------------------------------------------------------
; Funktion     : _COM_Error
; Beschreibung : Fehlermeldung für eigenen COM-Error-Handler
; -------------------------------------------------------------------------------------------------------------------------------
Func _COM_Error()
	MsgBox($MB_SYSTEMMODAL+$MB_ICONERROR, "AutoIt COM-Error:", _
						 "Ein COM-Error ist aufgetreten : " & @CRLF & @CRLF & _
						 "Number         = " & @TAB & hex($objCOMError.number, 8) & @CRLF & _
						 "Description    = " & @TAB & $objCOMError.description    & @CRLF & _
						 "Windescription = " & @TAB & $objCOMError.windescription & @CRLF & _
						 "Lastdllerror   = " & @TAB & $objCOMError.lastdllerror   & @CRLF & _
						 "Scriptline     = " & @TAB & $objCOMError.scriptline     & @CRLF & _
						 "Source         = " & @TAB & $objCOMError.source         & @CRLF & _
						 "Helpfile       = " & @TAB & $objCOMError.helpfile       & @CRLF & _
						 "Helpcontext    = " & @TAB & $objCOMError.helpcontext    & @CRLF & _
						 "Retcode        = " & @TAB & $objCOMError.retcode & @CRLF & @CRLF)
EndFunc	;==>_COM_Error