PL/SQL ビルダーの作成(4) : ファンクションの実行 : 【VB.NET】

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

ブラウザでダウンロード

ツールバーにコントロールを配置
Function や Procedure に、必要なら引数を与えて実行する為の
コントロールを配置します。
	' ******************************************************
	' 簡易実行
	' ******************************************************
	Private Sub 簡易実行_Click(ByVal sender As System.Object, _
	ByVal e As System.EventArgs) Handles 簡易実行.Click

	End Sub

#Region ディレクティブ   ( 本編機能外情報 )
#Region ディレクティブ を使用してソースの実行コード以外の定義部分
を折りたためるようにして、整理しておきます

#Region "Imports"

Imports lightbox.control
Imports System.Text.RegularExpressions
' ● ビルド用に追加
Imports lightbox.db
' ● Oracle 警告ハンドラ用に追加
Imports System.Data.OracleClient

#End Region

Partial Class Form1

#Region "●●● 変数 ●●●"

	Public build_Handle As PLSQL
	Public build_Status As String = ""

#End Region

	.
	.
	.

PLSQLクラスDbOracleクラスの連携
ファンクションの実行は、結果を取得する為に通常の SELECT 文を使用します。
その為、PLSQL に特化されたクラスでは処理できないので、
DbOracle で得た接続オブジェクトを引き渡し、Connect した事にします

( 開発時の Public 変数の利用例 )

※ このような事象が起きてから、メソッドやプロパティを用意すると良いでしょう

	' ******************************************************
	' 簡易実行
	' ******************************************************
	Private Sub 簡易実行_Click(ByVal sender As System.Object, _
	ByVal e As System.EventArgs) Handles 簡易実行.Click

		' 対象データ取得
		Dim ProcType As String = _
		 Me.LboxGrid2.GetColumnText(Me.LboxGrid2.GetCurrentRowIndex, "TYPE")
		Dim ProcName As String = _
		 Me.LboxGrid2.GetColumnText(Me.LboxGrid2.GetCurrentRowIndex, "NAME")

		' タイプ別実行コマンド作成
		Dim Query As String = ""
		If ProcType = "FUNCTION" Then
			Query = "select """ + ProcName + """(" + _
			 Me.簡易実行パラメータ.Text + ") from dual"
		Else
			Query = "call """ + ProcName + """(" + _
			 Me.簡易実行パラメータ.Text + ")"
		End If

		' ******************************************************
		' 接続処理
		' ******************************************************
		If Not build_Handle Is Nothing Then
			build_Handle.CloseAndDispose()
		End If
		If Not exec_Handle Is Nothing Then
			exec_Handle.CloseAndDispose()
		End If

		' 空の PLSQL インスタンスを作成
		build_Handle = New PLSQL("", "", "")
		' Oracle 用インスタンス作成
		exec_Handle = New DbOracle( _
		  Me.Server + "/" + Me.Service, _
		  Me.User, _
		  Me.Pass _
		 )

		' 砂時計カーソル
		Me.Cursor = Cursors.WaitCursor

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

		' ******************************************************
		' 内部接続オブジェクトを引き渡す
		' ******************************************************
		build_Handle.myCon = exec_Handle.myCon
		build_Handle.myCommand.Connection = exec_Handle.myCon

		' ******************************************************
		' まず DBMS_OUTPUT を使用可能にする
		' ******************************************************
		build_Handle.Enable_DBMS_OUTPUT()

		' ******************************************************
		' 表示エリアのリセット
		' ******************************************************
		Me.LboxGrid1.Reset()
		Me.LboxGrid1.ColumnHeadersHeightSizeMode = _
		  DataGridViewColumnHeadersHeightSizeMode.EnableResizing
		Me.LboxGrid1.AddColumn("TYPE", "種別")
		Me.LboxGrid1.AddColumn("DATA", "結果データ")

		' ******************************************************
		' Query 実行
		' ******************************************************
		If ProcType = "FUNCTION" Then
			' メソッド内で対応された例外
			If Not exec_Handle.Query(Query) Then
				Me.LboxGrid1.AddRow()
				Me.LboxGrid1.SetColumnText(0, "QUERY")
				Me.LboxGrid1.SetColumnText(1, exec_Handle.myError)
				' カーソルとウインドウをを元に戻す
				Me.Cursor = Cursors.Default
				Exit Sub
			End If
			' メソッド内で対応されていない例外
			Try
				If Not exec_Handle.Read() Then
					LboxText.MessageError(exec_Handle.myError)
					' カーソルとウインドウをを元に戻す
					Me.Cursor = Cursors.Default
					Exit Sub
				End If
			Catch ex As Exception
				Dim ErrLine As String() = (ex.Message).Split(ControlChars.Lf)
				For I As Integer = 0 To ErrLine.Length - 1
					Me.LboxGrid1.AddRow()
					Me.LboxGrid1.SetColumnText(0, "READ")
					Me.LboxGrid1.SetColumnText(1, ErrLine(I))
				Next
				' カーソルとウインドウをを元に戻す
				Me.Cursor = Cursors.Default
				Exit Sub
			End Try

			Me.LboxGrid1.AddRow()
			Me.LboxGrid1.SetColumnText(0, "処理結果")
			Me.LboxGrid1.SetColumnText(1, exec_Handle.GetValue(0))
		Else
			LboxText.MessageError("PROCEDURE の実行はまだ実装されていません")
		End If

		' ******************************************************
		' DBMS_OUTPUT 用のパラメータの準備
		' 引数は、取得する内容の最大サイズ
		' ******************************************************
		build_Handle.Start_DBMS_OUTPUT(1024)

		' ******************************************************
		' DBMS_OUTPUT の結果取得
		' ******************************************************
		Dim ret As String = build_Handle.Get_DBMS_OUTPUT()
		If ret <> "" Then
			Me.LboxGrid1.AddRow()
			Me.LboxGrid1.SetColumnText(0, "OUTPUT")
			Me.LboxGrid1.SetColumnText(1, ret)
		End If

		Do While Not build_Handle.EOD
			ret = build_Handle.Get_DBMS_OUTPUT()
			If ret <> "" Then
				Me.LboxGrid1.AddRow()
				Me.LboxGrid1.SetColumnText(0, "OUTPUT")
				Me.LboxGrid1.SetColumnText(1, ret)
			End If
		Loop

		' ******************************************************
		' 接続解除
		' ******************************************************
		exec_Handle.Close()

		' カーソルを元に戻す
		Me.Cursor = Cursors.Default

	End Sub