Warum Powershell denke, ich bin versucht, ein Objekt zurückgeben, [] eher dann eine DataTable?
Habe ich Folgendes PS-Funktion:
function GetBuildData {
[System.Data.SqlClient.SqlConnection] $conn = New-Object System.Data.SqlClient.SqlConnection
[System.Data.SqlClient.SqlCommand] $cmd = New-Object System.Data.SqlClient.SqlCommand
[System.Data.SqlClient.SqlDataAdapter] $adapter = New-Object System.Data.SqlClient.SqlDataAdapter
[System.Data.DataTable] $dt = New-Object System.Data.DataTable
try {
[string] $connStr = "myConnectionString"
$conn.ConnectionString = $connStr
$cmd.Connection = $conn
$cmd.CommandText = "SELECT * FROM TestTable"
$conn.Open
$adapter.SelectCommand = $cmd
$adapter.Fill($dt)
$conn.Close
}
catch [system.exception]
{
Write-Host $_
}
finally {
$adapter.Dispose
$cmd.Dispose
$conn.Dispose
}
return $dt
}
Meisten die Funktion wurde aus Gründen der Kürze entfernt. Das problem ist, wenn ich rufen Sie die Funktion etwa so:
[System.Data.DataTable] $buildData = GetBuildData
Bekomme ich die folgende Fehlermeldung:
Nicht konvertieren kann das "System.Object[]" der Wert vom Typ "System.Object[]"
der Typ "System.Daten.DataTable".
Warum Powershell denken, dass ich wollte ein object [] - array zurückgegeben, wenn es offensichtlich ist, dass die $dt variable ist eine DataTable?
EDIT:
Habe ich doppelt überprüft, und $dt
enthält Daten. Zum Beispiel, die Anzahl der Zeilen.Count ist 1, die erwartet wird.
- welche Zeile wird der Fehler auf? die Fehlermeldung sollte die Linie und die Zahl. Ich gehe davon aus, dass es passiert hier: $adapter.Fill($dt) ??
- Hast du schon versucht die
,
Betreiber wie vorgeschlagen in jpmc26 Antwort? Ich lief in dieses problem, und das war die Lösung. - Hat einer von den Antworten, die Ihr problem lösen? Wenn Nein, könntest du ein paar mehr Infos darüber, warum Sie nicht arbeiten?
- Basierend auf dem feedback in die Kommentare, ich habe markiert Eure Antwort als korrekt. Entschuldigung für das verlassen dieser Frage aufgegeben. Ich war zufällig zu verschieben, auf andere Dinge und nie revisited dieses Problem.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich weiß nicht über die anderen Probleme, die die Leute bringen, aber ich denke, der kann zwei mögliche Gründe, warum man immer wieder einen
Object[]
.Könnte es sein, dass Sie uncaptured Ausgang irgendwo anders in der Funktion. In deinem Fall
Fill
gibt einint
. Versuchen Sie, diese bis zum Ende der Ihre Funktion aufruft:E. g.,
Wenn keine Anweisung gibt einen Wert aus, und du bist nicht der Erfassung ist es, die Ausgabe wird in den Rückgabewert, und da haben Sie mehrere return-Werte an diesem Punkt, PowerShell Stopfen Sie alle in ein array.
Die andere Möglichkeit ist, dass PowerShell konvertiert zurückgegeben Sammlungen aller Art in
Object[]
s. Verwenden Sie die,
Betreiber zur Rückgabe der unmangled Wert:Den
,
erstellt ein array, das nur den Wert, der folgt. So nahe wie kann ich raten, dies bewirkt, dass die PowerShell automatisch entrollen die äußerste array und lassen Sie den Wert allein, da der tatsächliche Rückgabewert ist jetzt ein array enthält nur einen einzigen Wert.Den
return
ist eigentlich optional, da uncaptured-Werte in den Wert zurück.Lief nur in dieser einen mich gestern. Ich kann nicht für das Leben von mir herauszufinden, warum jemand würde denken, geräuschlos konvertieren zu
Object[]
nützlich ist.Object[]
nützlich ist." Vielleicht hat Microsoft ein kickback-Angebot mit einer Mauer-Reparatur-Auftragnehmer?return , $dt
funktioniert auch, wenn Sie wollen, um zurückzukehren $dt unkonvertierten und beenden Sie die Funktion mit der rechten gibt.return , $dt
syntax. Später fand ich heraus, dass das, was die,
operator ist, wenn so wie hier verwendet, wird das argument in das array. Ich denke, was passiert ist, dass die PowerShell sieht, dass wir ein array von einem element automatisch und packt es. Dies funktioniert, da mit PowerShell legen Sie Wert umgeht die automatische Konvertierung von Kollektion zuObject[]
. Angesichts der Tatsache, dass die Rückkehr-Mechanismus funktioniert einfach in der üblichen Weise: jeder uncaptured Wert zurückgegeben wird. Das ist, warum es funktioniert mit oder ohnereturn
.Haben Sie ein paar Fragen in was du gepostet hast. Da Sie explizit erstellen Sie ein DataTable-Objekt mit
New-Object System.Data.DataTable
, es gibt keinen Grund, auch zwingen es zu der DataTable Typ mit[System.Data.DataTable]
. Das gleiche gilt für, wenn Sie die Funktion aufrufen. Sind Sie wieder ein DataTable-Objekt, also das ist, was Sie zurück erhalten. Auch wenn Sie nicht wollen, geben Sie die variable Art, es sollte ein Raum zwischen den Typ-identifier und den Namen der variable. Egal, diese Fragen würden nicht dazu führen, das Verhalten, das Sie sehen. Ich lief diesen code:Und es hat Prima funktioniert. Ich vermute, dass das bit, das dazu führt, dass Ihr problem wahrscheinlich in das bit, das Sie ausgeschlossen für die Kürze. Abkürzungen sind selten und Sie kommen selten so präzise Antworten aus partiellen Daten.
DataTable
und ist immer eineObject[]
), es ist nichts falsch mit der Typ-Deklaration. Es dient als ein scheitern früh/schnell-check, der wahrscheinlich aus diesem problem besser klar, eigentlich.Ein Faktor ist, dass man nicht eigentlich Aufruf der open-und close-Methoden, sondern verweisen Sie stattdessen zu. PowerShell ist die Ausgabe eine Referenz auf diese Methoden sowie der datatable (die ich mir vorstellen ist nicht wirklich aufgefüllt, die aufgrund der Tatsache, dass die Verbindung nicht zu öffnen).
Müssen Sie die Klammern auf die open/close-Methoden wie diese:
Müssen Sie auch davor hüten, die Methoden, die Werte zurückgeben (.Add () - Methoden sind berüchtigt für diese), dass Sie nicht verbrauchen entweder durch Zuweisung an eine variable oder Rohrleitungen, out-null.
Müssen Sie nur leere alle Ihre dot-Befehle, die nicht den Variablen zugeordnet
Als für Ihre Frage Warum? ... Lesen Sie Keith Hill ' s Blog: wie funktioniert die Rückgabe der Arbeit powershell-Funktionen