Jump to content

Probleme mit dem Datum in DataTable Objekt


Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Empfohlene Beiträge

Ich habe eine DateTable aus einer SQL Abfrage erstellt. in dieser sind diverse Namen und Adresse von Kursteilnehmern enthalten. Zusätzlich ist das Datum vom Kursstart in DateTime enthalten. Ich möchte die DateTable jetzt Filtern, so das nur noch Einträge mit einem grösser oder gleichem Datum wie heute ersichtlich sind.

$OpenTable2= $OpenTable| Where-Object{$_.EventStart -ge[datetime]::today}

 

Ich bekomme jedoch immer die Fehlermeldung:

InvalidOperation: Cannot compare “” because it is not IComparable.

 

Aus meiner Sicht müssten beide Werte als DateTime und nicht als String vorliegen. Wenn ich mit *getType() nachschaue, zeigt es mir auch DateTime an. Mit andern Tebllen hatte ich dieses Problem nicht. Liegt es eventuelle am Objekt DataTable? Hat jemand noch eine Idee?

Link zu diesem Kommentar

Mit dem $_.EventStart verweise ich auf auf das Startdatum des Kurses in der Variable $OpenTable. Wenn ich $OpenTable.EventStart eingebe bekomme ich ja alle Daten aus der Tabelle. Ich weiss nicht ob ich die Funktion $_. richtig begriffen habe. 

 

Hier ein Ausschnitt aus meiner Tabelle die ich von einer SQL Datenbank beziehe. EventStart und EventEnd sind als DataTime und nicht als String gespeichert:

image.thumb.png.f7a5c12d7574830732475f993c814d88.png

Link zu diesem Kommentar
vor einer Stunde schrieb Dukel:

Evtl. fehlt nur ein leerzeichen nach "-ge".

Ich glaub, das ist nur ein Fehler vom Hier-Her-Kopieren. 

 

vor 3 Stunden schrieb grbennemsi:

Mit dem $_.EventStart verweise ich auf auf das Startdatum des Kurses in der Variable $OpenTable.

 

Die Fehlermeldung lässt ja leider Raum für Interpretation. Vielleicht ist auch das "[datetime]::today" die Ursache. Versuch doch stattdessen mal "$((Get-Date).Date)". Wenn das auch nix bringt ... vielleicht baust Du Deinen Code ein bissl um, um das Error-Handling zu erleichtern. Statt des "Where-Object" eine Schleife benutzen und die jeweiligen Variablen-Inhalte und -Typen ausgeben. ;-) 

 

vor 15 Stunden schrieb grbennemsi:

Aus meiner Sicht müssten beide Werte als DateTime und nicht als String vorliegen. Wenn ich mit *getType() nachschaue, zeigt es mir auch DateTime an. Mit andern Tebllen hatte ich dieses Problem nicht. Liegt es eventuelle am Objekt DataTable? Hat jemand noch eine Idee?

 

Vielleicht zeigst Du uns etwas mehr von Deinem Code ... 'ist manchmal leichter, wenn man ein bissl Kontext hat. ;-) 

bearbeitet von BOfH_666
Link zu diesem Kommentar

Ich habe folgendes herausgefunden:

Bei der DataTable wird immer Rows für zeile nach dem ersten Punkt hinzugefügt. Wenn ich den Code wie folgt eingebe:

$OpenTable2 = $OpenTable | Where-Object {$_.Rows.EventStart -ge [datetime]::today}

Dann wird die Fehlermeldung nicht mehr ausgegeben.

 

Leider funktioniert die Filterung immer noch nicht richtig. Die Operatoren -le und -lt funktionieren. Bei den andern Operatoren bleibt die Variable $OpenTable2 leer.

 

Hier noch mein ganzer Script:

# Function SQL-Querry
. .\Perform-SQL.ps1

# Path to SQL Query
$SQLPath = '.\QueryTest.sql'

# SQL Query
$Query = Get-Content $SQLPath

# Path to Data
$DataPath = '.\data'

