kallewirsch
Goto Top

Powershell + DB-Abfrage + Result

Hallo,

ich versuche mit Powershell eine Oracle-Tabelle abzufragen.
Genutzt wird die durch die Oracle-Client-Installation installierten dlls, also Oracle:data.Access.dll

Die Connectierung zur DB ist erfolgreich, auch meine Abfrage stimmt. Es ist ein einfaches select count(*) from tbljob.

in meinem Konstruct bekomme ich immer eine 1 zurückgeliefert. Mir ist völlig klar, dass dies nicht das _Ergebnis aus count(*) ist, sondern die Anzahl der zurückgelieferten Ergebniszeilen.

Meine Frage ist nun:

Wie kann ich auf das Ergebnis zugreifen?

Vielen Dank für Eure Unterstützung.

Content-ID: 419233

Url: https://administrator.de/contentid/419233

Ausgedruckt am: 22.11.2024 um 08:11 Uhr

Kraemer
Kraemer 18.02.2019 um 16:59:46 Uhr
Goto Top
Moin,

da du nichts darüber schreibst, wie dein Code aussieht, bleibt nur der Tipp: Jag es mal durch get-member https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell. ...

Gruß
kallewirsch
kallewirsch 18.02.2019 um 17:15:09 Uhr
Goto Top
Hallo,

ich hatte eben den Code vergessen, hier kommt er:

clear-host
$res_array=0

$odpAssemblyName = "Oracle.DataAccess, Version=2.121.2.0, Culture=neutral, PublicKeyToken=89b483f429c47342"   
[System.Reflection.Assembly]::Load($odpAssemblyName) 
 
$conn = New-Object Oracle.DataAccess.Client.OracleConnection

#Function to Open connection to oracle DB

function Connect-Oracle{
        [CmdletBinding()]
        param(
            [string] $connectionString = $(throw "connectionString is required")  
        )
   
$conn= New-Object Oracle.DataAccess.Client.OracleConnection($connectionString)
$conn.Open()
Write-Output $conn
}


#Create connection string with database settings


function Get-ConnectionString{
        [CmdletBinding()]
        param(
            [string]$user = "dbuser",  
            [string]$pass = "dbpw",  
            [string]$hostName = "meindbserver",  
            [string]$port = "1521",  
            [string]$sid = "test"  
        )
$dataSource = ("(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST={0})(PORT={1}))(CONNECT_DATA=(SERVICE_NAME={2})))" -f $hostName, $port, $sid)  
Write-Output ("Data Source={0};User Id={1};Password={2}" -f $dataSource, $user, $pass)  
}


# Starts the connection
$conn = Connect-Oracle (Get-ConnectionString) 

# Get connection state and Server version
"Connection state is {0}, Server Version is {1}" -f $conn.State, $conn.ServerVersion  


function Get-DataTable{
        [CmdletBinding()]
        Param(
            [Parameter(Mandatory=$true)]
            [Oracle.DataAccess.Client.OracleConnection]$conn,
            [Parameter(Mandatory=$true)]
            [string]$sql
        )
$cmd = New-Object Oracle.DataAccess.Client.OracleCommand($sql,$conn)
$da = New-Object Oracle.DataAccess.Client.OracleDataAdapter($cmd)
$dt = New-Object System.Data.DataTable
[void]$da.Fill($dt)
return ,$dt
}

#SQL query

$SQLquery = "select count(*) from  sysadm.tbljob"  

#Executes query

$dt = Get-DataTable $conn $SQLquery

#Counts returned rows
Write-Host "Retrieved records:"  $dt.Rows.Count -ForegroundColor Yellow           

#Terminates the connection
$conn.Close()

# Returns connection state
"Connection state is {0}" -f $conn.State  
138810
Lösung 138810 18.02.2019 aktualisiert um 17:29:02 Uhr
Goto Top
Wie kann ich auf das Ergebnis zugreifen?
Simple Datatable
$dt.Rows
Liefert dir ein Array aus DataRow-Objekten in dem du auf die Spalten des Ergebnisses zugreifen kannst.
$dt.Rows | %{
    $_.SpalteXY
}

Und wie man weiß nutzt PS die .NET Klassen somit auch alle Eigenschaften dieser. Also den an den Speck und lesen.
kallewirsch
kallewirsch 18.02.2019 um 17:31:34 Uhr
Goto Top
@138810:

Danke für Deine schnelle RÜ, aber ich seh den Wald vor lauter Bäumen nicht mehr.

Hast einen genaueren Tip?
Besten Dank
138810
138810 18.02.2019 aktualisiert um 21:40:39 Uhr
Goto Top
Wie bitte?? Also noch genauer geht fast nicht und oben steht es frei Haus. Belese dich zur Datatable und es gibt nichts hinzuzufügen!
kallewirsch
kallewirsch 18.02.2019 um 21:55:01 Uhr
Goto Top
@138810:
Danke für Deine Unterstützung. Ich bin nun wirklich kein copy'paster! Fehler geschehen und Deine Lösung hatte ich nur halb auf dem Handy display gelesen und somit war sie nicht komplett sichtbar.
Danke für Deine Vorverurteilung.

Beste Grüße
Kallewirsch
138810
138810 18.02.2019 aktualisiert um 22:28:35 Uhr
Goto Top
Handy display
Dann ein Touchpaster face-big-smile
Ich bin nun wirklich kein copy'paster!
Naja woher sollst du den Code oben sonst haben wenn du dir diese simple Antwort nicht selbst beantworten kannst, selbst geschrieben bestimmt nicht, denn dann hätte sich diese Frage nie gestellt.