この記事は
の続きです。
「SQL*PLUSもどきを作る その6(改訂版)」の関数 Exequte-Query ではSQLを実行して、結果をコンソールに表示することが可能です。
今回、この関数をカスタマイズして、Widows FormにSQL実行履歴を表示し、再実行できるようにしたいと思います。
実行イメージは下記の通りです。

SQL実行履歴を表示するための関数を下記のように作成しました。
[void][reflection.assembly]::LoadWithPartialName("System.Windows.Forms")
#===============================================================================
# View-History: SQL実行履歴を表示し選択させる
#
# UPDATE: 2008-06-04 Ver.1.0.0
#
# 使用例
# PS > View-History XMLファイルパス
#
# copyright HIRO's.NET(http://hiros-dot.net/)
#===============================================================================
function global:View-History
{
Param($XmlFile)
#パスが指定されているか?
if ( $XmlFile.Length -eq $null )
{
Write-Host "XMLファイルを指定してください"
return
}
#存在するパスか?
if ( -not $(Test-Path $XmlFile) )
{
Write-Host $XmlFile + "履歴ファイルが存在しません"
return
}
#データセットを作成し、XMLファイルを読み込む
$dtSet = New-Object System.Data.DataSet
[void]$dtSet.ReadXml($XmlFile)
#===== Formの作成 =====
$form = New-Object System.Windows.Forms.Form
$form.Text = "SQL実行履歴"
$form.Width = 500
$form.Height = 500
#===== SplitContainerの作成 =====
$splCont = New-Object System.Windows.Forms.SplitContainer
$splCont.Orientation = [System.Windows.Forms.Orientation]::Horizontal
$splCont.Dock = [System.Windows.Forms.DockStyle]::Fill
$splCont.SplitterDistance = 300
$form.Controls.Add($splCont)
#===== ListViewの作成 =====
$lsvHis = New-Object System.Windows.Forms.ListView
$lsvHis.Dock = [System.Windows.Forms.DockStyle]::Fill
$lsvHis.View = [System.Windows.Forms.View]::Details
$lsvHis.Font = "MS ゴシック, 9pt"
$lsvHis.FullRowSelect = $True
[void]$lsvHis.Columns.Add("Date", 120)
[void]$lsvHis.Columns.Add("SQL", 350)
$splCont.Panel1.Controls.Add($lsvHis)
#データをリストビューに表示
for ( $i = $dtSet.Tables[0].Rows.Count - 1; $i -ge 0; $i-- )
{
$itemx = New-Object System.Windows.Forms.ListViewItem
$itemx.Text = $dtSet.Tables[0].Rows[$i]["UPDT"]
[void]$itemx.SubItems.Add($dtSet.Tables[0].Rows[$i]["SQL"])
[void]$lsvHis.Items.Add($itemx)
}
#===== TextBoxの作成 =====
$txtHis = New-Object System.Windows.Forms.TextBox
$txtHis.Dock = [System.Windows.Forms.DockStyle]::Fill
$txtHis.Multiline = $True
$txtHis.Font = "MS ゴシック, 9pt"
$splCont.Panel2.Controls.Add($txtHis)
#===== Panelの作成 =====
$panel1 = New-Object System.Windows.Forms.Panel
$form.Controls.Add($panel1)
$panel1.Dock = [System.Windows.Forms.DockStyle]::Bottom
$panel1.Height = 30
#===== ListViewイベントの追加 =====
$lsvHis.Add_SelectedIndexChanged({
if ( $lsvHis.SelectedItems.Count -gt 0 )
{
$txtHis.Text = $lsvHis.SelectedItems[0].SubItems[1].Text
}
})
#===== [選択]ボタンの作成 =====
$btnSelect = New-Object System.Windows.Forms.Button
$btnSelect.Location = New-Object System.Drawing.Point(324, 4)
$btnSelect.Text = "選択"
$btnSelect.anchor = [System.Windows.Forms.AnchorStyles]::Top -bor [System.Windows.Forms.AnchorStyles]::Right
$btnSelect.Add_Click({
$form.DialogResult = [System.Windows.Forms.DialogResult]::OK
[void]$form.Close()
})
$panel1.Controls.AddRange($btnSelect)
#===== [閉じる]ボタンの作成 =====
$btnClose = New-Object System.Windows.Forms.Button
$btnClose.Location = New-Object System.Drawing.Point(405, 4)
$btnClose.Text = "閉じる"
$btnClose.anchor = [System.Windows.Forms.AnchorStyles]::Top -bor [System.Windows.Forms.AnchorStyles]::Right
$btnClose.Add_Click({
$form.DialogResult = [System.Windows.Forms.DialogResult]::Cancel
[void]$form.Close()
})
$panel1.Controls.AddRange($btnClose)
#===== Formを表示 =====
if ($form.ShowDialog() -eq [System.Windows.Forms.DialogResult]::OK )
{
return $txtHis.Text.Trim()
}
}
開発ポイント
1) Windows Formの作成
このフォームは、SplitContainerを配置して上下に分割し、上にリストビューを下にテキストボックスを配置しています。そのほかにはパネルを配置しており、その上に[選択]ボタンと[閉じる]ボタンをのせています。
2) 履歴の表示
この関数は、引数にXMLファイル(SQL実行履歴)のパスを受け取ります。
DataSetのReadXmlメソッドで、このXMLファイルを読み込みリストビューへ表示しています。
3) SQL選択時の処理
履歴リストで選択されたSQLはリストビューのSelectedIndexChangedを使用して、下に配置されてあるテキストボックスへ表示します。
4) [選択]ボタンクリック時の処理
選択ボタンが押されたらDialogResultをOKにしてフォームを閉じます。
このフォームはShowDialogメソッドを使用して表示されているので、DialogResultがOKだったときに、テキストボックスに表示されていたSQL文をreturnで返すようにしました。
この関数の作成に伴い、Execute-Query関数を変更する必要があるのですが、これについては次回説明したいと思います。