2015-05-22 127 views
0

我想通過powershell將csv數據插入到訪問數據庫。我使用下面的代碼來插入數據。它成功執行,但問題是它在數據庫中插入空行。林不知道我在哪裏犯錯。任何想法?PowerShell導入csv到數據庫

$datafile='my_file.xls' 
$dbfile='C:\CSVtoAccess\TestDatabase.accdb' 
$connectionString="Provider=Microsoft.Ace.OLEDB.12.0; Data Source=$dbfile" 
$conn = New-Object System.Data.OleDb.OleDbConnection($connectionString) 
$conn.Open() 
$cmd = $Conn.CreateCommand() 
Import-Csv $dataFile | 
    ForEach{ 
     $cmd.CommandText = "INSERT INTO CSVDATA2(F1,F2,F3,F4,F5,F6,F7,F8,F9,F10,F11,F12,F13,F14,F15,F16,F17,F18,F19,F20,F21,F22,F23,F24,F25,F26) VALUES ('$($_.col1)', '$($_.col2)', '$($_.col3)', '$($_.col4)', '$($_.col5)', '$($_.col6)', '$($_.col7)', '$($_.col8)', '$($_.col9)', '$($_.col10)', '$($_.col11)', '$($_.col12)', '$($_.col13)', '$($_.col14)', '$($_.col15)', '$($_.col16)', '$($_.col17)', '$($_.col18)', '$($_.col19)', '$($_.col20)', '$($_.col21)', '$($_.col22)', '$($_.col23)', '$($_.col24)', '$($_.col25)', '$($_.col26)')" 
     $cmd.ExecuteNonQuery() 
    } 
$conn.Close() 

任何想法,我犯了錯誤。

問候,

丹麥

回答

1

問題是由PowerShell的處理單'和雙引號"造成的。由於每documentation

當你用雙引號的字符串(雙引號 字符串),由一個美元符號($)是 與之前的變量的值代替前面的變量名字符串被傳遞給 命令進行處理。

當您用單引號(單引號 字符串)括起一個字符串時,該字符串將完全按照您輸入的順序傳遞給該命令。 不執行替換。

因此,這種說法

"INSERT INTO CSVDATA2(F1,F2,F3...) VALUES ('$($_.col1)', '$($_.col2)', '$($_.col3)'...)" 

不會擴大任何$($_.coln)成一個值。

使用Powershells -f字符串格式化,像這樣

$cmd.CommandText = "insert into foo(bar, zof) values ('{0}', '{1}')" -f $_.col1, $_.col2 
+0

嗨,謝謝你的回覆。現在,當我重寫格式化字符串的sql.Error時,出現以下錯誤:索引(基於零)必須大於或等於零並小於 參數列表的大小。 –

+0

格式化字符串時出錯:索引基於零)必須大於或等於零並小於參數列表的大小。不知道我在哪裏犯錯 –

+0

謝謝。我有我缺少的東西。但仍然沒有獲得價值。有一個空值到SQL。 $ _。col不起作用。我不知道爲什麼。 –

0

是您的輸入文件的Excel電子表格?如果是這樣,你不應該用import-csv來閱讀它。有兩種解決方法:

  1. 在Excel中,將文件保存爲CSV文件(文件擴展名.csv),而不是作爲一個電子表格。

  2. MS Access可以直接從XLS電子表格加載數據。我知道如何在Access中以交互方式進行交互,但我不知道如何讓PowerShell爲Access執行命令。也許另一個響應者可以填寫這篇文章。

另外請注意,另一個關於單引號和雙引號的回答也是解決方案的一部分。

+0

文件是csv我特意將.xls擴展名。 –

+0

以標準方式使用標準擴展是個好主意。如果它是一個cvs文件,最好給它一個.csv擴展名。但是,這不會影響您現在遇到的問題。 –