↓ソースコードのダウンロード ブラウザでダウンロード ツールバーにコントロールを配置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 |