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
Oracle Datenbank
Moderator: jNizM
Re: Oracle Datenbank
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/
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/
Re: Oracle Datenbank
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.
Re: Oracle Datenbank
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:
Ohne ein Grundwissen über SQL-Datenbanken ist es aber schwierig.
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)
}
}
Re: Oracle Datenbank
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
Re: Oracle Datenbank
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.
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.
Re: Oracle Datenbank
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.
Re: Oracle Datenbank
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
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
Re: Oracle Datenbank
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.
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.
Re: Oracle Datenbank
Moin Moin,
ich bin gespannt. Bekomme heute den Zugang für eine Testddatenbank. Dann kann ich mir das erst genauer ansehen. *kribbel*
ich bin gespannt. Bekomme heute den Zugang für eine Testddatenbank. Dann kann ich mir das erst genauer ansehen. *kribbel*
Re: Oracle Datenbank
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
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
Re: Oracle Datenbank
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
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
Re: Oracle Datenbank
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
Gruß
Nmk
Who is online
Users browsing this forum: No registered users and 68 guests