ODP.NET 在命令外壳中工作,但作为计划任务失败(Windows Server 2012 R2)



尝试运行使用 Oracle.DataAccess 运行 PowerShell 脚本的计划任务.dll程序集会引发以下错误

New-Object : 使用"0"参数调用".ctor"的异常:"'Oracle.DataAccess.Client.OracleConnection'的类型初始值设定项抛出了异常。

以同一用户身份在 PowerShell 窗口中运行与计划任务相同的操作和参数可以正常工作。

我尝试使用[System.Reflection.Assembly]::LoadFileAdd-Type -AssemblyNameAdd-Type -Path加载 DLL

计划任务和 PowerShell 窗口之间有什么区别会导致这种情况?

我遇到了这个问题很多次。对我来说,它来自未加载Oracle DLL的事实(路径和用户可能不同(。

第一:有一段时间,Oracle编辑了一个完整的.NET托管DLL,可以通过Nugets获得。所以我停止使用需要 Oracle 软件包安装的本机 odp.net。现在在每个脚本中我使用:

# Download the package if it's not on the disk    
$version = '18.3.0'
try
{
if (! $(Test-Path ".NugetPackagesOracle.ManagedDataAccess.$versionlibnet40Oracle.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 ".NugetPackagesOracle.ManagedDataAccess.$versionlibnet40Oracle.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()

第二:我使用以下代码片段来发现脚本目录,它适用于正常和计划作业(您可以为计划任务修改它(。

# Discover the Directory script
$scriptDirectory = $(Split-Path -parent $PSCommandPath)
if ($scriptDirectory -eq $null -or $scriptDirectory -eq "")
{
$scriptDirectory = split-path -parent $((Get-ScheduledJob -Name 'RMAWarning').Command)
}

相关内容

最新更新