SQLの窓

2011年09月11日


VB.net : CSVによるインポート用ファイルの作成( つまりエクスポート )



接続処理等、その他のコードは上からダウンロードしてご確認下さい。
テキストファイルのエンコードに関しては、以下を参照して下さい

VB.net での テキストファイルの読み書きを、
出力時のみキャラクタセット毎に条件コンパイル指定する

INSERT 文でのエクスポートは以下を参照して下さい

VB.net : insert 構文によるインポート用ファイルの作成( つまりエクスポート )

データベースは MySQL を使っていますが、手法としてはどの RDBMS でも同じです
INSERT 文作成との違いは、Excel 等のインポートするアプリケーションの都合を
考える事です。

1) 一行目は列名リストで、ダブルクォートで囲う
2) NULL データは、数値型は 0 に変更し、それ以外は空文字列 "" とする
3) 文字列型と、日付型はデータをダブルクォートで囲う

※ ここでは、NULL データを NULL で戻す事を想定していませんが、考慮する場合は
※ インポートするアプリケーションの仕様に合わせて作り直す必要があります。
' ********************************************************
' CSV用データ取得
' ********************************************************
Function GetValue( myReader As OdbcDataReader, _
	strName As String) As String

	Dim ret As String = ""
	Dim fld As Integer = 0
	Dim TypeName As String

	' 指定された列名より、テーブル内での定義順序番号を取得
	fld = myReader.GetOrdinal(strName)
	' 定義順序番号より、NULL かどうかをチェック
	If myReader.IsDBNull(fld) Then
		' NULL の場合
		ret = ""
	Else
		ret = myReader.GetValue(fld).ToString()
	End If

	' データ型の取得
	TypeName = myReader.GetFieldType(fld).ToString()

	' 文字列と日付の場合は、ダブルクォートで囲う
	if TypeName = "System.String" or TypeName = "System.DateTime" then
		ret = """" + ret + """"
	else
		' 数値で空の場合は 0 に変更する
		if ret = "" then
			ret = 0
		end if
	end if

	' 列の値を返す
	Return ret

End Function

Sub Main()

	' SQL作成に必要なテーブル名を引数から取得する
	' 空白を指定したい場合は、"文字列 文字列" のように指定する
	Dim arguments As String() = Environment.GetCommandLineArgs()
	' 引数は一つのみ許可
	if arguments.Length <> 2 then
		Console.WriteLine("引数を指定して下さい")
		Return
	end if

	' 引数からエクスポート対象テーブル名を取得
	Dim TargetTable As String = arguments(1)

	' 新しい OdbcConnection オブジェクトを作成
	Dim myCon As OdbcConnection = CreateConnection()

	if myCon is Nothing then
		Console.WriteLine("処理が異常終了しました")
		Return
	end if

	'---------------------------------------------------

	' レコードセットを取得する為の SQL を準備
	Dim myQuery As String = _
		"SELECT * from `" + TargetTable + "`"

	' SELECT 実行用のオブジェクトを作成( クラスは更新用と同じです )
	' コンストラクタを使うと以下のようになります
	' Dim execCommand As New OdbcCommand( myQuery, myCon )
	Dim myCommand As OdbcCommand = New OdbcCommand()
	' 実行する為に必要な情報をセット
	myCommand.CommandText = myQuery
	myCommand.Connection = myCon

	' 実行後にレコードセットを取得する為のオブジェクトを作成
	Dim myReader As OdbcDataReader
	' ここで SELECT を実行してその結果をオブジェクトに格納する
	myReader = myCommand.ExecuteReader()

	' 固定回数ループ用( 列名リスト作成 ) 変数
	Dim idx As Integer
	' CSV1行を格納する変数
	Dim CsvString As String = Nothing

	' SHIFT_JIS で出力する為のテキストファイルの準備
	Dim SJIS_Enc As Encoding = Encoding.GetEncoding(932)
	Dim WriteFile As StreamWriter = New StreamWriter( TargetTable + ".csv", False, SJIS_Enc )

	' 行文字列の初期化
	CsvString = ""
	' フィールド数より自動で列名リストの作成
	For idx = 0 to myReader.FieldCount - 1
		' 文字列足し算で、初回は区切り文字を追加しない
		if idx <> 0 then
			CsvString += ","
		end if
		' CSV 用タイトル
		CsvString += """" + myReader.GetName(idx) + """"
	Next
	' タイトル行出力
	WriteFile.WriteLine( CsvString )

	' 読み出し
	' Rewad メソッドは、行が存在する場合は true、それ以外の場合は false を返します
	Do While myReader.Read()

		' 行文字列の初期化
		CsvString = ""
		For idx = 0 to myReader.FieldCount - 1
			if idx <> 0 then
				CsvString += ","
			end if
			' 値部分を文字列に追加
			CsvString += GetValue(myReader,myReader.GetName(idx))
		Next

		' 一行の完成した CSV
		WriteFile.WriteLine( CsvString )

	Loop

	' リソースの後片づけ
	myReader.Close()
	myReader.Dispose()
	WriteFile.Close()
	WriteFile.Dispose()

	'---------------------------------------------------

	Call EndConnection( myCon )

End Sub



posted by lightbox at 2011-09-11 14:25 | VB.NET : データベース | このブログの読者になる | 更新情報をチェックする
バッチ処理

Microsoft Office
container 終わり

フリーフォントで簡単ロゴ作成
フリーフォントでボタン素材作成
フリーフォントで吹き出し画像作成
フリーフォントではんこ画像作成
ほぼ自由に利用できるフリーフォント
フリーフォントの書体見本とサンプル
画像を大きく見る為のウインドウを開くボタンの作成

Android SDK ポケットリファレンス
改訂版 Webデザイナーのための jQuery入門
今すぐ使えるかんたん ホームページ HTML&CSS入門
CSS ドロップシャドウの参考デモ
Google Hosted Libraries
cdnjs
BUTTONS (CSS でボタン)
イラストAC
ぱくたそ
写真素材 足成
フリーフォント一覧
utf8 文字ツール
右サイド 終わり
base 終わり