この記事は
SQL*PLUSもどきを作る8
の続きです。
「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関数を変更する必要があるのですが、これについては次回説明したいと思います。
Theme design by Jelle Druyts
Pick a theme: BlogXP business calmBlue Candid Blue dasBlog dasblogger DirectionalRedux Discreet Blog Blue Elegante essence Just Html MadsSimple Mobile Mono Movable Radio Blue Movable Radio Heat nautica022 orangeCream Portal Project84 Project84Grass Slate Sound Waves Tricoleur useit.com Voidclass2 BlogXP business calmBlue Candid Blue dasBlog dasblogger DirectionalRedux Discreet Blog Blue Elegante essence Just Html MadsSimple Mobile Mono Movable Radio Blue Movable Radio Heat nautica022 orangeCream Portal Project84 Project84Grass Slate Sound Waves Tricoleur useit.com Voidclass2
Powered by: newtelligence dasBlog 2.0.7226.0
The opinions expressed herein are my own personal opinions and do not represent my employer's view in any way.
© Copyright 2009, HIRO
E-mail