2017-06-27 7 views
3

Ich habe Probleme beim Verbinden mit einer Oracle-Datenbank von Powershell mit der Oracle.ManagedDataAccess.dll.Powershell-Verbindung zur Oracle-Datenbank

Ich folgte this Tutorial auf Technet und endete mit diesem Code auf:

add-type -path "C:\oracle\product\12.1.0\client_1\ODP.NET\managed\common\Oracle.ManagedDataAccess.dll" 
$username = "XXXX" 
$password = "XXXX" 
$data_source = "(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=XXXX)(PORT=XXXX))(CONNECT_DATA = (SERVER=dedicated)(SERVICE_NAME=XXXX)))" 
$connection_string = "User Id=$username;Password=$password;Data Source=$data_source" 

try{ 
    $con = New-Object Oracle.ManagedDataAccess.Client.OracleConnection($connection_string) 

    $con.Open() 
} catch { 
    Write-Error (“Can’t open connection: {0}`n{1}” -f ` 
     $con.ConnectionString, $_.Exception.ToString()) 
} finally{ 
    if ($con.State -eq ‘Open’) { $con.close() } 
} 

Leider diesen Fehler Ich erhalte:

C:\Users\XXXX\Desktop\oracle_test.ps1 : Can’t open connection: User Id=XXXX;Password=XXXX;Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=XXXX)(PORT=XXXX))(CONNECT_DATA = 
(SERVER=dedicated)(SERVICE_NAME=XXXX))) 
System.Management.Automation.MethodInvocationException: Exception calling "Open" with "0" argument(s): "The type initializer for 'Oracle.ManagedDataAccess.Types.TimeStamp' threw an exception." ---> 
System.TypeInitializationException: The type initializer for 'Oracle.ManagedDataAccess.Types.TimeStamp' threw an exception. ---> System.Runtime.Serialization.SerializationException: Unable to find assembly 
'Oracle.ManagedDataAccess, Version=4.121.2.0, Culture=neutral, PublicKeyToken=XXXX'. 
    at OracleInternal.Common.OracleTimeZone.GetInstance() 
    at Oracle.ManagedDataAccess.Types.TimeStamp..cctor() 
    --- End of inner exception stack trace --- 
    at OracleInternal.ConnectionPool.PoolManager`3.CreateNewPR(Int32 reqCount, Boolean bForPoolPopulation, ConnectionString csWithDiffOrNewPwd, String instanceName) 
    at OracleInternal.ConnectionPool.PoolManager`3.Get(ConnectionString csWithDiffOrNewPwd, Boolean bGetForApp, String affinityInstanceName, Boolean bForceMatch) 
    at OracleInternal.ConnectionPool.OraclePoolManager.Get(ConnectionString csWithNewPassword, Boolean bGetForApp, String affinityInstanceName, Boolean bForceMatch) 
    at OracleInternal.ConnectionPool.OracleConnectionDispenser`3.Get(ConnectionString cs, PM conPM, ConnectionString pmCS, SecureString securedPassword, SecureString securedProxyPassword) 
    at Oracle.ManagedDataAccess.Client.OracleConnection.Open() 
    at CallSite.Target(Closure , CallSite , Object) 
    --- End of inner exception stack trace --- 
    at System.Management.Automation.ExceptionHandlingOps.CheckActionPreference(FunctionContext funcContext, Exception exception) 
    at System.Management.Automation.Interpreter.ActionCallInstruction`2.Run(InterpretedFrame frame) 
    at System.Management.Automation.Interpreter.EnterTryCatchFinallyInstruction.Run(InterpretedFrame frame) 
    at System.Management.Automation.Interpreter.EnterTryCatchFinallyInstruction.Run(InterpretedFrame frame) 
    + CategoryInfo   : NotSpecified: (:) [Write-Error], WriteErrorException 
    + FullyQualifiedErrorId : Microsoft.PowerShell.Commands.WriteErrorException,oracle_test.ps1 
  • ich überprüft haben, dass die Verbindungszeichenfolge ist Korrekt (funktioniert für tnsping)
  • Der Benutzername und das Passwort sind ebenfalls korrekt
  • I ersetzt alles, was mit XXXX
  • der Datenbankversion ist nicht bekannt gegeben werden soll: Oracle Datenbank 12c Veröffentlichung 12.1.0.1.0
  • Der Fehler ist das gleiche für den 32-Bit und 64- Bit Powershell Fällen
  • Vor dem ersten Lauf der Oracle.ManagedDataAccess.dll nicht geladen wird, nach dem Lauf es bleibt geladen, bis ich, dass Shell schließen

Leider bin ich weder ein Oracle noch ein Powershell-Experte (ich ziehe MySQL und Python), ther Bevor ich irgendwelche Ideen und/oder Einblicke schätze, die Sie haben könnten.

Wenn Sie weitere Informationen benötigen, zögern Sie bitte nicht zu fragen.

Vielen Dank im Voraus!

+0

[Gibt dieser stackoverflow Hilfe?] (Https://Stackoverflow.com/a/32924359/5039142) Ich glaube nicht, dass es ein Fehler mit Ihrem Code ist; wahrscheinlich die Umwelt oder eine Voraussetzung. – gms0ulman

+0

Was ist die Version Ihrer Oracle-Datenbank? –

+1

@WernfriedDomscheit Ich habe es zur Liste hinzugefügt - 12c Release 12.1.0.1.0 @ gms0ulman Das erwähnte 'gacutil' scheint nicht auf meinem System installiert zu sein - ich werde es untersuchen. – Maurice

Antwort

0

Ich bin nicht sicher, ob dies technisch eine Lösung ist - ich würde es eher als Workaround einstufen, aber es hat für mich funktioniert.


Nach etwas mehr Forschung zu tun, fand ich eine geeignete Alternative zum Oracle.ManagedDataAccess.dll. Ich habe die System.Data.OracleClient Klasse des .Net Framework gefunden. (Es benötigt eine installierte Oracle Client, der die Maschine zum Glück hat)

Hier eine übersicht der Lösung, die für mich gearbeitet:

add-type -AssemblyName System.Data.OracleClient 

$username = "XXXX" 
$password = "XXXX" 
$data_source = "XXXX" 
$connection_string = "User Id=$username;Password=$password;Data Source=$data_source" 

$statement = "select level, level + 1 as Test from dual CONNECT BY LEVEL <= 10" 

try{ 
    $con = New-Object System.Data.OracleClient.OracleConnection($connection_string) 

    $con.Open() 

    $cmd = $con.CreateCommand() 
    $cmd.CommandText = $statement 

    $result = $cmd.ExecuteReader() 
    # Do something with the results... 

} catch { 
    Write-Error (“Database Exception: {0}`n{1}” -f ` 
     $con.ConnectionString, $_.Exception.ToString()) 
} finally{ 
    if ($con.State -eq ‘Open’) { $con.close() } 
} 
0

Ich hatte genau das gleiche Problem, und ich wechselte von ODAC Version 12.2. 0.1.0 bis Version 11.2.0.3 und es funktionierte wie ein Charme, um die Verbindung zu öffnen und Daten zu lesen. Hoffe das hilft. Danke, SK

Verwandte Themen