我正在使用.Net控制台应用程序和powershell脚本测试Oracle.ManagedDataAccess 4.121.1.0,在我的c#应用程序中都可以。不幸的是,当我尝试使用open方法打开oracle连接时,我的powershel脚本有一个奇怪的问题。
这是我的Powershell“剧本”
Add-Type -Path 'C:\Oracle\odp.net\managed\common\Oracle.ManagedDataAccess.dll'
$CNX = 'Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(COMMUNITY = tcp.world)(PROTOCOL = TCP)(Host = HOST)(Port = 1521)))(CONNECT_DATA=(SID=SID)));User ID=USER;Password=PWD;'
$con = New-Object Oracle.ManagedDataAccess.Client.OracleConnection("$CNX")
$con.open()
抛出的错误是
Exception lors de l'appel de«Open»avec«0»argument(s): “不可能发生故障”,“Oracle.ManagedDataAccess, Version = 4.121.1.0,Culture = neutral,PublicKeyToken = 89b483f429 c47342' 。 »Au niveau de C:\ oracle \ oracle.ps1:5Caractère:10
在c#控制台应用程序中编写的相同代码可以正常工作。
我认为是配置问题,但我迷路了......
任何人都有此问题吗?
THX
答案 0 :(得分:2)
不确定它有什么帮助,但这是适用于PowerShell 3.0的原因
我根据here的自述文本文件ODAC1120320Xcopy_x64.zip
下载并安装。
这是我的剧本:
# getting good assembly
Add-Type -Path "C:\oracle\odp.net\bin\4\Oracle.DataAccess.dll"
# Connexion string
$compConStr = "Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=10.213.6.15)(PORT=3000)))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=MySERVER)));User Id=toto;Password=toto;"
# Establish connexion
$oraConn= New-Object Oracle.DataAccess.Client.OracleConnection($compConStr)
$oraConn.Open()
以下是我用于在Oracle.ManagedDataAccess.dll
上运行的代码:
# Download the package if it's not on the disk
$version = '12.2.1100'
try
{
if (! $(Test-Path ".\NugetPackages\Oracle.ManagedDataAccess.$version\lib\net40\Oracle.ManagedDataAccess.dll"))
{
$ManagedDataAccess = Install-Package Oracle.ManagedDataAccess -Destination ".\NugetPackages" -Force -Source 'https://www.nuget.org/api/v2' -ProviderName NuGet -RequiredVersion $version -ErrorAction SilentlyContinue
}
Add-Type -Path ".\NugetPackages\Oracle.ManagedDataAccess.$version\lib\net40\Oracle.ManagedDataAccess.dll"
}
catch [System.Management.Automation.ParameterBindingException]
{
$global:OracleError = New-Object PSCustomObject -Property @{"StackTrace"=$_.ScriptStackTrace;"Detail" = "Ligne $($_.InvocationInfo.ScriptLineNumber) : $($_.exception.message)";"TimeStamp"=([datetime]::Now)}
$log = $null
}
# Connexion
$oraConn= New-Object Oracle.ManagedDataAccess.Client.OracleConnection (($compConStr)
$oraConn.Open()
# Requête SQL
$sql1 = @"
SELECT XX_MYSESSION_ID FROM XX_SILOGIXWSLOG
WHERE xx_name='customer_log'
AND xx_param_4 IS NOT NULL
"@
$command1 = New-Object Oracle.ManagedDataAccess.Client.OracleCommand($sql1,$oraConn)
# Execution
$reader1=$command1.ExecuteReader()
$n = 0
while ($reader1.read())
{
$reader1["XX_MYSESSION_ID"]
}
# Close the conexion
$reader1.Close()
$oraConn.Close()
答案 1 :(得分:1)
新的Oracle Managed Data Access程序集仅支持.NET 4.0及更高版本。如果您使用的是Powershell 2.0,那么您使用的是.NET 3.5或.NET 2.0
您需要使用Powershell v3,或者您可以尝试将Powershell v2设置为使用更高版本的.NET,如本博文中所述。 注意:这会打破一些像远程处理:
http://tfl09.blogspot.com/2010/08/using-newer-versions-of-net-with.html
或者按照建议您可以使用“半管理”11g客户端。
答案 2 :(得分:0)
在花了两个小时尝试其他方法后,将连接指定为字符串最终为我工作。我正在使用Powershell 4。
$ tns ="数据源=(DESCRIPTION =(ADDRESS =(PROTOCOL = TCP)(HOST = myoracle.server.mydomain)(PORT = 1521))(CONNECT_DATA =(SERVICE_NAME = myoracle.server.mydomain) )));用户ID = myid;密码= mypass;"
$ con = new-object Oracle.ManagedDataAccess.Client.OracleConnection($ tns)