首页 > 解决方案 > 尝试将 csv 文件中的数据插入 accdb 表时出现问题

问题描述

我有一个包含大量信息的 access 数据库,我对 access 数据库不是很好,而且在 powershell 方面我仍然是新手。我一直在尝试将 csv 文件中的数据自动插入到 access 数据库中,因为它们每周都会完成。

经过研究,我发现了一个允许将 CSV 插入数据库的 powershell 代码,但是我无法使其与我当前的访问数据库和 CSV 文件一起使用。

   write-host "current path is $PSSCriptRoot"
$datafile="$PSScriptRoot\Input.csv" #trying to import this file into the databse
$dbfile="$PSScriptRoot\database.accdb" #this is the test access database
$connectionString="Provider=Microsoft.Ace.OLEDB.12.0; Data Source=$dbfile" #general info I found researc
$conn = New-Object System.Data.OleDb.OleDbConnection($connectionString)
$conn.Open()
$cmd = $Conn.CreateCommand()
Import-Csv $dataFile | 
         ForEach{
             $cmd.CommandText = "INSERT into [MyTable1]([Name],[First Data Set],[Description],[Enabled],[Last Date,Creation Date],[Modification Date],[Day of The year],[ID type],[ID Date],[Street Address],[date],[type])
        VALUES('{0}', '{1}', '{2}', '{3}', '{4}', '{5}', '{6}', '{7}', '{8}', '{9}', '{10}', '{11}', '{12}')" -f @(

        $_.Name,
        $_.'First Data Set',
        $_.Description,
        $_.Enabled, 
        if ($_.'Last Logon Date') { ([datetime]$_.'Last Logon Date').ToString('M/d/yyyy H:mm') } else {[System.DBNull]::Value }
        if ($_.'Creation Date') { ([datetime]$_.'Creation Date').ToString('M/d/yyyy H:mm') } else { [System.DBNull]::Value}
        if ($_.'Modification Date') { ([datetime]$_.'Modification Date').ToString('M/d/yyyy H:mm') } else { [System.DBNull]::Value}
        $_.'Day of The year',
        $_.'ID type',
        if ($_.'ID Date') { ([datetime]$_.'Modification Date').ToString('M/d/yyyy H:mm') } else { [System.DBNull]::Value },
        $_.'Street Address',
        if ($_.date) { ([datetime]$_.date).ToString('M/d/yyyy H:mm') } else { [System.DBNull]::Value}
        $_.Type
        )
        $cmd.ExecuteNonQuery()
 }
$conn.Close()

访问数据库具有相应的表和来自 csv 的相应行,所以应该发生的是来自 csv 的数据将被插入到表中。

使用 $PSScriptRoot 命令识别输入和数据库文件,因为它们指向同一文件夹中的脚本路径。

我得到的错误如下:“使用“0”参数调用“ExecuteNonQuery”的异常:“INSERT INTO 语句中的语法错误。”在 C:\1 - 数据库路径\Database1\database.accdb“

是的,这是当前的测试路径,它有空格和几个特殊字符,这是无法更改的,因为其他脚本可以正常工作,这也应该可以正常工作。

由于我对 accdb 知之甚少,我很难找到错误的原因,因为它所说的似乎我的插入命令语法不正确,但我找不到用于该命令的另一种语法的示例. 我使用 -f 因为行包含空格,并且 powershell 上的引号存在问题。我根本无法更改路径名或行名。

编辑:现在我有另一个问题,日期时间的列不能接受空值,我尝试通过设置 DBNull 值来解决它,但这不起作用。我需要在我的数据库中查看这些空值以进行统计,有没有办法导入这些空值?

我必须将每个值格式化为数据类型,因为 powershell 将它们传递给字符串,.

标签: databasepowershellcsvms-access

解决方案


推荐阅读