ソース掲示板




すべてから検索

キーワード   条件 表示 現行ログ 過去ログ トピックス 名前 本文
Oracle 高速 CSV 出力アプリケーション
日時: 2008/07/22 10:39
名前: lightbox



プロジェクト名
R205_ORACLE_TESTA
準備
1) 新規プロジェクトの画面が表示されたら、「すべてを保存」する
2) R205_ORACLE_TESTA\R205_ORACLE_TESTA をエクスプローラで開く
↓からライブラリをダウンロードして、R205_ORACLE_TESTA\R205_ORACLE_TESTA に保存する
http://lightbox.on.coocan.jp/download/lightbox_dotnet_02.lzh
lightbox_dotnet_02.lzh をその場で解凍して、プロジェクトで参照する
解凍後 全てのファイルを表示 参照の追加
メンテナンス

画面作成 ( No.1 )
日時: 2008/07/22 11:42
名前: lightbox


日時: 2008/07/22 11:42
名前: lightbox
LboxGrid を Form1 に貼り付ける
ツールボックスから、右クリックで「アイテムの選択」を選び、
R205_ORACLE_TESTA\R205_ORACLE_TESTA\lightbox_dotnet_02\lightbox.dll を追加する。

ツールボックスから LboxGrid を貼り付ける
左右に分割(境界移動式)の、二つの LboxGrid を作成
↓以下を参考に、作成
Dock+Splitter 3分割パターン
メニュー作成
1) ツールボックスから、MenuStrip を Form にドラッグ&ドロップ
2) メニュー項目を3つ作成
	A) テーブル一覧
	B) CSV出力
	C) 接続先情報の変更
メニューの動作を確認
Private Sub テーブル一覧ToolStripMenuItem_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles テーブル一覧ToolStripMenuItem.Click

	MessageBox.Show("テーブル一覧")

End Sub

Private Sub CSV出力ToolStripMenuItem_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles CSV出力ToolStripMenuItem.Click

	MessageBox.Show("CSV出力")

End Sub

Private Sub 接続先情報の変更ToolStripMenuItem_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles 接続先情報の変更ToolStripMenuItem.Click

	MessageBox.Show("接続先情報の変更")

End Sub
接続先情報の変更用のダイアログを作成
1) 追加 => 新しい項目 => ダイアログ
2) 動作確認( メニュー項目のイベントに以下のコードを記述 )
Private Sub 接続先情報の変更ToolStripMenuItem_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles 接続先情報の変更ToolStripMenuItem.Click

	Dim MyDialog As New Dialog1()
	Dim ret As DialogResult = MyDialog.ShowDialog(Me)
	MyDialog.Dispose()

End Sub
ダイアログの中を作成
以下の3つの項目を、ラベルとテキストフィールドで作成

サーバー
ユーザー
パスワード

※ テキストフィールドの名称は、それぞれサーバー、ユーザー、パスワード
※ バスワードの PsswordChar に * をセットしておく
LboxGrid のタイトルを作成
Form の load イベントで、以下のコードを書く
Me.LboxGrid1.AddColumn("TABLE", "テーブル名")

Me.LboxGrid2.ReadOnly = False
Me.LboxGrid2.AddColumn("CHECK", "選択", lightbox.LboxColumnType.LboxColumnType_CheckBox)
Me.LboxGrid2.AddColumn("COL", "列名")
Me.LboxGrid2.DisableColumnEdit("COL")
Me.LboxGrid2.AddColumn("ATT", "データタイプ")
Me.LboxGrid2.DisableColumnEdit("ATT")
Me.LboxGrid2.AddColumn("LEN", "文字列長さ")
Me.LboxGrid2.DisableColumnEdit("LEN")
このアーティクルの参照用URLをクリップボードにコピー メンテナンス
テーブル一覧 ( No.2 )
日時: 2008/07/22 12:17
名前: lightbox
DB処理用ライブラリの Imports
Imports lightbox.db
接続用の文字列変数を定義
Public Server As String
Public User As String = "lightbox"
Public Pass As String = "lightbox"
処理毎に、DB アクセス用のインスタンスを作成
Dim db As New DbOracle(Server, User, Pass)
メニュー項目のイベントに以下を実装
Dim db As New DbOracle(Server, User, Pass)

