You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

已有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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 01:45:41