2017-04-09 7 views
-1

次のPowerShellコードは、(ユーザー入力に基づいて)MS Accessデータベースに新しい行のデータを追加し、完全に機能します。MS Accessの行をPowerShellから更新することはできますか?

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() 
} 

しかし、私は、すでに存在するデータベースの行を更新するように見えることができません。全く新しい行を作成するのではなく、行を更新することは可能ですか?

+0

非常にあいまいな説明である「私はように見えることはできません」。エラーメッセージが表示されますか?もしそうなら投稿してください –

+0

私は文法をまったく理解できないと指定しておきました。 – PowershellPauper

答えて

3

$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 typeadOpenForwardOnly$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() 
+0

これは完全に機能します。私は$ recordset.Openで最初の例を使用しました... このような迅速な対応をありがとうございます。同じ方法でレコードを削除する簡単な方法がありますか? – PowershellPauper

+0

@PowershellPauper [documentation](https://docs.microsoft.com/en-us/sql/ado/reference/ado-api/recordset-object-properties-methods-and-events)を確認してください。 '$ recordset.Delete(1)'は動作するかもしれませんが、私はそれをテストしていません。 –

関連する問題