Oracle Datenbank

Stelle Fragen zur Programmierung mit Autohotkey

Moderator: jNizM

Nmk
Posts: 28
Joined: 20 Jan 2017, 19:29

Oracle Datenbank

04 Apr 2017, 02:01

Hallo allerseits,

wenn ich das richtig gelesen habe, gibt es Funktionen die mir den Zugriff (lesen/schreiben) auf eine Oracle Datenbank ermöglichen.

Ich habe vor mein Programm mit Daten anzureichern und die Datenbank durch das Programm zu füttern. Kann mir jemand sagen, ob das überhaupt möglich ist und wenn, welche Komponenten dafür am besten geeignet sind.

Gruß

Nmk
BoBo
Posts: 6564
Joined: 13 May 2014, 17:15

Re: Oracle Datenbank

04 Apr 2017, 05:01

Wäre gut zu wissen WO du das gelesen hast, damit man dir nichts empfiehlt was du schon kennst. Spart zeit :)
Habe dazu ad-hoc das folgende gefunden?! Good luck.

https://autohotkey.com/boards/viewtopic.php?f=5&t=26782
https://autohotkey.com/board/topic/8354 ... ons-v503l/

https://autohotkey.com/boards/viewtopic.php?t=6538
https://autohotkey.com/board/topic/7117 ... mysql-ado/
Nmk
Posts: 28
Joined: 20 Jan 2017, 19:29

Re: Oracle Datenbank

04 Apr 2017, 08:02

Danke dir! Scheint also möglich zu sein. Ich kenne mich mit Datenbanken nicht so gut aus und mein Englisch ist nicht das Beste. Ich wühle mich da mal durch.
just me
Posts: 9458
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Oracle Datenbank

04 Apr 2017, 10:46

Ich habe das zuletzt vor gut 3 Jahren gemacht. Ich brauchte dafür den Oracle OLEDB Treiber und eine fertig eingerichtete ODBC-Datenquelle. VxE's ADO Skript habe ich dafür etwas umgeschrieben. Hier mal ein Auszug aus dem Skript, 2014 unter XP hat das funktioniert:

Code: Select all

#NoEnv
SetBatchLines, -1
; ======================================================================================================================
; Konstanten für Datenbankzugriff
; ======================================================================================================================
SQL := "Select a.field1, b.field2 from table1 a, table2 b "
    .  "where b.field2 = '*' and b.field3 = 1 and b.field4 = 2 and b.fieldx = a.fieldy"
; CONNECTIONSTRING=Provider=OraOLEDB.Oracle.1;Persist Security Info=False;User ID=%UID_;Data Source=%DBN_;Password=%PWD_
DBN := "DBN" ; Name der eingerichteten Datenquelle
UID := "User"
PWD := "Passwort"
ConnStr := "Provider=OraOLEDB.Oracle.1;"
         . "Persist Security Info=False;"
         . "User ID=" . UID . ";"
         . "Data Source=" . DBN . ";"
         . "Password=" . PWD
; ======================================================================================================================
; ADODB- und OracleOLEDB-Verfügbarkeit prüfen
; ======================================================================================================================
RegRead, ORAOLEDB, HKEY_CLASSES_ROOT, OraOLEDB.Oracle.1\CLSID
If (ErrorLevel) {
   MsgBox, 16, %ScriptName%, Fehler:`nDer OracleOLEDB-Treiber ist nicht verfügbar!%AppExit%
   ExitApp
}
If !(ADO := New ADODB) {
   MsgBox, 16, %ScriptName%, Fehler:`nMicrosoft ADODB ist nicht verfügbar!%AppExit%
   ExitApp
}
...
...
...
; ======================================================================================================================
; Gui für Anzeige der Auswahl
; ======================================================================================================================
If !ADO.Open(ConnStr) {
   MsgBox, 16, %ScriptName%, % "Fehler:`n" . ADO.LastError . AppExit
   ADO.Close()
   ExitApp
}
If !(Result := ADO.Query(SQL)) {
   MsgBox, 16, %ScriptName%, % "Fehler:`n" . ADO.LastError . AppExit
   ADO.Close()
   ExitApp
}
ADO.Close()
Selected := Result[1].MaxIndex()
Gui, Show:New, +AlwaysOnTop +LabelShow
Gui, Margin, 10, 10
Gui, Font, s10
Gui, Add, ListView, w600 r20 Count%Selected% vL gSubLV +E0x00010000, Col 1|Col 2
Table := Result[1]
Records := 0
For Index, Row In Table
   If (Index > 1)  ; Die Feldnamen stehen in der ersten Zeile
      LV_Add("", Row*)
Gui, Show, , % "Salden"
...
...
...
; ======================================================================================================================
; Based on ADODB v5.04L - By [VxE]
; -> http://www.autohotkey.com/board/topic/83542-func-ADODB-uses-ado-to-manage-sql-transactions-v503l/
;
; Wraps the utility of ADODB to connect to a database, submit a query, and read the resulting recordset.
; Returns the result as a new object (or array of objects, if the query has multiple statements).
; To instead have this function return a string, include a delimiter option in the connection string.
;
; For AHK-L (v1.1 or later).
; Freely available @ http://www.autohotkey.com/community/viewtopic.php?p=558323#p558323
;
; IMPORTANT! Before you can use this library, you must have access to a database AND know the connection
; string to connect to your database.
;
; Varieties of databases will have different connection string formats, and different drivers (providers).
; Use the mighty internet to discover the connection string format and driver for your type of database.
;
; Example connection string for SQLServer (2005) listening on port 1234 and with a static IP:
; DRIVER={SQL SERVER};SERVER=192.168.0.12,1234\SQLEXPRESS;DATABASE=mydb;UID=admin;PWD=12345;APP=AHK
;
; ErrorLevel is set to "Error" if ADODB is not available, or the COM error code if a COM error is encountered.
; The properties 'LastError' and 'LastStatement' will contain detailed informations about the last COM error
; respectively the last executed SQL statement.
;
; ======================================================================================================================
Class ADODB {
   ; ===================================================================================================================
   ; ; Create a new connection object. > http://www.w3schools.com/ado/ado_ref_connection.asp
   ; ===================================================================================================================
   __New() {
      This.LastError := This.LastStatement := ""
      ComObjError(0) ; We'll manage COM errors manually.
      ; If something goes wrong here, return blank and set the error message.
      If !(oCon := ComObjCreate("ADODB.Connection")) {
         ComObjError(1)
         ErrorLevel := "Fatal Error: ADODB is not available."
         Return ""
      }
      oCon.ConnectionTimeout := 15 ; Allow 15 seconds to connect to the server. Default is 15.
      oCon.CursorLocation := 3     ; Use a client-side cursor server.
      oCon.CommandTimeout := 60    ; A generous 1 minute timeout on the actual SQL statement. Default is 30.
      This.Connection := oCon
      ComObjError(1)
   }
   ; ===================================================================================================================
   ; If the connection is still open, we close it.
   ; ===================================================================================================================
   __Delete() {
      If (This.Connection)
         This.Close()
      This.Connection := ""
   }
   ; ===================================================================================================================
   ; Connect to a database. > http://www.w3schools.com/ado/met_conn_open.asp
   ; ===================================================================================================================
   Open(ConnectionString) {
      This.LastError := This.LastStatement := ""
      ComObjError(0) ; We'll manage COM errors manually.
      This.Connection.Open(ConnectionString) ; Open the connection.
      If (ComError := A_LastError) {
         This.GetError()
         ComObjError(1)
         ErrorLevel := ComError
         Return ""
      }
      ComObjError(1)
      Return True
   }
   ; ===================================================================================================================
   ; Close the connection. > http://www.w3schools.com/ado/met_conn_close.asp
   ; ===================================================================================================================
   Close() {
      This.LastError := This.LastStatement := ""
      ComObjError(0) ; We'll manage COM errors manually.
      This.Connection.Close()
      ; This.Connection := ""
      ComObjError(1)
      Return True
   }
   ; ===================================================================================================================
   ; Execute a non-query statement. > http://www.w3schools.com/ado/ado_ref_recordset.asp
   ; ===================================================================================================================
   Exec(SQLStatement) {
      This.LastError := "", This.LastStatement := SQLStatement
      ComObjError(0) ; We'll manage COM errors manually.
      Dummy := This.Connection.Execute(SQLStatement)
      If (ComError := A_LastError) {
         This.GetError()
         ComObjError(1)
         ErrorLevel := ComError
         Return ""
      }
      ComObjError(1)
      Return True
   }
   ; ===================================================================================================================
   ; Execute a query statement and get the recordset. > http://www.w3schools.com/ado/ado_ref_recordset.asp
   ; ===================================================================================================================
   Query(QueryStatement) {
      This.LastError := "", This.LastStatement := QueryStatement
      ComObjError(0) ; We'll manage COM errors manually.
      Recordset := This.Connection.Execute(QueryStatement)
      If (ComError := A_LastError) {
         This.GetError()
         ComObjError(1)
         ErrorLevel := ComError
         Return ""
      }
      Result := {} ; This is a 3-dimensional array.
      While IsObject(Recordset) {
         If !(Recordset.BOF && Recordset.EOF) || !(Recordset.State) { ; Recordset is empty, so we skip it.
            ; A row-returning operation returns an open Recordset
            Fields := Recordset.Fields
            Columns := Fields.Count
            Result.Insert(Query := [])
            Query.Insert(Row := [])
            Loop % Columns ; Put the column names in the first row.
               Row[A_Index] := Fields.Item(A_Index - 1).Name
            While !(Recordset.EOF) { ; While the record pointer is not at the end of the Recordset...
               Query.Insert(Row := [])
               Row.SetCapacity(Columns) ; Might improve performance on huge tables??
               Loop % Columns
                  Row[A_Index] := Fields.Item(A_Index - 1).Value
               Recordset.MoveNext() ; move the record pointer to the next row of values
            }
         }
         Recordset := Recordset.NextRecordset() ; Get the next Recordset.
      }
      ComObjError(1)
      Return Result
   }
   ; ===================================================================================================================
   ; Convert a result object as returned from Query() into a string.
   ; ===================================================================================================================
   ToString(Result, ColDelim := "|", RowDelim := "`n") {
      Str := ""
      For I1, Table In Result {
         Str .= RowDelim
         For I2, Row In Table {
            Str .= RowDelim
            For I3, Column In Row
               Str .= (I3 > 1 ? ColDelim : "") . Column
         }
      }
      Return SubStr(Str, 3)
   }
   ; ===================================================================================================================
   ; Get the last error.
   ; ===================================================================================================================
   GetError() {
      This.LastError := LastErrors := ""
      For Item In This.Connection.Errors
         LastErrors .= "`n`n" . Item.Description . "`n"
                    .  "Error number: " . Item.Number . "`n"
                    .  "Error source: " . Item.Source . "`n"
                    .  "Native error: " . Item.NativeError . "`n"
                    .  "SQL state: "    . Item.SQLState
      This.LastError := SubStr(LastErrors, 3)
   }
}
Ohne ein Grundwissen über SQL-Datenbanken ist es aber schwierig.
User avatar
jNizM
Posts: 3183
Joined: 30 Sep 2013, 01:33
Contact:

