【问题标题】:Is it possible to update a row in MS Access from PowerShell?是否可以从 PowerShell 更新 MS Access 中的一行?
【发布时间】:2017-04-10 03:49:28
【问题描述】:

我有以下 PowerShell 代码,它将一行新数据添加到 MS Access 数据库中(基于用户输入)并且运行良好。

if ($NewAccounts ="Y") {
  $cursor = 3
  $lock = 3

  $Ado = New-Object -ComObject ADODB.Connection 
  $recordset = New-Object -ComObject ADODB.Recordset

  $Ado.Open("Provider = Microsoft.ACE.OLEDB.12.0;Data Source=$Source")

  $query = "Select * from [Sheet1]"

  $recordset.Open($query, $ado, $cursor, $lock)

  $recordset.AddNew() 

  $recordset.Fields.Item("Account") = $AccName
  $recordset.Fields.Item("Serial") = $CGBSerial
  $recordset.Fields.Item("SAExpiry") = $SAEDate.ToString("dd/MM/yyyy")
  $recordset.Fields.Item("SAValidatedPerson") = $SAPerson
  $recordset.Fields.Item("DataCollection") = $DCRun
  $recordset.Fields.Item("DataCollectionDate") = $DCRunDate
  $recordset.Fields.Item("DataCollectionPerson") = $DCPerson
  $recordset.Fields.Item("Version") = $Version
  $recordset.Fields.Item("VersionDateValidated") = Get-Date -Format d
  $recordset.Fields.Item("VersionValidatedPerson") = $logontrim

  $recordset.Update()

  $recordset.Close() 
  $ado.Close()
}

但是,我似乎无法更新数据库中已经存在的行。是否可以更新一行,而不是创建一个全新的行?

【问题讨论】:

  • “我不能”是一个非常模糊的描述。您收到错误消息吗?如果是这样,请发布它们
  • 我应该明确指出我根本无法计算出语法——更多的是要理解命令的整体性。

标签: powershell ms-access


【解决方案1】:

$recordset.AddNew() 将新的空记录附加到记录集。要更新现有记录,您需要先导航到要修改的记录,然后更改该记录的值。

$recordset.Open($query, $ado, $cursor, $lock)

while ($recordset.Fields.Item('Account').Value -ne $AccName) {
  $recordset.MoveNext()
}

$recordset.Fields.Item('Serial') = $CGBSerial
...

$recordset.Update()
$recordset.Close()

但是,您不能将MoveNext() 与静态游标一起使用,因此您需要将cursor type 更改为adOpenForwardOnly ($cursor = 0)。

您也可以使用prepared statement:

$cn = New-Object -ComObject 'ADODB.Connection'
$cn.ConnectionString = "..."
$cn.Open()

$cmd = New-Object -ComObject 'ADODB.Command'
$cmd.CommandText = 'UPDATE [Sheet1] SET Serial=?, SAExpiry=?, ... WHERE Account=?'
$cmd.Parameters.Append($cmd.CreateParameter('@p1', 200, 1, 50, $CGBSerial))
$cmd.Parameters.Append($cmd.CreateParameter('@p2', 7, 1, $null, $SAEDate))
...

$cmd.Execute()

$cn.Close()

【讨论】:

  • 这绝对是完美的——我将您的第一个示例与 $recordset.Open 一起使用...感谢您的快速响应。是否有使用相同方法删除记录的简单方法?
  • @PowershellPauper 请检查documentation$recordset.Delete(1) 可能有效,但我还没有测试过。
猜你喜欢
  • 1970-01-01
  • 2010-11-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多