PL/SQL ビルダーの作成(2) : プロシージャ一覧の表示 : 【VB.NET】

↓ソースコードのダウンロード

ブラウザでダウンロード

列の作成
通常、初期処理として良く使用される フォームの Load イベントで
プロシージャ一覧用の、列を追加します。

ColumnHeadersHeightSizeMode は、自動にしてしまうと
長いタイトル文字列が折れ返されてしまいます。

	' ******************************************************
	' 初期処理
	' ******************************************************
	Private Sub Form1_Load(ByVal sender As System.Object, _
	ByVal e As System.EventArgs) Handles MyBase.Load

		' プロシージャ一覧の LboxGrid を初期化
		Me.LboxGrid2.ColumnHeadersHeightSizeMode = _
		 DataGridViewColumnHeadersHeightSizeMode.EnableResizing
		Me.LboxGrid2.AddColumn("NAME", "プロシージャ名")
		Me.LboxGrid2.AddColumn("STATUS", "状態")
		Me.LboxGrid2.AddColumn("TYPE", "タイプ")
		Me.LboxGrid2.AddColumn("CREATE", "作成日")
		Me.LboxGrid2.AddColumn("UPDATE", "更新日")


	End Sub




プロシージャ一覧を呼び出す為の SQL を準備
プロジェクトでディレクトリを追加し、そこに外部データとして
SQL を記述したテキストを作成します。

select
	OBJECT_NAME as "プロシージャ名"
	,STATUS as "状態"
	,OBJECT_TYPE  as "タイプ"
	,CREATED  as "作成日"
	,LAST_DDL_TIME  as "更新日"
from USER_OBJECTS
where
	OBJECT_TYPE in ('FUNCTION','PROCEDURE')
order by
	"プロシージャ名"




一覧作成用のメソッドを作成
他で呼び出す事を考え、イベントに直接書かずにメソッドとして作成し、
ダイアログの接続処理から呼び出すようにします

	' ******************************************************
	' プロシージャ一覧作成
	' ******************************************************
	Private Function Init_Proc_List() As Boolean

		' 行データを全て削除
		Me.LboxGrid2.Clear()

		' DB にアクセスする為の SQL を外部から取得する為に特化された
		' スタティックなメソッドを使用する
		Dim Query As String = DbHelper.GetSql("..\..\データ\proc_list.sql")
		' 内容を確認する為に、コンソールに出力しておく
		Console.WriteLine(Query)

		' 読み出し
		If Not db.Query(Query) Then
			Console.WriteLine(db.myError)
			Return False
		End If

		' LboxGrid にデータを追加
		Do While db.Read()
			' 行追加
			Me.LboxGrid2.AddRow()

			' DB よりデータセット
			' ( AddRow 直後なので、行のインデックスを指定する必要が無い )
			Me.LboxGrid2.SetColumnText("NAME", db.GetValue("プロシージャ名"))
			Me.LboxGrid2.SetColumnText("STATUS", db.GetValue("状態"))
			Me.LboxGrid2.SetColumnText("TYPE", db.GetValue("タイプ"))
			Me.LboxGrid2.SetColumnText("CREATE", db.GetValue("作成日"))
			Me.LboxGrid2.SetColumnText("UPDATE", db.GetValue("更新日"))

		Loop

		Return True

	End Function

以下のようして呼び出しています ( ダイアログ呼び出しの詳細はこちらを参照  )

		' 接続
		If Not db.Connect() Then
			LboxText.MessageError("接続に失敗しました")
			Console.WriteLine(db.myError)
			' カーソルとウインドウをを元に戻す
			Me.Cursor = Cursors.Default
			Me.Enabled = True
			Exit Sub
		End If

		' プロシージャ一覧作成
		If Not Init_Proc_List() Then
			LboxText.MessageError("プロシージャ一覧の読み出しに失敗しました")
		End If

		' 接続解除
		db.Close()






リストをダブルクリックしてソースを表示
Oracle 用の DB クラスには、ストアードプロシージャのテキストを取得する
メソッドを用意してあるのでそれを使います。

LboxEditor1.Editor の Editor は、リッチテキストボックスのインスタンスです

	' ******************************************************
	' セルをダブルクリック( 行と列の位置を取得 )
	' ******************************************************
	Private Sub LboxGrid2_CellDoubleClick(ByVal sender As System.Object, _
	ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles LboxGrid2.CellDoubleClick

		Dim col As Integer = e.ColumnIndex		' カラム位置( ここでは使用しない )
		Dim row As Integer = e.RowIndex			' 行位置

		Dim proc As String = Me.LboxGrid2.GetColumnText(row, "NAME")
		' 確認の為に、コンソールに表示
		Console.WriteLine(proc)

		' 接続
		If Not db.Connect() Then
			LboxText.MessageError("接続に失敗しました")
			Console.WriteLine(db.myError)
			Exit Sub
		End If

		Me.LboxEditor1.Editor.Text = db.QueryProcText(proc)

		' 接続解除
		db.Close()

	End Sub

DbOracle.QueryProcText

	' ******************************************************
	' SQL を実行して プロシージャのテキストを取得
	' ******************************************************
	Public Function QueryProcText(ByVal proc As String) As String

		Me._SqlString = String.Format( _
		 "select * from USER_SOURCE where NAME = '{0}'" + _
		 " order by LINE ", proc.ToUpper())


		' 読み取りオブジェクトが閉じていない場合は、閉じる
		If Not Me.myReader Is Nothing Then
			If Not Me.myReader.IsClosed Then
				Me.myReader.Close()
			End If
		End If

		Me.myCommand.CommandText = Me._SqlString

		Try
			Me.myReader = myCommand.ExecuteReader()
		Catch ex As Exception
			Me._myError = ex.Message
			Return "ERROR"
		End Try

		Dim ret As String

		ret = ""

		Do While Me.Read()
			ret &= Me.GetValue("TEXT")
		Loop

		Me.Close()

		Return ret

	End Function