テクセル

PowerShellでmdb,accdbファイル操作(ADO)


PowerShellのスクリプトからADO経由でMicrosoft Accessのデータベース(mdb,accdbファイル)を操作します。実行環境は、以下です。

下記例は、変数$imdb_accdbが0の場合はmdbとして、1の場合はaccdbとして動作します。プログラムと同じフォルダ内にデータベースファイルが存在しない場合は作成されます。ドライバーは、使用環境にあわせて選択してください。

PowerShellのスクリプトによるmdb,accdbファイル使用例(ADO)


# mdb, aacdbファイル操作例

$imdb_accdb = 1              # 0:mdb 1:accdb
$stblName = "tbl7"           # テーブル名

if ($imdb_accdb -eq 0){
   $sdbfile = "mdbtest.mdb"
}else{
   $sdbfile = "mdbtest.accdb"
}
# ドライバー
# Jet.OLEDB.4.0 32bit, mdbのみ
# $sconnStr = "Provider = Microsoft.Jet.OLEDB.4.0; Data Source = "

 $sconnStr = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source="
# $sconnStr = "Provider=Microsoft.ACE.OLEDB.16.0;Data Source="

$sdbf = Split-Path $MyInvocation.MyCommand.Path -Parent
$sdbf = Join-Path $sdbf $sdbfile
$sconnStr = $sconnStr + $sdbf

$Catalog = New-Object -ComObject "ADOX.Catalog"

if ((Test-Path $sdbf) -eq $false){
   $odb = $Catalog.Create($sconnStr)     # mdb,accdbファイル無しの場合は、作成
   $odb.close()
}

$conn = New-Object -ComObject "ADODB.Connection"
$recs = New-Object -ComObject "ADODB.Recordset"
$conn.Open($sconnStr)
$Catalog.ActiveConnection = $conn

$itblf = -1
$sa = ""
foreach($objTbl in $Catalog.Tables){   # テーブル一覧、テーブル存在チェック
   if ($objTbl.Type -eq "TABLE") {
      if ($objTbl.Name -eq $stblName){
         $itblf = 1
      }
      $sa += $objTbl.Name + ","
   }
}
write-output ("テーブル一覧:" + $sa)

if ($itblf -eq -1){           # テーブル新規作成
   $sSQL = "CREATE TABLE " + $stblName + " (" +
          "id int PRIMARY KEY," +
          "tda datetime," +
          "cnote char(20))"
   $ir = $conn.Execute($sSQL)
}

$sSQL = "SELECT count(*) FROM " + $stblName
$ir = $recs.Open($sSQL, $conn)         # レコード数
$ik = $recs.Fields[0].value
$recs.Close()
#Write-Output $ik

$id = 0
if ($ik -gt 0){
   $sSQL = "SELECT max(id) FROM " + $stblName
   $recs.Open($sSQL, $conn)
   $id = $recs.Fields[0].value
   $recs.Close()
}
#write-output $id
$id += 1
$sdt = $(Get-Date).ToString("yyyy/MM/dd HH:mm:ss")
$sSQL = "INSERT INTO " + $stblName + "(id, tda, cnote) VALUES (" +
       [string]$id + ",'" + $sdt + "'," +
       "'日本ニホン123abc①Ⅱ')"
$ir = $conn.Execute($sSQL)

$sSQL = "SELECT TOP 5 * FROM " + $stblName + " ORDER BY id DESC"
$ir = $recs.Open($sSQL, $conn)
write-output "項目名、型"
$ifk = $recs.Fields.Count                #項目数
#write-output "項目数:" + $ifk
$sa = ""
for($iy = 0; $iy -lt $ifk; $iy++){
   $sa += $recs.Fields[$iy].Name + ":" + [string]$recs.Fields[$iy].Type + ","
}
write-output $sa

write-output "レコード内容"
while($recs.EOF -eq $false){
   $sa = [string]$recs.Fields[0].value + "," +
         [string]$recs.Fields[1].value + "," +
         $recs.Fields[2].value
   write-output $sa
   $ir = $recs.Movenext()
}

$recs.close()
$conn.close()
   

□ UPDATE

UPDATEの例を以下に示します。項目「cnote」の内容を変更します。「$recs.Open($sSQL, $conn, $adOpenStatic, $adLockOptimistic)」の第3引数には、レコードセットのカーソルタイプを指定します。 第4引数には、レコードセットのロックタイプを指定します。


$adOpenStatic = 3
$adLockOptimistic = 3
$sSQL = "SELECT * FROM " + $stblName + " WHERE id = " + [string]$id
$ir = $recs.Open($sSQL, $conn, $adOpenStatic, $adLockOptimistic)
$ir = $recs.Update("cnote", "千葉県234dfg")     # or $ir = $recs.Update(2, "千葉県dfg456")

# または
$sSQL = "UPDATE " + $stblName + " SET cnote = '千葉県xyz567' WHERE id = " + [string]$id
$ir = $conn.Execute($sSQL)
   

□ DELETE

DELETEの例を以下に示します。


$adOpenStatic = 3
$adLockOptimistic = 3
$sSQL = "SELECT * FROM " + $stblName + " WHERE id = " + [string]($id - 2)
$ir = $recs.Open($sSQL, $conn, $adOpenStatic, $adLockOptimistic)
$ir = $recs.Delete()

# または
$sSQL = "DELETE FROM " + $stblName + " WHERE id = " + [string]($id - 2)
$ir = $conn.Execute($sSQL)
   

□ テーブル削除

テーブル削除の例を以下に示します。テーブル「tbl5」を削除します。


$sSQL = "DROP TABLE tbl5"
$ir = $conn.Execute($sSQL)   
   
Microsoft Access データベース エンジン 2010 再頒布可能コンポーネント
PowerShellメモ
©2018-2020 TEXCELL CORPORATION
テクセル株式会社