Monday, March 31, 2008

この記事は2008/01/22にわんくまブログで書いたものです。

ネタ元: データを取得してXMLファイルへ保存する(Oracle) (Windows PowerShell Tips)

でOracleデータベースからデータを取得し、XMLファイルへ保存する関数を紹介しました。
今回は、これを改善し、

  • 取得したデータをWinodwsフォームのDataGridViewへの表示
  • [XMLへ保存]ボタンが押されたら、ファイル保存ダイアログを表示し、任意の名前を付けて保存
    ができるようにしてみました。

Export-OracleDataXml2.ps1

#===============================================================================
# Export-OracleDataXml2: データを取得してXMLファイルへ保存する(Oracle)
#
# 使用例
#   PS > Export-OracleDataXml
#   PS > DataSource: データソース名
#   PS > User ID: ユーザーID
#   PS > Password: パスワード
#   PS > Query String: クエリ文字列
#
# copyright HIRO's.NET(http://hiros-dot.net.com/)
#===============================================================================
function global:Export-OracleDataXml2
{
  #===== 必要情報をユーザーから取得する =====
  $DataSource = Read-Host "Data Source"
  $UserID = Read-Host "User ID"
  $Password = Read-Host "Password" -assecurestring
  $QueryString = Read-Host "Query String"
  
  #===== newpopsさんのblog参照 http://d.hatena.ne.jp/newpops/20050923/p1 =====
  #SecureStringからパスワード文字列を取得する
  $ptr = [System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($Password)
  $pass = [System.Runtime.InteropServices.Marshal]::PtrToStringBSTR($ptr)
  
  #===== Oracleからのデータ取得 =====
  [reflection.assembly]::LoadWithPartialName("System.Data.OracleClient")
  $ConnectionString = "Data Source=" + $DataSource + ";User ID=" + $UserID + ";Password=" + $Pass + ";Integrated Security=no;"
  $OraConn = New-Object System.Data.OracleClient.OracleConnection($ConnectionString)
  $dtSet = New-Object System.Data.DataSet
  $OraDa = New-Object System.Data.OracleClient.OracleDataAdapter($QueryString, $OraConn)
  $OraDa.Fill($dtSet)
  
  #===== Formの作成 =====
  [reflection.assembly]::LoadWithPartialName("System.Windows.Forms")
  $form = New-Object System.Windows.Forms.Form
  $form.Text = $DataSource + "@" + $UserID
  $form.Width = 500
  $form.Height = 400

  #===== DataGridViewの作成 =====
  $dgvOracle = New-Object System.Windows.Forms.DataGridView
  $dgvOracle.Dock = [System.Windows.Forms.DockStyle]::Fill
  $dgvOracle.DataSource = $dtSet.Tables[0]
  $form.Controls.Add($dgvOracle)
  
  #===== Panelの作成 =====
  $panel1 = New-Object System.Windows.Forms.Panel
  $form.Controls.Add($panel1)
  $panel1.Dock = [System.Windows.Forms.DockStyle]::Bottom
  $panel1.Height = 30

  #===== [XMLへ保存]ボタンの作成 =====
  $btnExport = New-Object System.Windows.Forms.Button
  $btnExport.Location = New-Object System.Drawing.Point(324, 4)
  $btnExport.Text = "XMLへ保存"
  $btnExport.anchor = [System.Windows.Forms.AnchorStyles]::Top -bor [System.Windows.Forms.AnchorStyles]::Right
  $btnExport.Add_Click(
  {
    #===== ファイル保存ダイアログを作成 =====
    $dlgSave = New-Object System.Windows.Forms.SaveFileDialog
    $dlgSave.DefaultExt = "XML"
    $dlgSave.Filter = "XMLファイル(*.xml)|*.xml"
    if ( $dlgSave.ShowDialog() -eq [System.Windows.Forms.DialogResult]::OK )
    {
      #===== データを保存する =====
      $dtSet.WriteXml($dlgSave.Filename)
    }
  })
  $panel1.Controls.Add($btnExport)
  
  #===== [閉じる]ボタンの作成 =====
  $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.Close()})
  $panel1.Controls.AddRange($btnClose)
  
  #===== Formを表示 =====
  $form.ShowDialog()
}

 

実行結果は、下記のとおりです。

 

今回のポイント
・Windows フォームを作成する
VB.NETやC#で開発をされている方は、ソースを見ると何となくわかると思います。


**VB.NET**

Dim form As New Form()


**C#**

Form form = new Form();


**PowerShell**

$form = New-Object System.Windows.Forms.Form


でフォームのインスタンスを作成します。

・各コントロールの作成とフォームへの配置
コントロールを作成してフォームへ配置するには

$control = New-Object System.Windows.Forms.コントロール


のように記述してコントロールを作成して

$form.ControlAdd($control)


としてフォームへ配置します。
今回、ボタンはパネル上に配置したので

$panel1.Controls.Add($btnExport)


のようになっています。

・ボタンのクリックイベント


ボタンのクリックイベントは

$button.Add_Click({ここに処理したいスクリプトを記述})


のように記述します。

Monday, March 31, 2008 2:48:36 AM (Tokyo Standard Time, UTC+09:00)  #    Comments [0]  |  Trackback
Comments are closed.

Theme design by Jelle Druyts

Pick a theme: