none
SQL Datenbanktabelle korrekt auslesen RRS feed

  • Frage

  • Hallo Zusammen

    Die Verbindung mit der DB und die Query funktioniert. Aber die Systeme werden nicht in der foreach schleife übernommen.

    Beim Starten des Script erhalte ich die Meldung: Warning: System: System.Data.DataRow Offline.

    Hier mein Code:

    cls
    # DataAcess DLL einbinden
     $AssemblyFile = "C:\Apps\oracle\clients\112_64\odp.net\bin\2.x\Oracle.DataAccess.dll"
     
    # Connect String mit Angabe TNS Alias
    $ConnectionString = "User ID=QUERY;Password=xxxxxxx;Data Source=DB1;Persist Security Info=True"
     
    # Auszuführendes Kommando 
    $SQLCommand = "SELECT distinct m.COMPUTERNAME
    				FROM xxxxxxxxxxxx
    					 xxxxxxxxxxxx"
     
    # DLL laden
    [Reflection.Assembly]::LoadFile($AssemblyFile) | Out-Null
     
    #Verbindung zur Datenbank aufbauen
    # Object anlegen
    $OracleConnection = New-Object -TypeName Oracle.DataAccess.Client.OracleConnection
    Write-Host -ForegroundColor White "Opening Connection to Oracle Database DB1"
    Start-Sleep -Seconds 2
    # Connect string setzen
    $OracleConnection.ConnectionString = $ConnectionString
    # Datenbank Verbindung öffnen
    $OracleConnection.Open()
     
    if ($ConnectionString)
    {
    	Write-Host -ForegroundColor Green "Connection Success"
    	Write-Host ""
    	Start-Sleep -Seconds 5
    } 
    else 
    {
    	Write-Host -ForegroundColor Red "Connection Failed"
    }
     
    #SQL Kommando initalisieren
    $OracleCommand = New-Object -TypeName Oracle.DataAccess.Client.OracleCommand
    $OracleCommand.CommandText = $SQLCommand
    $OracleCommand.Connection = $OracleConnection
     
    # Adapter laden
    $OracleDataAdapter = New-Object -TypeName Oracle.DataAccess.Client.OracleDataAdapter
    $OracleDataAdapter.SelectCommand = $OracleCommand
     
    #Dataset anlegen
    $DataSet = New-Object -TypeName System.Data.DataSet
    #Dataset mit dem Ergebniss der SQL Abfrage "füllen"
    $OracleDataAdapter.Fill($DataSet) 
    #Daten ausgeben
    $computers = $DataSet.Tables[0]
    foreach ($computer in $computers)
    {
    	if (Test-Connection -ComputerName $computer -Count 1 -Quiet)
    	{
    		Write-Host "System: $computer is Online"
    	}
    	else
    	{
    		Write-Warning "System: $computer Offline"
    	}
    }
    #Verbindung wieder schließen
    $OracleDataAdapter.Dispose()
    $OracleCommand.Dispose()
    $OracleConnection.Close()

    Wenn ich $computer ohne das if aufrufe in der foreach schleife werden die Systeme angezeigt. Mit der If schleife funktioniert es nicht.

    Für einen Tipp wäre ich sehr dankbar.

    Grüsse


    Mittwoch, 6. Februar 2013 12:51

Antworten

  • Nein, sie sind in der ersten Spalte. :)

    Das bedeutet du musst erst alle Reihen (rows) einlesen und dann von jeder Reihe den Wert "Computername" ausgeben. Ersetzte also den kompletten Teil unter

    #Daten ausgeben

     

    mit:

     

    $allrows = $DataSet.Tables[0].rows
    
    foreach ($row in $allrows) {
    	$computer = $row.COMPUTERNAME
    	if (Test-Connection -ComputerName $computer -Count 1 -Quiet) {
    		Write-Host "System: $computer is Online"
    	}
    	else {
    		Write-Warning "System: $computer Offline"
    	}
    }	
     

    Ich gehe mal davon aus das es in dem Dataset nur diese eine Tabelle (Table) gibt. Sonst wäre Tables[0] falsch und müsste durch den richtigen Wert verändert (1 oder 2 oder..) werden.

    Grüße, Denniver

     



    Blog: http://bytecookie.wordpress.com

    Hilf mit und markiere hilfreiche Beiträge als "Hilfreich" und Beiträge die deine Frage ganz oder teilweise beantwortet haben als "Antwort".

    Donnerstag, 7. Februar 2013 11:31
    Moderator

Alle Antworten

  • Wenn du eine Tabelle abfragst erhältst du ein Array aus den Zeilen (Datarows) der Tabelle zurück. Die Daten die du möchtest stehen erst innerhalb dieser Zeilen. Daher der Fehler.
    Die Lösung hängt davon ab wie die Tabelle aufgebaut ist. Stehen die Computer alle in der ersten Zeile der Tabelle?
    Dann Versuchs mal so:
     

    $computers = $DataSet.Tables[0].rows[0]
     

    Ansonsten mach mal einen Screenshot der Tabelle (schützenswerte Daten vorher verändern).

    Grüße, Denniver


    Blog: http://bytecookie.wordpress.com

    Hilf mit und markiere hilfreiche Beiträge als "Hilfreich" und Beiträge die deine Frage ganz oder teilweise beantwortet haben als "Antwort".

    Mittwoch, 6. Februar 2013 14:31
    Moderator
  • Hallo Denniver

    Hat leider nicht geklappt. Genau sie sind in der ersten Zeile.

    Donnerstag, 7. Februar 2013 07:19
  • Nein, sie sind in der ersten Spalte. :)

    Das bedeutet du musst erst alle Reihen (rows) einlesen und dann von jeder Reihe den Wert "Computername" ausgeben. Ersetzte also den kompletten Teil unter

    #Daten ausgeben

     

    mit:

     

    $allrows = $DataSet.Tables[0].rows
    
    foreach ($row in $allrows) {
    	$computer = $row.COMPUTERNAME
    	if (Test-Connection -ComputerName $computer -Count 1 -Quiet) {
    		Write-Host "System: $computer is Online"
    	}
    	else {
    		Write-Warning "System: $computer Offline"
    	}
    }	
     

    Ich gehe mal davon aus das es in dem Dataset nur diese eine Tabelle (Table) gibt. Sonst wäre Tables[0] falsch und müsste durch den richtigen Wert verändert (1 oder 2 oder..) werden.

    Grüße, Denniver

     



    Blog: http://bytecookie.wordpress.com

    Hilf mit und markiere hilfreiche Beiträge als "Hilfreich" und Beiträge die deine Frage ganz oder teilweise beantwortet haben als "Antwort".

    Donnerstag, 7. Februar 2013 11:31
    Moderator
  • Ja sorry Spalte :-).

    Das wars. Es funktioniert. Danke dir viel mal.

    Grüsse

    Donnerstag, 7. Februar 2013 14:58