【问题标题】:Access remote Oracle database with Powershell使用 Powershell 访问远程 Oracle 数据库
【发布时间】:2015-06-07 19:49:33
【问题描述】:

我需要能够连接到我网络上的基于 Windows 7 的 Oracle 服务器(32 位,Oracle XE)。我需要连接的机器运行的是 Windows 7 64 位,两台机器上都安装了 Powershell。

我已经在我的 64 位机器上安装了 Oracle 32 位客户端,并且在两台机器上都安装了 SQL Developer。我想创建一个连接 Oracle 数据库并运行简单 SELECT 查询的脚本。但我无法连接。

我尝试过使用 ODAC(我认为我必须安装 Visual Studio 才能使用它,因为安装失败)。我听说 OleBD 可能会容易得多。我想用 TNS 来做是可能的。有人可以在这里给我任何指导吗?我有一本关于 Powershell 和 Oracle 的书,但我仍然很困惑,我无法通过第一阶段。

任何帮助将不胜感激。

【问题讨论】:

  • this 有帮助吗?

标签: sql oracle powershell database-connection nuget-package


【解决方案1】:

这是我在 2015 年使用的一个小例子。

# Ora002.ps1
# Need installation of ODAC1120320Xcopy_x64.zip 
# The 32 bit version also exists

# Load the 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.5.123)(PORT=1609)))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=COMPEIERE)));User Id=TheLogin;Password=ThePassword;"

# Connexion
$oraConn= New-Object Oracle.DataAccess.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.DataAccess.Client.OracleCommand($sql1,$oraConn)

# Execution
$reader1=$command1.ExecuteReader()

$n = 0
while ($reader1.read())
{
  $reader1["XX_MYSESSION_ID"]  
}

# Fermeture de la conexion
$reader1.Close()
$oraConn.Close()

Write-Output $retObj

-- 2017 年秋季编辑 -----

现在,Oracle 为 .NET 编辑了一个完整的托管 DLL,可通过 Nugets 获得:

# 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"]  
}

# Fermeture de la conexion
$reader1.Close()
$oraConn.Close()

Write-Output $retObj

【讨论】:

  • 我会试试这个。要安装 ODAC1120320Xcopy_x64 - 您是否需要为此或任何 .net 框架组件安装 Visual Studio?
  • 只需解压 Odac 文件并按照 readme.htm 文件安装“ODP.NET4 - Oracle Data Provider for .NET 4”。
  • 我已经尝试过这样做。当我运行 install.bat 时,命令提示符窗口会短暂出现,然后消失,没有其他任何反应。我已经安装了 Oracle 客户端(32 位)。您认为这会造成问题吗?
  • 我真的不知道,你确定这台机器上安装了.net框架吗?
【解决方案2】:

我已经用 Oracle DLL 路径更新了上面的代码。 当我们从 Powershell 连接 Oracle 时,我们连接到托管 Oracle 服务 DLL,它可以在下面提到的路径中找到。

也许我错了,但下面的代码对我有用。

cls
# Ora002.ps1
# Need installation of ODAC1120320Xcopy_x64.zip 
# The 32 bit version also exists

# Load the good assembly
Add-Type -Path "C:\app\ssz\product\12.1.0\client_1\odp.net\managed\common\Oracle.ManagedDataAccess.dll"

# Production connexion string
$compConStr = "Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=*<Valid Host>*)(PORT=*<Valid Port>*)))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=*<SErviceNameofDB>*)));User Id=*<User Id>*;Password=*<Password>*;"

# Connexion
$oraConn= New-Object Oracle.ManagedDataAccess.Client.OracleConnection($compConStr)
$oraConn.Open()

# Requête SQL
$sql1 = @"SELECT col FROM tbl1 
WHERE col1='test'
"@

$command1 = New-Object Oracle.ManagedDataAccess.Client.OracleCommand($sql1,$oraConn)

# Execution
$reader1=$command1.ExecuteReader()

while ($reader1.read())
{
  $reader1["col"]  
}

# Fermeture de la conexion
$reader1.Close()
$oraConn.Close()

Write-Output $retObj

【讨论】:

    【解决方案3】:

    接受的答案依赖于客户端安装,并且由于 Oracle 发布了新的托管版本,它也已过时。可以使用.NET Oracle library DLL,只要确保lib文件夹下有所需的DLL文件即可。

    Add-Type -Path "lib\Oracle.ManagedDataAccess.dll"
    
    $query = "select  1 as Col1, 2 as Col2, 3 as Col3 from dual
              union
              select  4 as Col1, 5 as Col2, 6 as Col3 from dual
              union
              select  7 as Col1, 8 as Col2, 9 as Col3 from dual"
    
    $cn   = New-Object Oracle.ManagedDataAccess.Client.OracleConnection -ArgumentList "TNS-ConnectionString-Here"
    $cmd  = New-Object Oracle.ManagedDataAccess.Client.OracleCommand    -ArgumentList $query
    
    $cmd.Connection = $cn
    
    try {
        $cn.Open()
    
        $reader = $cmd.ExecuteReader()
    
        while ($reader.Read()) {
            $col1 = $reader["Col1"]
            $col2 = $reader["Col2"]
            $col3 = $reader["Col3"]
    
            Write-Host $col1, $col2, $col3
        }
    
        $reader.Dispose()
    
    } catch {
        Write-Error $_.Exception.Message
    } finally {
        $cmd.Dispose()
        $cn.Dispose()
    }
    

    【讨论】:

    • 对,就是我现在用的那个,只是两年前不存在。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-06
    • 2021-01-08
    • 2021-09-12
    • 2013-05-03
    • 2016-03-20
    • 2017-09-02
    • 1970-01-01
    相关资源
    最近更新 更多