himorogiの日記

主にプログラミングに関することなど。少々ハード(電子工作)についても。

PowerShell から .NetFramework 版 SQLite を使う

まず、.NetFramework 版 SQLite である System.Data.SQLite を入手する。

うちの会社では原則として管理者権限禁止(その都度要申請)なので installer 版ではなく binary 版を落としてくる。
Windows7 なので PowerShell V2.0 及び .NetFrameworks 3.5 環境対応のものが必要。

Precompiled Binaries for 32-bit Windows (.NET Framework 3.5)
http://system.data.sqlite.org/downloads/1.0.94.0/sqlite-netFx35-binary-bundle-Win32-2010-1.0.94.0.zip

なお、PowerShell からは以下のファイルを参照するようなので、SQLite データベースファイルと一緒に必要不可欠なファイルのみ管理するときは、これらファイルだけを解凍した内容から抜き出せばいい。

SQLite.Interop.dll
System.Data.SQLite.dll
System.Data.SQLite.xml

ただしダウンロードして解凍した直後は「ファイルのプロパティ」にてブロックされているためブロック解除する必要がある。
それぞれの[ファイルのプロパティ]>[全般]タブ>[セキュリティ]>[ブロックの解除]ボタンをクリックする。

とにかく PowerShell からの参照でエラーメッセージが出たら、該当するファイルが期待される場所に保存されているか確認し、かつファイルがブロックされていないか確認してみること。

というわけで、とりあえずのサンプルコード。

PoswerShell.ISE からの実行で cmd.exe を経由しないので当然のことながら文字化けはない。
System.Data.SQLite 関連の上記3ファイルと、下に記す script file を同じフォルダに格納して実行する実行すると、そのフォルダに sample というファイル名の SQLite データベースファイルが生成される。

ここで

Split-Path ( & { $myInvocation.ScriptName } ) -parent

は、実行している script file の path を取得している。
スクリプトファイルの場所:PowerShell log:So-net blog

$ScriptBase = Split-Path ( & { $myInvocation.ScriptName } ) -parent
$dbMOdule = Join-Path $ScriptBase System.Data.SQLite.dll
$dbFile = Join-Path $ScriptBase sample

[void][System.Reflection.Assembly]::LoadFile( $dbModule )

$sqliteH = New-Object System.Data.SQLite.SQLiteConnection
$sqliteH.ConnectionString = "Data Source = $dbFile"
$sqliteH.Open()

$sqlcmd = New-Object System.Data.SQLite.SQLiteCommand
$sqlcmd.Connection = $sqliteH


$sqlcmd.CommandText = "CREATE TABLE list ( id, title )"
$q = $sqlcmd.ExecuteNonQuery()

$sqlcmd.CommandText = "INSERT INTO list ( id, title ) values( 1, '天上天下唯我独尊' )"
$q = $sqlcmd.ExecuteNonQuery()

$sqlcmd.CommandText = "INSERT INTO list ( id, title ) values( 2, '有朋自遠方来不亦楽乎' )"
$q = $sqlcmd.ExecuteNonQuery()

$sqlcmd.CommandText = "INSERT INTO list ( id, title ) values( 3, '国破山河在城春草木深' )"
$q = $sqlcmd.ExecuteNonQuery()

$sqlcmd.CommandText = "SELECT * FROM list"
$q = $sqlcmd.ExecuteReader()
while( $q.Read() ){
    write ( "{0}`t{1}" -f $q[0], $q[1] )
}

$sqliteH.Close()

実行結果

PS C:\Users\hoge\Desktop\dbtoolWithSQLite3> C:\Users\hoge\Desktop\dbtoolWithSQLite3\sampleSQLiteViaDotNet.ps1
1	天上天下唯我独尊
2	有朋自遠方来不亦楽乎
3	国破山河在城春草木深