已有Access数据库创建PowerShell代码,如何插入数据填充字段?
在PowerShell中向Access数据库的MyTest表插入数据
假设你已经有了Create-DataBase和Invoke-ADOCommand函数,以下是添加数据插入逻辑的具体实现,包括将Get-Date生成的日期填入F2字段的方法:
完整示例代码
# 现有创建数据库函数 function Create-DataBase { param( [string]$DbPath ) $adoConn = New-Object -ComObject ADODB.Connection $adoConn.Open("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=$DbPath;Jet OLEDB:Engine Type=5") $adoConn.Close() [System.Runtime.Interopservices.Marshal]::ReleaseComObject($adoConn) | Out-Null } # 现有执行ADO命令函数 function Invoke-ADOCommand { param( [string]$DbPath, [string]$SqlCommand ) $adoConn = New-Object -ComObject ADODB.Connection $adoConn.Open("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=$DbPath") $adoCmd = New-Object -ComObject ADODB.Command $adoCmd.ActiveConnection = $adoConn $adoCmd.CommandText = $SqlCommand $adoCmd.Execute() | Out-Null $adoConn.Close() [System.Runtime.Interopservices.Marshal]::ReleaseComObject($adoCmd) | Out-Null [System.Runtime.Interopservices.Marshal]::ReleaseComObject($adoConn) | Out-Null } # 1. 创建数据库和MyTest表 $dbPath = "C:\Temp\MyTestDB.accdb" Create-DataBase -DbPath $dbPath $createTableSql = @" CREATE TABLE MyTest ( F1 COUNTER PRIMARY KEY, F2 DATETIME, F3 INTEGER, F4 TEXT(50) ) "@ Invoke-ADOCommand -DbPath $dbPath -SqlCommand $createTableSql # 2. 插入数据的两种方式 ### 方法1:直接构造INSERT语句(需注意日期格式) # 获取兼容Access的日期格式,用#包裹日期值 $currentDate = Get-Date -Format "yyyy-MM-dd HH:mm:ss" $insertSql1 = "INSERT INTO MyTest (F2, F3, F4) VALUES (#$currentDate#, 100, '测试记录1')" Invoke-ADOCommand -DbPath $dbPath -SqlCommand $insertSql1 ### 方法2:参数化查询(更安全,避免格式错误和注入) function Invoke-ParameterizedADOCommand { param( [string]$DbPath, [string]$SqlCommand, [hashtable]$Parameters ) $adoConn = New-Object -ComObject ADODB.Connection $adoConn.Open("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=$DbPath") $adoCmd = New-Object -ComObject ADODB.Command $adoCmd.ActiveConnection = $adoConn $adoCmd.CommandText = $SqlCommand # 绑定参数 foreach ($param in $Parameters.Values) { $adoParam = $adoCmd.CreateParameter("", $param.Type, 1, $param.Size, $param.Value) $adoCmd.Parameters.Append($adoParam) } $adoCmd.Execute() | Out-Null $adoConn.Close() [System.Runtime.Interopservices.Marshal]::ReleaseComObject($adoCmd) | Out-Null [System.Runtime.Interopservices.Marshal]::ReleaseComObject($adoConn) | Out-Null } # 使用参数化方式插入数据 $insertSql2 = "INSERT INTO MyTest (F2, F3, F4) VALUES (?, ?, ?)" $params = @( @{ Type = 7; Size = 0; Value = Get-Date }, # 7 = adDate类型 @{ Type = 3; Size = 0; Value = 200 }, # 3 = adInteger类型 @{ Type = 200; Size = 50; Value = "测试记录2" } # 200 = adVarChar类型 ) Invoke-ParameterizedADOCommand -DbPath $dbPath -SqlCommand $insertSql2 -Parameters $params
关键细节说明
- F1字段无需手动插入:因为F1是
Counter(自动编号)类型,Access会自动生成递增的主键值,插入时不需要在SQL语句中指定该字段。 - F2日期字段处理:
- 直接构造语句时,必须用
#包裹日期字符串,推荐使用yyyy-MM-dd HH:mm:ss格式,避免因系统区域设置导致的解析错误。 - 参数化查询更稳妥:直接传递
Get-Date返回的DateTime对象,通过ADODB的adDate类型绑定,无需手动处理格式,同时避免SQL注入风险。
- 直接构造语句时,必须用
- ADODB参数类型对应:常用类型标识:
adDate=7、adInteger=3、adVarChar=200,这些是OLE DB标准数据类型的常量值。
内容的提问来源于stack exchange,提问作者Chris Johnson
相关产品推荐
相关产品推荐

