↓ソースコードのダウンロード
ブラウザでダウンロード
ツールバーにビルド用ボタンを追加
ツールバーボタンを追加し、そのイベントを別のソースに記述します。
追加でクラスを PLSQL.vb で作成し、先頭の記述を Partial Class Form1 に変更します。
( PLSQL.Designer.vb は必要無いので削除して下さい )
※ ボタン画像の変更は こちら を参照して下さい
Partial Class Form1
' ******************************************************
' PL/SQL のビルド
' ******************************************************
Private Sub ビルド_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles ビルド.Click
End Sub
End Class
対象プロシージャ名の取得
正規表現を利用して、表示されているテキストからプロシージャ名を取得し、
存在しない場合はエラーメッセージを表示します
Imports lightbox.control
Imports System.Text.RegularExpressions
Partial Class Form1
' ******************************************************
' PL/SQL のビルド
' ******************************************************
Private Sub ビルド_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles ビルド.Click
Dim fpat As String = "^\s*function\s+([^\s]+)\s"
Dim ppat As String = "^\s*procedure\s+([^\s]+)\s"
' 正規表現で、テキストソース上のビルド対象名を取得する
Dim m As Match
Dim target As String
Dim type As String = ""
m = Regex.Match( _
Me.LboxEditor1.Text, _
fpat, _
RegexOptions.IgnoreCase Or RegexOptions.Multiline)
If m.Success Then
Console.WriteLine(m.Groups(1))
target = m.Groups(1).ToString()
type = "F"
Else
m = Regex.Match( _
Me.LboxEditor1.Text, _
ppat, _
RegexOptions.IgnoreCase Or RegexOptions.Multiline)
If m.Success Then
Console.WriteLine(m.Groups(1))
target = m.Groups(1).ToString()
type = "P"
End If
End If
If type = "" Then
LboxText.MessageError("対象のファンクションまたはプロシージャ名を取得できません")
Exit Sub
End If
End Sub
End Class
ビルドとメッセージの取得
PL/SQL のビルドには、コマンドオブジェクトを使っていますが、
SQL のエラーが無ければビルド上エラーは発生しません。
しかし、PL/SQL の構文でエラーが発生している場合があるので、
接続オプジェクトを使ってイベントメッセージを取得します
Imports lightbox.control
Imports System.Text.RegularExpressions
' ● ビルド用に追加
Imports lightbox.db
' ● Oracle 警告ハンドラ用に追加
Imports System.Data.OracleClient
Partial Class Form1
Public build_Handle As PLSQL
Public build_Status As String = ""
' ******************************************************
' PL/SQL のビルド
' ******************************************************
Private Sub ビルド_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles ビルド.Click
Dim fpat As String = "^\s*function\s+([^\s]+)\s"
Dim ppat As String = "^\s*procedure\s+([^\s]+)\s"
' 正規表現で、テキストソース上のビルド対象名を取得する
Dim m As Match
Dim target As String = ""
Dim type As String = ""
m = Regex.Match( _
Me.LboxEditor1.Text, _
fpat, _
RegexOptions.IgnoreCase Or RegexOptions.Multiline)
If m.Success Then
Console.WriteLine(m.Groups(1))
target = m.Groups(1).ToString()
type = "F"
Else
m = Regex.Match( _
Me.LboxEditor1.Text, _
ppat, _
RegexOptions.IgnoreCase Or RegexOptions.Multiline)
If m.Success Then
Console.WriteLine(m.Groups(1))
target = m.Groups(1).ToString()
type = "P"
End If
End If
If type = "" Then
LboxText.MessageError("対象のファンクションまたはプロシージャ名を取得できません")
Exit Sub
End If
' ///////////////////////////////
' ● ビルドメソッド呼び出し
' ///////////////////////////////
If Build(target) Then
If build_Status <> "" Then
Me.ToolStripStatusLabel1.Text = target + " : " + build_Status
Else
Me.ToolStripStatusLabel1.Text = target + " のビルドが正常終了しました"
End If
Else
Me.ToolStripStatusLabel1.Text = target + " のビルドにエラーが存在します"
End If
End Sub
' ******************************************************
' ● ビルドメソッド
' ******************************************************
Private Function Build(ByVal Target As String) As Boolean
Dim ret As Boolean = True
' 既に一度インスタンスが作成されている場合
If Not build_Handle Is Nothing Then
build_Handle.CloseAndDispose()
End If
' Oracle 用インスタンス作成
build_Handle = New PLSQL( _
Me.Server + "/" + Me.Service, _
Me.User, _
Me.Pass _
)
' 砂時計カーソル
Me.Cursor = Cursors.WaitCursor
' 接続
If Not build_Handle.Connect() Then
LboxText.MessageError("接続に失敗しました")
Console.WriteLine(build_Handle.myError)
' カーソルとウインドウをを元に戻す
Me.Cursor = Cursors.Default
Exit Function
End If
' ///////////////////////////////
' ● Oracle 警告ハンドラ の登録
' ///////////////////////////////
build_Status = ""
AddHandler build_Handle.myCon.InfoMessage, AddressOf olacle_info
Dim psText As String = "create or replace " + Me.LboxEditor1.Text
If Not build_Handle.Build(psText) Then
ret = False
LboxText.MessageError(build_Handle.myError)
End If
' 接続解除
build_Handle.Close()
' カーソルを元に戻す
Me.Cursor = Cursors.Default
Return ret
End Function
' ******************************************************
' ● Oracle 警告ハンドラ
' ******************************************************
Private Sub olacle_info(ByVal sender As System.Object, _
ByVal e As OracleInfoMessageEventArgs)
Console.WriteLine(e.Message)
build_Status = e.Message
End Sub
End Class
|
|