If Not db.Connect() Then
	MessageBox.Show("接続に失敗しました")
	Return
End If

db.Query("select * from USER_TABLES order by TABLE_NAME")
Me.LboxGrid1.Clear()
Do While db.Read()

	Me.LboxGrid1.AddRow()
	Me.LboxGrid1.SetColumnText("TABLE", db.GetValue("TABLE_NAME"))

Loop

db.Close()
ロードイベントに以下を追加
Server = System.Net.Dns.GetHostName() + "/ORCL"
このアーティクルの参照用URLをクリップボードにコピー メンテナンス
ダイアログのコード ( No.3 )
日時: 2008/07/22 12:15
名前: lightbox
変数を表示して、OK ボタンで内容を変更する
Imports System.Windows.Forms

Public Class Dialog1

	Private Sub Dialog1_Load(ByVal sender As System.Object, _
	 ByVal e As System.EventArgs) Handles MyBase.Load

		Me.サーバー.Text = Form1.Server
		Me.ユーザー.Text = Form1.User
		Me.パスワード.Text = Form1.Pass

	End Sub

	Private Sub OK_Button_Click(ByVal sender As System.Object, _
	 ByVal e As System.EventArgs) Handles OK_Button.Click

		Form1.Server = Me.サーバー.Text
		Form1.User = Me.ユーザー.Text
		Form1.Pass = Me.パスワード.Text

		Me.DialogResult = System.Windows.Forms.DialogResult.OK
		Me.Close()
	End Sub


	Private Sub Cancel_Button_Click(ByVal sender As System.Object, _
	ByVal e As System.EventArgs) Handles Cancel_Button.Click
		Me.DialogResult = System.Windows.Forms.DialogResult.Cancel
		Me.Close()
	End Sub

End Class
このアーティクルの参照用URLをクリップボードにコピー メンテナンス
選択したテーブルの列情報を表示する ( No.4 )
日時: 2008/07/22 13:51
名前: lightbox
CSV 作成用の文字列を作る際に、ここで使用したテーブル名を使うので、
グローバル変数にセットしておく

Public TableName As String
Private Sub LboxGrid1_CellClick(ByVal sender As System.Object, _
ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles LboxGrid1.CellClick

	If e.RowIndex < 0 Then
		Return
	End If

	TableName = LboxGrid1.GetColumnText(e.RowIndex, "TABLE")

	Dim db As New DbOracle(Server, User, Pass)

	If Not db.Connect() Then
		MessageBox.Show("接続に失敗しました")
		Return
	End If

	Dim Query As String = "select * from USER_TAB_COLUMNS "
	Query += " where TABLE_NAME = '" + TableName + "'"
	Query += " order by COLUMN_ID"
	db.Query(Query)
	Me.LboxGrid2.Clear()
	Do While db.Read()

		Me.LboxGrid2.AddRow()
		Me.LboxGrid2.SetColumnText("COL", db.GetValue(1))
		Me.LboxGrid2.SetColumnText("ATT", db.GetValue("DATA_TYPE"))
		Me.LboxGrid2.SetColumnText("LEN", db.GetValue("CHAR_COL_DECL_LENGTH"))

	Loop

	db.Close()

End Sub
このアーティクルの参照用URLをクリップボードにコピー メンテナンス
CSV 出力用( 高速 ) の select 文を作成する ( No.5 )
日時: 2008/07/22 15:43
名前: lightbox
' フォーカスを チェック部分以外に移動して、チェックされた事を確定させる
Me.LboxGrid2.SetFocusCell(0, "COL")

' 最初の行から読むように初期化
Me.LboxGrid2.SetCurrentRow()

Dim strColName As String

' 間に挟む文字列
Dim strParts As String = "||','||"

' 加工用変数( 初期値は空文字列 )
Dim strLine As String = ""

' 全ての行を読み込む
Do While (Me.LboxGrid2.FindNextRow())

	' チェックされていた場合の処理
	If Me.LboxGrid2.GetColumnBoolean("CHECK") Then
		' チェックされている行の列名
		strColName = Me.LboxGrid2.GetColumnText("COL")

		' こういう処理のセオリー
		' 最初以外は、前に間に挟む文字列をセット
		' 最初かどうかは、strLine が空かどうかで判断
		If strLine <> "" Then
			strLine = strLine + strParts
		End If

		' strLine(一行ぶんの文字列 列を追加)
		strLine = strLine + strColName

	End If

Loop

Console.WriteLine(strLine)

strLine = "select " + strLine + " from " + TableName

Console.WriteLine(strLine)
↓strLine の内容のサンプル
select 社員コード||','||氏名||','||フリガナ||','||所属||','||性別||','||作成日||','||更新日||','||給与||','||手当||','||管理者||','||生年月日 from 社員マスタ
このアーティクルの参照用URLをクリップボードにコピー メンテナンス
PL/SQL 側の CSV出力 ( No.6 )
日時: 2008/07/22 15:43
名前: lightbox
Windows 側で作成された文字列をパラメータ(引数) で、入力し、
それをそのまま使って動的にカーソルを作成し、
ループ処理を用いて、テキストファイルに出力する
プロシージャ名 : CSV高速出力 事前確認事項
1) Windows 環境で出力テストしたスキーマと同じスキーマに作成する
2) 使用するディレクトリオブジェクトの確認
	select * from ALL_DIRECTORIES
	ディレクトリオブジェクトに定義されてる物理ディレクトリが存在するか確かめる
