2016-06-11 10 views
1

Ich habe ein Array von Objekten ($itemObjectArray), die jeweils mit diesen Eigenschaften und einige Werte wie so:Powershell das Einfügen eines Objekts in SQL Server-Datenbank elegantere Lösung

ID   : 1234 
Location : USA 
Price  : $500 
Color  : Blue 

ich eine SQL Server 2012-Tabelle genannt haben Items mit Spaltennamen, die die Objekteigenschaftsnamen wie so passen:

TABLE Items (
    ID 
    Location 
    Price 
    Color 
    PRIMARY KEY (ID) 
) 

ich habe den folgenden Code erstellt das Objekt in die SQL Server-Tabelle einzufügen. Ich denke, mein Code ist ein wenig grob. Gibt es eine elegantere Möglichkeit, dies zu tun, da die Spaltennamen den Objekteigenschaftsnamen entsprechen?

$itemObjectArray | %{ #step through array 
    #get property names, which match column names 
    $names = $_ | Get-Member -membertype properties 

    Foreach($name in $names.name){ #make SQL string for column names 
     $cols += $name + "," 
    } 

    $cols = $cols.trimend(",") #get rid of last comma 

    Foreach($name in $names.name){ 
     #step through properties, get values and build values string 
     $vals += "'" + $_.$($name) + "'," 
    } 

    $vals = $vals.trimend(",") #get rid of last comma 

    $sqlCommand.CommandText = "INSERT INTO Items ($cols) VALUES ($vals)" 
    $sqlCommand.ExecuteNonQuery() #insert 

    $cols = $Null #wipe 
    $vals = $Null 
} 
+1

Dies könnte mehr Feedback auf der CodeReview-Website erhalten. StackOverflow ist für die Hilfe bei der Programmierung von Fragen (meine Code-Fehler und ich bin mir nicht sicher, wie es zu beheben) – user4317867

+0

Ich würde etwas wie [this] (https://gallery.technet.microsoft.com/scriptcenter/Import-Large-CSVs -into-SQL-216223d9). –

Antwort

0

Sie sollten prepared statements verwenden.

function InsertObject($object, $table) 
{ 
    # set up key and value placeholder string. 
    $ks = ($object.keys | % { "[$_]" }) -join ", " 
    $vs = ($object.keys | % { "@$_" }) -join ", " 

    # $DatabaseConnection is a global variable 
    $command = $DatabaseConnection.CreateCommand() 
    $command.CommandText = "INSERT INTO $table ($ks) VALUES ($vs);" 

    foreach ($key in $object.Keys) 
    { 
     $value = $object[$key] 
     if ($value -eq $null) { 
      $value = [DBNull]::Value 
     } 

     [void]$command.Parameters.AddWithValue("@$key", $value) 
    } 

    # exec statement and suppress output 
    [void]$command.ExecuteNonQuery() 
}