2016-06-11 120 views
1

我有對象($itemObjectArray)的陣列,每一個具有這些特性和像這樣的一些值:Powershell的插入物到SQL Server數據庫更優雅溶液

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

我有一個SQL Server 2012的表稱爲Items列名稱與對象屬性名稱匹配,如下所示:

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

我創建了以下代碼以將對象插入到SQL Server表中。我認爲我的代碼有點粗俗。有沒有更好的方法來做到這一點,因爲列名與對象屬性名匹配?

$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

這可能會在CodeReview網站上收到更多反饋。 StackOverflow是用於幫助編程問題(我的代碼錯誤,我不確定如何解決它) – user4317867

+0

我會使用類似[this](https://gallery.technet.microsoft.com/scriptcenter/Import-Large-CSVs -INTO-SQL 216223d9)。 –

回答

0

您應該使用prepared statements

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() 
}