Re: Oracle Datenbank

05 Apr 2017, 00:55

Darf man fragen was du geändert / verbessert hast, da ich das ADO Script auch täglich benutze?
[AHK] v2.0.5 | [WIN] 11 Pro (Version 22H2) | [GitHub] Profile
just me
Posts: 9458
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Oracle Datenbank

05 Apr 2017, 01:10

Moin jNizM,

ehrlich gesagt, ich weiß das nicht mehr. In jedem Fall habe ich das an "meinen Stil" angepasst und den Inhalt der ursprünglichen Funktion auf mehrere Methodenaufrufe verteilt. Ich glaube nicht, dass da 'echte' funktionale Verbesserungen oder Ergänzungen drin sind.
just me
Posts: 9458
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Oracle Datenbank

05 Apr 2017, 02:05

Nach einigem Überlegen glaube ich wieder zu wissen, was für mich 'besser' war:
  • Durch die Aufteilung auf Methoden kann die Connection für mehrere aufeinanderfolgende Queries offen gehalten werden.
  • Ich habe noch die Transaktionsklammern zugefügt. Allerdings habe ich das mit schreibenden Zugriffen bestenfalls ein paar Mal getestet.
Nmk
Posts: 28
Joined: 20 Jan 2017, 19:29

Re: Oracle Datenbank