ファイル出力のサンプル
/**********************************************************/
/* 定義部分 */
/**********************************************************/
FILEHANDLE	UTL_FILE.FILE_TYPE;

----------------------------------------------------------
FILEHANDLE := UTL_FILE.FOPEN( 'MYDIR', WK_FILENAME, 'w' );

LOOP
	FETCH cur_main INTO COMMENT_REC;
	EXIT when cur_main%NOTFOUND;

	UTL_FILE.PUTF( FILEHANDLE, '%s\n', WK_CSV );

END LOOP;

UTL_FILE.FCLOSE( FILEHANDLE );
動的カーソルのサンプル
/**********************************************************/
/* 定義部分 */
/**********************************************************/
検索cur SYS_REFCURSOR;

---------------------------------------------------------

/**********************************************************/
/* 動的 SELECT */
/**********************************************************/
WK_VALUE := 'SELECT * FROM 社員マスタ WHERE 社員コード >= :仮引数';
OPEN 検索cur for WK_VALUE using PM_STRING;
LOOP
	FETCH 検索cur INTO 社員_REC;
	EXIT when 検索cur%NOTFOUND;
	DBMS_OUTPUT.PUT_LINE( 社員_REC.社員コード || ' : ' || 社員_REC.氏名);
END LOOP;
CLOSE 検索cur;
引数の文字列で、動的カーソルを作成する
PROCEDURE CSV高速出力
(
	PM_STRING IN VARCHAR2
)

/**********************************************************/
/* 変数の定義 */
/**********************************************************/
AS
	RET_VALUE	VARCHAR2(2000);
	WK_VALUE	VARCHAR2(2000);

	検索cur SYS_REFCURSOR;

/**********************************************************/
/* 処理開始 */
/**********************************************************/
BEGIN
	DBMS_OUTPUT.PUT_LINE('デバッグ:開始');

	OPEN 検索cur for PM_STRING;
	CLOSE 検索cur;

/**********************************************************/
/* 一番外側のブロックの例外処理 */
/**********************************************************/
EXCEPTION
	WHEN OTHERS THEN
		DBMS_OUTPUT.PUT_LINE('例外発生:'||SQLCODE||':'||SQLERRM);
END;
DB からデータを取得
PROCEDURE CSV高速出力
(
	PM_STRING IN VARCHAR2
)

/**********************************************************/
/* 変数の定義 */
/**********************************************************/
AS
	RET_VALUE	VARCHAR2(2000);
	WK_VALUE	VARCHAR2(2000);

	検索cur SYS_REFCURSOR;

