ユーザ用ツール

サイト用ツール


powershell:form_sqlite_db_client

文書の過去の版を表示しています。


FormsとSQLiteによる簡易DBクライアント

一つ上へ

Add-Type -AssemblyName System.Windows.Forms
Add-Type -AssemblyName System.Drawing
 
# sqlite3.dll を読み込む
Add-Type -Path ".\System.Data.SQLite.dll"
 
# フォーム作成
$form = New-Object System.Windows.Forms.Form
$form.Text = "Easy DB Client"
$form.Size = New-Object System.Drawing.Size(1000,600)
 
# DBのファイルパス(無ければ新規作成)
$dbFile = ".\test.db"
$connectionString = "Data Source=$dbFile;Version=3;"
 
if (-not (Test-Path $dbFile)) {
    [System.Data.SQLite.SQLiteConnection]::CreateFile($dbFile)
}
 
# SQLite 接続オブジェクトを作成
$conn = New-Object System.Data.SQLite.SQLiteConnection($connectionString)
$conn.Open()
 
# コマンドオブジェクト
$cmd = $conn.CreateCommand()
 
# --- テーブルリスト表示 ---
$cmd.CommandText = "SELECT name FROM sqlite_master WHERE type='table' ORDER BY name;"
 
$labelTable = New-Object System.Windows.Forms.Label
$labelTable.Text = "テーブルリスト"
$labelTable.Location = New-Object System.Drawing.Point(20,20)
$labelTable.Size = New-Object System.Drawing.Size(100,15)
 
$listBoxTable = New-Object System.Windows.Forms.ListBox
$listBoxTable.Size = New-Object System.Drawing.Size(300,200)
$listBoxTable.Location = New-Object System.Drawing.Point(20,40)
 
# 実行
$reader = $cmd.ExecuteReader()
while ($reader.Read()) {
    $tableName = $reader["name"]
    $listBoxTable.Items.Add($tableName)
}
$reader.Close()
 
# レコード表示ボタン
$btnShow = New-Object System.Windows.Forms.Button
$btnShow.Text = "表示"
$btnShow.Location = New-Object System.Drawing.Point(20,500)
 
# 保存ボタン
$btnSave = New-Object System.Windows.Forms.Button
$btnSave.Text = "保存"
$btnSave.Location = New-Object System.Drawing.Point(100,500)
 
# DataGridView
$dataGrid = New-Object System.Windows.Forms.DataGridView
$dataGrid.Location = New-Object System.Drawing.Point(350,50)
$dataGrid.Size = New-Object System.Drawing.Size(600,400)
$dataGrid.AutoSizeColumnsMode = "Fill"
$dataGrid.AllowUserToAddRows = $true
$dataGrid.AllowUserToDeleteRows = $true
$dataGrid.ReadOnly = $false
 
# 変数をフォームスコープで共有
$dataTable = $null
$adapter = $null
$table = $null
 
# レコード表示ボタンイベント
$btnShow.Add_Click({
    if ($listBoxTable.SelectedItem -ne $null) {
        $table = [string]$listBoxTable.SelectedItem
        $cmd.CommandText = "SELECT * FROM [$table];"
 
        $script:adapter = New-Object System.Data.SQLite.SQLiteDataAdapter $cmd
 
        # 自動でINSERT/UPDATE/DELETEコマンドを生成
        $script:builder = New-Object System.Data.SQLite.SQLiteCommandBuilder $adapter
 
        $script:dataTable = New-Object System.Data.DataTable
        [void]$script:adapter.Fill($dataTable)
 
        $dataGrid.DataSource = $dataTable
    }
})
 
# 保存ボタンクリックイベント
$btnSave.Add_Click({
    if ($script:adapter -ne $null -and $script:dataTable -ne $null) {
        try {
            # DataGridView の編集中セルを確定
            if ($dataGrid.IsCurrentCellInEditMode) {$dataGrid.EndEdit() }
            $dataGrid.CurrentCell = $null # フォーカスを外して編集を確定
 
            # DataTableの変更を確認
            $changes = $script:dataTable.GetChanges()
            if ($changes -ne $null) {
                $script:adapter.Update($script:dataTable)
                Write-Host "UpdateCommand:" $adapter.UpdateCommand.CommandText
                Write-Host "InsertCommand:" $adapter.InsertCommand.CommandText
                Write-Host "DeleteCommand:" $adapter.DeleteCommand.CommandText
                [System.Windows.Forms.MessageBox]::Show("変更を保存しました","保存完了")
            } else {
                [System.Windows.Forms.MessageBox]::Show("保存対象の変更がありません","情報")
            }
        }
        catch {
            [System.Windows.Forms.MessageBox]::Show("保存中にエラーが発生しました。`n$_","エラー")
        }
    } else {
        [System.Windows.Forms.MessageBox]::Show("保存できるデータがありません。先に表示ボタンでテーブルを読み込んでください。","情報")
    }
})
 
# コントロール
$form.Controls.Add($labelTable)
$form.Controls.Add($listBoxTable)
$form.Controls.Add($btnShow)
$form.Controls.Add($dataGrid)
$form.Controls.Add($btnSave)
 
# --- フォームを閉じたら DB も閉じる ---
$form.Add_FormClosed({ $conn.Close() })
 
# フォームを表示
[void]$form.ShowDialog()
powershell/form_sqlite_db_client.1758644336.txt.gz · 最終更新: 2025/09/24 01:18 by mikoto