06 Apr 2017, 01:52

Guten Morgen,

na da geht's schon los. Das habe ich mir einfacher vorgestellt. Ich dachte ich wähle mich dort einfach mit Zugangsdaten ein und greife die Daten ab oder schreibe sie dort hinein. *hüstel*

Muss der Oracle OLEDB Treiber auf jedem System, auf dem das Program laufen soll, seperat installiert werden und wenn kann man den irgendwie intirgrieren. Sei es in der Installationsroutine. Das Einrichten der ODBC-Datenquelle kann man doch sicherlich auch mit AHK im Hintergrund automatisch erledigen, oder nicht?

Wichtig ist für mich, dass der Anwender am Ende nur mein fertiges Program installieren muss und das Ding läuft. Ich weiß moch nicht wie genau aber das kann doch sicherlich mit AHK realisieren.

Gruß

Nmk
just me
Posts: 9458
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Oracle Datenbank

06 Apr 2017, 02:47

Moin,

soweit ich mich erinnere, waren die von Oracle gelieferten Installationsroutinen (Oracle Installer) 'etwas sperrig'. Wenn das immer noch so ist, wird eine 'automatisierte Installation' wohl auch zur Herausforderung. Was man tun konnte (ich weiß nicht, ob die XP-Nachfolger das noch so zulassen): Eine Installation auf einem Rechner durchlaufen lassen und dann die zugehörigen Schlüssel der Registry, die Umgebungsvariablen und das Installationsverzeichnis auf andere Rechner kopieren.

Bei mir war allerdings auf den betroffenen Rechnern alles fertig vorbereitet, weil mein Tool nur als Ergänzung für andere Zugriffsprogramme genutzt wurde.
Nmk
Posts: 28
Joined: 20 Jan 2017, 19:29

Re: Oracle Datenbank

07 Apr 2017, 01:47

Moin Moin,

ich bin gespannt. Bekomme heute den Zugang für eine Testddatenbank. Dann kann ich mir das erst genauer ansehen. *kribbel*
Nmk
Posts: 28
Joined: 20 Jan 2017, 19:29

Re: Oracle Datenbank

11 Apr 2017, 06:29

Es ist zum Verzweifeln. Ich komme nicht einmal auf den Server. Ist der Connection String immer der Gleiche? Also egal von welcher Programmiersprache man ausgeht.

Eine andere Frage: Brauche ich bei Class_MySQLAPI auch irgendwelche Treiber oder eine ODBC Datenquelle? Oder läuft das ohne zusätzlichen Komponenten (Neudeutsch: Standalone)?

Gruß

Nmk
User avatar
jNizM
Posts: 3183
Joined: 30 Sep 2013, 01:33
Contact:

Re: Oracle Datenbank

11 Apr 2017, 06:53

Tipp:
Erstelle eine .udl Datei und überprüfe ob du eine Verbindung hinbekommst.
Wenn das klappt, kannst du die .udl Datei mit Notepad öffnen und erhälst den Connection-String der funktioniert

Ref: Verbindung zum SQL Server mit einer UDL Datei testen
[AHK] v2.0.5 | [WIN] 11 Pro (Version 22H2) | [GitHub] Profile
Nmk
Posts: 28
Joined: 20 Jan 2017, 19:29

Re: Oracle Datenbank

12 Apr 2017, 14:26

Vertieft, das Ganze nun in MySQL umzusetzen, habe ich mir das gerade erst angesehen. Sie vielversprechend aus. Das einzige was mich an der Oracle-Lösung massiv abschreckt ist die Notwendigkeit der Treiber und der ODBC-Datenquelle. Ich werde es morgen im Büro auf jeden Fall einmal testen.

Gruß

Nmk

Return to “Ich brauche Hilfe”

Who is online

Users browsing this forum: No registered users and 68 guests