# Read SQL Table in SeMI
$OpenTable = Perform-SQL -sqlHost SVXXXXXXXX -DB seXXXXXX -SqlQuery $Query

# Load all entries that start after today's date.
$OpenTable2 = $OpenTable | Where-Object {$_.Rows.EventStart -ge [datetime]::today}

 

Ich filtere bewusst nicht schon im SQL Query, da diese Datenbank sehr speziell aufgebaut ist und mir die Zeit fehlt mich reinzudenken.

 

 

bearbeitet von grbennemsi
Link zu diesem Kommentar
vor 7 Minuten schrieb grbennemsi:

Die Operatoren -le und -lt funktionieren. Bei den andern Operatoren bleibt die Variable $OpenTable2 leer.

 

Das hört sich ziemlich unwahrscheinlich an. :hmmm: Besteht die Möglichkeit, dass die Operatoren doch richtig funktionieren? ... also, dass es einfach keine Einträge gibt, die aktuell genug sind?  ;-) 

Link zu diesem Kommentar
vor 15 Minuten schrieb grbennemsi:

Dies sollte ja das Datum vor einem Jahr in die Variable $GetDate laden. leider ohne Erfolg. In der Tabelle habe ich Daten bis ins Jahr 2023:

 

Dann zitiere ich mich mal selbst ...

 

vor 3 Stunden schrieb BOfH_666:

Wenn das auch nix bringt ... vielleicht baust Du Deinen Code ein bissl um, um das Error-Handling zu erleichtern. Statt des "Where-Object" eine Schleife benutzen und die jeweiligen Variablen-Inhalte und -Typen ausgeben. ;-)

 

Link zu diesem Kommentar

Die Datatable wird als DataTable (System.ComponentModel.MarshalByValueComponent) Objekt in Powershell geladen.

PS D:\OneDrive\10 Programmieren\Powershell\Ad User aus SeMI> $OpenTable.GetType()

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     DataTable                                System.ComponentModel.MarshalByValueComponent

 

Ich kann sie jedoch mit Select-Object in ein Array umwandeln. Dazu muss ich nur die gewünschten Spalten aussuchen.

$OpenTable = $OpenTable | Select-Object FirstName, LastName, Firma, Mitarbeiter, ...

 

Jetzt wird es als System.Array angegeben.

PS D:\OneDrive\10 Programmieren\Powershell\Ad User aus SeMI> $OpenTable.GetType()

IsPublic IsSerial Name                                     BaseType    
-------- -------- ----                                     --------    
True     True     Object[]                                 System.Array

 

Für den Zugriff auf die SQL Daten benutze ich folgende Funktion:

# Function for the SQL query
function Perform-SQL {
    Param(
        [string]$sqlHost,
        [string]$DB,
        [string]$SqlQuery,
        [string]$User,
        [string]$Password
    )
    if (($User) -and ($Password)) {
        $connectionParam = "Data Source=$sqlHost;User ID=$User;Password=$Password;Initial Catalog=$DB"
    } else { 
        $connectionParam = "Data Source=$sqlHost;Integrated Security=SSPI;Initial Catalog=$DB"
     }
    $sqlconnection = new-object system.data.SqlClient.SQLConnection($connectionParam)
    $command = new-object system.data.sqlclient.sqlcommand($sqlQuery,$sqlconnection)
    $sqlconnection.Open()
    $sqlDataAdapter = New-Object System.Data.sqlclient.sqlDataAdapter $command
    $dataset = New-Object System.Data.DataSet
    $sqlDataAdapter.Fill($dataSet) | Out-Null
    $sqlconnection.Close()
    $dataSet.Tables
}

 

 

Diese erstellt ein DataTable (System.ComponentModel.MarshalByValueComponent) Objekt. Eventuell sollte ich hier die Funktion ändern.

Link zu diesem Kommentar
Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Schreibe einen Kommentar

Du kannst jetzt antworten und Dich später registrieren. Falls Du bereits ein Mitglied bist, logge Dich jetzt ein.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor-Fenster leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

×
×
  • Neu erstellen...