Seiten

Donnerstag, 6. März 2014

Powershell und Oracle-connect

Ein Testconnectskript

Die PowerShell ist ein tolles Werkzeug. Man kann Sie für ausgeklügelte Backupskripte benutzen, das Housekeeping damit automatisieren und auch auf die Oracle-DB zugreifen.
Der Zugriff ist manchmal nicht so einfach einzurichten. Gerade, wenn es mehrere ORACLE_HOMEs auf dem Rechner gibt, kann man eine Menge Zeit mit der Suche nach dem richtigen Connectionstring und dem genutzten ORACLE_HOME verschwenden - ich habe jedenfalls schon viel Zeit damit verschwendet.
Deshalb nutze ich seit einiger Zeit dieses Test-Skript, welches ich auf dem entsprechenden Rechner nur noch anpasse:



$AssemblyFile     = "D:\oracle\product\11.2.0.4\dbhome_1\ODP.NET\bin\2.x\Oracle.DataAccess.dll"
$ConnectionString = "Data Source=(DESCRIPTION=(ADDRESS=
                        (PROTOCOL=TCP)
                        (HOST=server01)
                        (PORT=1521))
                        (CONNECT_DATA=(SERVICE_NAME=orcl)));
                        User Id=oradba;
                        Password=orapwd"
$CommandText = "SELECT count(*) FROM all_users"
[Reflection.Assembly]::LoadFile($AssemblyFile)
$OracleConnection = ""
$OracleConnection = New-Object -TypeName Oracle.DataAccess.Client.OracleConnection
$OracleConnection.ConnectionString = $ConnectionString
$OracleConnection.Open()
$OracleCommand = New-Object -TypeName Oracle.DataAccess.Client.OracleCommand
$OracleCommand.CommandText = $CommandText
$OracleCommand.Connection = $OracleConnection
$OracleDataAdapter = New-Object -TypeName Oracle.DataAccess.Client.OracleDataAdapter
$OracleDataAdapter.SelectCommand = $OracleCommand
$DataSet = New-Object -TypeName System.Data.DataSet
$OracleDataAdapter.Fill($DataSet)
$OracleDataAdapter.Dispose()
$OracleCommand.Dispose()
$OracleConnection.Dispose()
$OracleConnection.Close()
$DataSet.Tables[0]

Hier müssen nur die Variablen $AssemblyFile und $ConnectionString angepasst werden. Wenn alles in Ordnung ist, sieht die Ausgabe so aus:

Powershell ISE ohne tnsnames.ora

Ich verwende sehr gern die PowerShell ISE. Beim Testen zickt sie aber gern.
Wenn man auf eine DB zugreifen möchte (korrekter Code, alles i.O....) und die DB ist in der tnsnames.ora nicht korrekt eingetragen, bekomme man einen Fehler.
Soweit korrekt.
Jetzt korrigiert man natürlich die tnsnames.ora und versucht den connect erneut.
Die überraschende Folge: Gleiche Fehlermeldung.

Wenn man jetzt aber die PS ISE schließt, erneut startet und den selben Code wieder ausführt: keine Fehlermeldung, alles läuft durch!?!

Meiner Meinung nach prüft die ISE die Systemumgebung nicht erneut oder hat einen Cache, der nicht geleert wird - was auch immer - und liest die aktualisierte tnsnames.ora nicht.
Das ist der Grund, warum ich oben genanntes Skript verwende. Es greift nicht auf die tnsnames.ora zu sondern  nutzt direkt den Connectionstring. (http://www.connectionstrings.com/oracle/)