/**********************************************************/
/* 処理開始 */
/**********************************************************/
BEGIN
	DBMS_OUTPUT.PUT_LINE('デバッグ:開始');

	OPEN 検索cur for PM_STRING;
	LOOP
		FETCH 検索cur INTO WK_VALUE;
		EXIT when 検索cur%NOTFOUND;
		DBMS_OUTPUT.PUT_LINE( substr(WK_VALUE,1,20) );
	END LOOP;
	CLOSE 検索cur;

/**********************************************************/
/* 一番外側のブロックの例外処理 */
/**********************************************************/
EXCEPTION
	WHEN OTHERS THEN
		DBMS_OUTPUT.PUT_LINE('例外発生:'||SQLCODE||':'||SQLERRM);
END;
ファイルの出力先を決定
PROCEDURE CSV高速出力
(
	PM_STRING IN VARCHAR2
)

/**********************************************************/
/* 変数の定義 */
/**********************************************************/
AS
	RET_VALUE	VARCHAR2(2000);
	WK_VALUE	VARCHAR2(2000);

	検索cur SYS_REFCURSOR;
	FILEHANDLE	UTL_FILE.FILE_TYPE;

/**********************************************************/
/* 処理開始 */
/**********************************************************/
BEGIN
	DBMS_OUTPUT.PUT_LINE('デバッグ:開始');

	FILEHANDLE := UTL_FILE.FOPEN( 'CSV', '高速出力.CSV', 'w' );

	OPEN 検索cur for PM_STRING;
	LOOP
		FETCH 検索cur INTO WK_VALUE;
		EXIT when 検索cur%NOTFOUND;
		DBMS_OUTPUT.PUT_LINE( substr(WK_VALUE,1,20) );
	END LOOP;
	CLOSE 検索cur;

	UTL_FILE.FCLOSE( FILEHANDLE );

/**********************************************************/
/* 一番外側のブロックの例外処理 */
/**********************************************************/
EXCEPTION
	WHEN OTHERS THEN
		DBMS_OUTPUT.PUT_LINE('例外発生:'||SQLCODE||':'||SQLERRM);
END;
データを出力
PROCEDURE CSV高速出力
(
	PM_STRING IN VARCHAR2
)

/**********************************************************/
/* 変数の定義 */
/**********************************************************/
AS
	RET_VALUE	VARCHAR2(2000);
	WK_VALUE	VARCHAR2(2000);

	検索cur SYS_REFCURSOR;
	FILEHANDLE	UTL_FILE.FILE_TYPE;

/**********************************************************/
/* 処理開始 */
/**********************************************************/
BEGIN
	DBMS_OUTPUT.PUT_LINE('デバッグ:開始');

	FILEHANDLE := UTL_FILE.FOPEN( 'CSV', '高速出力.CSV', 'w' );

	OPEN 検索cur for PM_STRING;
	LOOP
		FETCH 検索cur INTO WK_VALUE;
		EXIT when 検索cur%NOTFOUND;

		UTL_FILE.PUTF( FILEHANDLE, '%s\n', WK_VALUE );
		DBMS_OUTPUT.PUT_LINE( substr(WK_VALUE,1,20) );
	END LOOP;
	CLOSE 検索cur;

	UTL_FILE.FCLOSE( FILEHANDLE );

/**********************************************************/
/* 一番外側のブロックの例外処理 */
/**********************************************************/
EXCEPTION
	WHEN OTHERS THEN
		DBMS_OUTPUT.PUT_LINE('例外発生:'||SQLCODE||':'||SQLERRM);
END;
このアーティクルの参照用URLをクリップボードにコピー メンテナンス
VB.NET から、PL/SQL を呼び出す ( No.7 )
日時: 2008/07/22 15:36
名前: lightbox
No.5 で作成された strLine 内の select 文は、
この呼び出し方の場合、' を '' に変更する必要があります。
( 変更しないで呼び出す方法もあります )
Dim db As New DbOracle(Server, User, Pass)

If Not db.Connect() Then
	MessageBox.Show("接続に失敗しました")
	Return
End If

Dim str As String

str = strLine.Replace("'", "''")
str = "BEGIN CSV高速出力('" + str + "' ); END;"

If db.Execute(str) = -2 Then
	MessageBox.Show(db.myError)
End If

db.Close()
このアーティクルの参照用URLをクリップボードにコピー メンテナンス