C# 使用Oracle.ManagedDataAccess时打开Oracle连接失败

C# 使用Oracle.ManagedDataAccess时打开Oracle连接失败,c#,oracle,powershell,C#,Oracle,Powershell,我正在用.Net控制台应用程序和powershell脚本测试Oracle.ManagedDataAccess 4.121.1.0,在我的c#应用程序中一切正常。不幸的是,当我尝试使用open方法打开oracle连接时,我的PowerShell脚本出现了一个奇怪的问题 这是我的Powershell“脚本” 抛出的错误是 关于«开放»avec«0»参数的例外情况: «Oracle.ManagedDataAccess中的不可能数据传输, 版本=4.121.1.0,区域性=中性,PublicKeyTok

我正在用.Net控制台应用程序和powershell脚本测试Oracle.ManagedDataAccess 4.121.1.0,在我的c#应用程序中一切正常。不幸的是,当我尝试使用open方法打开oracle连接时,我的PowerShell脚本出现了一个奇怪的问题

这是我的Powershell“脚本”

抛出的错误是

关于«开放»avec«0»参数的例外情况: «Oracle.ManagedDataAccess中的不可能数据传输, 版本=4.121.1.0,区域性=中性,PublicKeyToken=89b483f429 c47342.»Au niveau de C:\oracle\oracle.ps1:5克拉特雷:10

在c#控制台应用程序中编写的相同代码工作正常

我认为这是一个配置问题,但我迷路了

有人已经有这个问题了吗


Thx

不确定它是否有用,但下面是我在PowerShell 3.0上的工作原理

我根据自述文件下载并安装ODAC112320xCOPY_x64.zipfrom

这是我的剧本:

# 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()

新的Oracle托管数据访问程序集仅支持.NET 4.0及更高版本。如果您使用的是Powershell 2.0,那么您使用的是.NET 3.5或.NET 2.0

您需要使用Powershell v3,或者您可以尝试将Powershell v2设置为使用更高版本的.NET,如本文所述。注意:这将破坏某些功能,例如远程处理:


或者,正如建议的那样,您可以使用“半管理”11g客户端。

在花了两个小时试验其他方法后,将连接指定为字符串终于对我起作用了。我正在使用Powershell 4

$tns=“数据源=(描述=(地址=(协议=TCP)(主机=myoracle.server.mydomain)(端口=1521))(连接数据=(服务名称=myoracle.server.mydomain));用户Id=myid;密码=mypass;”


$con=new object Oracle.ManagedDataAccess.Client.OracleConnection($tns)

我的法语不好,只是说找不到ManagedDataAccess程序集。这条路径是有效路径吗?我的法语不是很差,我遇到了与前一版本完全相同的问题。问题是由于PowerShell Iwas使用的是64位,无法加载32位程序集。oracle程序集的路径正确。Oracle.ManagedDataAccess.dll是任何cpu管理的程序集,因此我可以在64位或32位主机中加载它。我正在使用Powershell v2.0,无需将来升级。我遵循了您的解决方案,它工作正常,但我的目标是使用Oracle.ManagedDataAccess.dll。我在powershell 2.0中使用了.net 4 framework(我已经调整了powershell.exe.config),在这种配置下(在我的情况下)无法正确使用Oracle托管数据访问程序集。但我尝试了Powerhsell 3,效果很好!
# 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()