PowerShell から ODBC 経由で MariaDB を操作します。実行環境及び ODBCデータソースの設定は以下となります。
MariaDB Connector/ODBC のインストール、設定
ストレージエンジンは、Aria を使用しています。
# mariaODBC.ps1
# mariaDB ODBC接続
Set-StrictMode -Version latest
# ODBC データソースで接続する場合
$sCconStr = "DSN=mariadb;uid=root;pwd=root;"
# 接続文字列で接続する場合
# $sCconStr = "Driver={MariaDB ODBC 3.1 Driver};Database=test;USER=root;PASSWORD=root;"
$odbcCon = New-Object System.Data.Odbc.OdbcConnection($sCconStr)
try{
$odbcCon.open()
}
catch{
Write-Host "接続失敗"
exit
}
$odbcCmd = New-Object System.Data.Odbc.OdbcCommand
$odbcCmd.Connection = $odbcCon
$odbcCmd.CommandText = "CREATE TABLE IF NOT EXISTS tbl0 (" + # テーブル作成
"id int," +
"tda datetime," +
"cnote char(20)," +
"PRIMARY KEY (id)," +
"KEY key1 (tda))" +
"DEFAULT CHARACTER SET utf8," +
"ENGINE=Aria PAGE_CHECKSUM=1 TRANSACTIONAL=1"
$rtn = $odbcCmd.ExecuteNonQuery()
$odbcCmd.CommandText = "SELECT max(id) FROM tbl0"
$odbcReader = $odbcCmd.ExecuteReader()
$id = 0
if ($odbcReader.Read() -eq $true){
if ($odbcReader.IsDBNull(0) -ne $true){
$id = $odbcReader.GetInt32(0)
}
}
$id++
#Write-Host $id.ToString()
$odbcReader.Close()
$odbcCmd.CommandText = "INSERT INTO tbl0 VALUES (" + # データ追加
$id.ToString() + ",`'" +
$(Get-Date).ToString("yyyy-MM-dd HH:mm:ss") + "`'," +
"`'日本ニホン123abc`')"
$rtn = $odbcCmd.ExecuteNonQuery()
$odbcCmd.CommandText = "SELECT * FROM tbl0 ORDER BY id DESC LIMIT 5"
$odbcReader = $odbcCmd.ExecuteReader()
$ic = $odbcReader.FieldCount # 列名表示
$sa = "列名:"
for($ia = 0; $ia -lt $ic; $ia++){
$sa += $odbcReader.GetName($ia) + ","
}
Write-Host $sa
while($odbcReader.Read()){ # データ表示
$sa = "" # $odbcReader[0]は、Int32型 $odbcReader[1]は、 DateTime型 $odbcReader[2]は、String型
for($ix = 0; $ix -lt $ic; $ix++){
$sa += $odbcReader[$ix].ToString() + ","
}
Write-Host $sa
}
$odbcReader.Close()
$odbcReader.Dispose()
$odbcCon.Close()
上記プログラム例での接続文字列は、データベースが動作しているパソコン上で接続する場合です。
別のパソコンから接続する場合の接続文字列例は以下となります。 Server(パソコン名または、IPアドレス)、Port(ポート番号)を指定します。
$sCconStr = "Driver={MariaDB ODBC 3.1 Driver};Server=192.168.1.99;Port=3306;Database=test;USER=****;PASSWORD=****;"
UPDATE、INSERT、DELETE ステートメントなどの行を返さないSQLの場合は、ExecuteNonQuery を使用します。
SELECT ステートメントなどの行を返すSQLの場合は、ExecuteReader を使用します。
以下の例における変数 $odbcCon、$odbcCmd については、上記プログラム例を参照して下さい。
UPDATE テーブル名 SET カラム名1=値1, カラム名2=値2, ..... WHERE 条件式
#--- update 例
$odbcCmd.CommandText = "UPDATE tbl0 SET cnote = `'千葉県xyz890`' WHERE id = " + $id.ToString()
$rtn = $odbcCmd.ExecuteNonQuery()
DELETE FROM テーブル名 WHERE 条件式
#--- delete 例
$odbcCmd.CommandText = "DELETE FROM tbl0 WHERE id = 10"
$rtn = $odbcCmd.ExecuteNonQuery()
テーブルを削除します。
DROP TABLE テーブル名
#-- drop table 例
$odbcCmd.CommandText = "DROP TABLE tbl0"
$rtn = $odbcCmd.ExecuteNonQuery()
SQL によりテーブル一覧を取得します。
#--- テーブル一覧
$odbcCmd.CommandText = "SHOW TABLES"
$odbcReader = $odbcCmd.ExecuteReader()
$sa = ""
while($odbcReader.Read()){
$sa += $odbcReader[0].ToString() + ","
}
$odbcReader.Close()
Write-Host $sa
スキーマ情報によりテーブル一覧を取得します。
#--- テーブル一覧
$stbl = "テーブル一覧:"
[System.Data.DataTable]$dt = $odbcCon.GetSchema("Tables")
$ic = $dt.Rows.Count
for($ia = 0; $ia -lt $ic; $ia++){
[System.Data.DataRow]$row = $dt.Rows[$ia]
if ($row["TABLE_CAT"].ToString().Equals("test")){ # テータベースを指定
$stbl += $row["TABLE_NAME"].ToString() + ","
}
}
Write-Host $stbl
全テーブルの内容が取得されますので配列変数 $row の$row[0](TABLE_CAT) にセットされるデータベース名で選択を行います。
$row[0]:TABLE_CAT, $row[1]:TABLE_SCHEM, $row[2]:TABLE_NAME, $row[3]:REMARKS