我想通过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()
我犯错误的任何想法。
此致
丹麦
答案 0 :(得分:1)
问题是由Powershell处理单'
和双"
引号引起的。根据{{3}},
将字符串括在双引号中时(双引号 字符串),以美元符号($)开头的变量名称 在将字符串传递给之前用变量的值替换 处理命令。
当您将字符串括在单引号中时(单引号 字符串),字符串完全按照您键入的方式传递给命令。 没有替换。
因此,这句话
"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
答案 1 :(得分:0)
您的输入文件是excel电子表格吗?如果是这样,你不应该使用import-csv阅读它。有两种解决方法:
在Excel中,将文件另存为csv文件(文件扩展名为.csv),而不是电子表格。
MS Access可以直接从XLS电子表格加载数据。我知道如何在Access中以交互方式进行此操作,但我不知道如何让powershell设置Access的命令来执行它。也许另一个响应者可以填写这篇文章。
另外,请注意,关于单引号和双引号的其他响应也是解决方案的一部分。