16:53

データベースの既存データを変更して、新しいデータとして追加するPower Shell スクリプトを書いたので、晒しておく。(DBMSSQLite)

基本的な流れは次の通り。

  1. 既存のデータから使用したいデータをテンポラリーテーブルにコピーする。
  2. テンポラリーテーブルのデータの一部を変更する
  3. 元のテーブルに更新データを変更する
# SQLite.dllをロードする(SQLite.Interop.dllも必要)
$ScriptBase = Split-Path ( & { $myInvocation.ScriptName } ) -parent
$dbMOdule = Join-Path $ScriptBase System.Data.SQLite.dll
[void][System.Reflection.Assembly]::LoadFile( $dbModule )

# DBに接続
$sqliteCon = New-Object System.Data.SQLite.SQLiteConnection
$sqliteCon.ConnectionString = "Data Source = sample.db"
$sqliteCon.Open()

# テンポラリーテーブルがあれば削除する
$sqlcmd = New-Object System.Data.SQLite.SQLiteCommand($sqliteCon)
$sqlcmd.CommandText = "DROP TABLE IF EXISTS temp_table;"
$sqlcmd.ExecuteNonQuery()

# 既存テーブルのデータを使ってテンポラリーテーブルを作成する
$sqlcmd.CommandText = "CREATE TABLE temp_table AS SELECT * FROM table WHERE date = '2017-11-14';"
$sqlcmd.ExecuteNonQuery();

# データの更新
$sqlcmd.CommandText = "UPDATE temp_table SET date='今日の日付'"
$sqlcmd.ExecuteNonQuery()

# データを元のテーブルに追加する
$sqlcmd.CommandText = "INSERT INTO table SELECT * FROM temp_table"
$sqlcmd.ExecuteNonQuery()

# テンポラリテーブルの作徐
$sqlcmd.CommandText = "DROP TABLE temp_table"
$sqlcmd.ExecuteNonQuery()

# DBとの接続解除
$sqliteCon.Close()

参考にさせていただいたページ

PowerShell から .NetFramework 版 SQLite を使う - himorogiの日記

14:57

SQLiteCommand.ExecuteNonQuery()でSELECT文を実行して、その戻り値が0であることに悩んでいたが、SELECT文ではデータの変更がないので0が変えるのが正しいそうだ。うへぇ、はまった。

stackoverflow.com