Wednesday, June 04, 2008

この記事は

記事 関数名 説明
SQL*PLUSもどきを作る1 PSOracle SQL*PLUSもどきのメイン関数
SQL*PLUSもどきを作る1の説明 PSOracle SQL*PLUSもどきのメイン関数の説明
SQL*PLUSもどきを作る2 Get-OracleConnectionStirng 接続文字列を作成する
SQL*PLUSもどきを作る3 Execute-QueryString SQLを実行した結果をDataSetに格納して返す
SQL*PLUSもどきを作る4 desc descコマンド
SQL*PLUSもどきを作る5 Read-MultiLine コマンドラインから複数行の入力を受け取る
SQL*PLUSもどきを作る6 Execute-Query SQLを実行して、結果をコンソールウィンドウに表示する
SQL*PLUSもどきを作る5(改訂版) Read-MultiLine コマンドラインから複数行の入力を受け取る。終端判定を1文字以上でも行えるよう見直し。
SQL*PLUSもどきを作る7 Disconnect 切断処理

SQL*PLUSもどきを作る8

Write-SqlHistory SQL実行履歴の保存
SQL*PLUSもどきを作る6(改訂版) Execute-Query SQLを実行して、結果をコンソールウィンドウに表示する。SQL実行履歴作成機能の追加。

の続きです。

「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関数を変更する必要があるのですが、これについては次回説明したいと思います。

Wednesday, June 04, 2008 10:24:33 PM (Tokyo Standard Time, UTC+09:00)  #    Comments [0]  |  Trackback
Comments are closed.

Theme design by Jelle Druyts

Pick a theme: