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

ソースコードの主要部分を全て読む

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

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



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

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

データベースは MySQL を使っていますが、手法としてはどの RDBMS でも同じです。テーブル名を渡して自動的に作成する為に、OdbcDataReaderGetName というメソッドで列名を取り出しています。

また、データ型に応じて insert 構文のデータ部分を考慮している部分が以下のコードになります。NULL の扱いと、文字列と日付の場合は、シングルクォートで囲うという処理が重要な部分となります

データ型は、VB.net のネイティブな型ですが、この程度の処理であればこれで問題はありません。
( DB にとってのネイティブな型はもう少し面倒な処理をする必要があります )
' ********************************************************
' SQL文作成用列データ取得
'
' 列データを文字列として取得しますが、NULL の場合は
' "NULL" という文字列を返します
' ********************************************************
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 = "NULL"
	Else
		' NULL でなければ内容をオブジェクトとして取りだして文字列化する
		TypeName = myReader.GetFieldType(fld).ToString()

		' 文字列と日付の場合は、シングルクォートで囲う
		if TypeName = "System.String" or TypeName = "System.DateTime" then
			ret = "'" + myReader.GetValue(fld).ToString() + "'"
		else
			ret = myReader.GetValue(fld).ToString()
		end if
	End If

	' 列の値を返す
	Return ret

End Function




ソースコードの主要部分を全て読む

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

2011年09月03日


VB.net 2008 : System.Data.Odbc データ取得(SELECT)処理( MySQL 5.1 )



以下のソースコードはデータ取得部分のみの記述です。接続処理等、その他のコードは上からダウンロードしてご確認下さい。

この処理の元となる記事

VB.net 2008 : System.Data.Odbc 接続テスト( MySQL 5.1 )
Sub Main()

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

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

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

	' レコードセットを取得する為の SQL を準備
	Dim myQuery As String = _
		"SELECT `社員マスタ`.*,DATE_FORMAT(`生年月日`,'%Y-%m-%d') as `誕生日`" _
		+ " from `社員マスタ`"

	' 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()

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

		' 文字列
		Console.Write(GetValue(myReader,"社員コード") + " : ")
		Console.Write(GetValue(myReader,"氏名") + " : ")

		' 整数
		Console.Write(GetValue(myReader,"給与") + " : ")

		' 日付
		Console.Write(GetValue(myReader,"作成日") + " : ")
		Console.Write(GetValue(myReader,"更新日") + " : ")
		Console.Write(GetValue(myReader,"生年月日") + " : ")
		Console.Write(GetValue(myReader,"誕生日"))

		Console.WriteLine()

	Loop

	myReader.Close()


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

	Call EndConnection( myCon )



End Sub

' *************************************************
' 列データ取得
'
' 列データを文字列として取得しますが、NULL の場合は
' 空文字列を返します
' *************************************************
Function GetValue( myReader As OdbcDataReader, _
	strName As String) As String

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

	' 指定された列名より、テーブル内での定義順序番号を取得
	fld = myReader.GetOrdinal(strName)
	' 定義順序番号より、NULL かどうかをチェック
	If myReader.IsDBNull(fld) Then
		ret = ""
	Else
		' NULL でなければ内容をオブジェクトとして取りだして文字列化する
		ret = myReader.GetValue(fld).ToString()
	End If

	' 列の値を返す
	Return ret

End Function


SQL 実行部分は、読み込み部分が解りやすくなるように、エラー処理を省略しています


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

2011年09月02日


VB.net 2008 : System.Data.Odbc 更新処理( MySQL 5.1 )



以下のソースコードは更新部分のみの記述です。接続処理等、その他のコードは上から
ダウンロードしてご確認下さい。

この処理の元となる記事

VB.net 2008 : System.Data.Odbc 接続テスト( MySQL 5.1 )
Sub Main()

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

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

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

	' 更新用の文字列を作成
	Dim myQuery As String = _
	"update `社員マスタ` set `生年月日` = '1982/01/01'" _
		+ " where `社員コード` = '0001'"

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

	Dim ret As Integer
	' 実行
	Try
		ret = execCommand.ExecuteNonQuery()
	Catch ex As OdbcException
		Console.WriteLine("実行エラーです")
		' Console.WriteLine( ex.Message )
		Call ErrorAction( ex )
		' エラーが発生しても、接続を閉じる必要があるので、
		' 処理を継続します
	End Try

	' リソースを解放
	execCommand.Dispose()

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

	Call EndConnection( myCon )

End Sub

UPDATE、INSERT、DELETE の各ステートメントで、戻り値(ret)はそのコマンドの影響を
受ける行の数です。その他のステートメントでの戻り値は、-1 です。ロールバックが
発生した場合も、戻り値は -1 です。


タグ:MySQL
posted by lightbox at 2011-09-02 16:32 | VB.NET : データベース | このブログの読者になる | 更新情報をチェックする

2011年08月30日


VB.net 2008 : System.Data.Odbc 接続テスト( MySQL 5.1 )



OdbcConnectionStringBuilder を使っている以外は特別なところはありません。
OdbcConnection の使い方と、接続のサンプルです
Imports System.Data.Odbc

Module Module1

	Sub Main()

		' 新しい OdbcConnectionStringBuilder オブジェクトを作成
		Dim builder As New OdbcConnectionStringBuilder()

		' ドライバ文字列をセット ( 波型括弧{} は必要ありません ) 
		' 文字列を正確に取得するには、レジストリ : HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBCINST.INI
		builder.Driver = "MySQL ODBC 5.1 Driver"

		' 接続用のパラメータを追加
		builder.Add("SERVER", "localhost")
		builder.Add("DATABASE", "lightbox")
		builder.Add("UID", "root")
		builder.Add("PWD", "password")

		' 内容を確認
		Console.WriteLine(builder.ConnectionString)

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

		' 接続文字列を設定
		myCon.ConnectionString = builder.ConnectionString

		' 接続を開く
		Try
			myCon.Open()
		Catch ex As OdbcException
			Console.WriteLine("接続エラーです")
			' Console.WriteLine( ex.Message )
			Call ErrorAction( ex )
			Exit Sub
		End Try

		' 接続を閉じる
		myCon.Close()

		' OdbcConnection オブジェクトに使用されているすべてのリソースを解放
		myCon.Dispose()

		' 処理終了
		Console.WriteLine("処理が終了しました")

		' 一時停止
		Console.Write("Enterキーを押して下さい : ")
		Console.ReadLine()

	End Sub

	' ******************************************************
	' エラー処理
	' ******************************************************
	Sub ErrorAction( ex As OdbcException )

		Dim CrLf As String = ControlChars.CrLf
		Dim errorMessages As String = ""
		Dim i As Integer

		For i = 0 To ex.Errors.Count - 1
			errorMessages &= _
				"Index #" & i.ToString() & CrLf _
				& "Message: " & ex.Errors(i).Message & CrLf _
				& "NativeError: " & ex.Errors(i).NativeError.ToString() & CrLf _
				& "Source: " & ex.Errors(i).Source & CrLf _
				& "SQL: " & ex.Errors(i).SQLState & CrLf
		Next i

		Console.WriteLine(errorMessages)

	End Sub

End Module



パラメータは、Microsoft の標準のものを使用していますが、MySQL が定義したものを利用できます。
(例)
        builder.Add("SERVER", "localhost")
        builder.Add("DATABASE", "lightbox")
        builder.Add("USER", "root")
        builder.Add("PASSWORD", "password")
        builder.Add("PORT", "3306")
全てのパラメータ
Parameter Comment
user The user name used to connect to MySQL.
uid Synonymous with user
server The host name of the MySQL server.
database The default database.
option Options that specify how Connector/ODBC should work. See below.
port The TCP/IP port to use if server is not localhost.
initstmt Initial statement. A statement to execute when connecting to MySQL. In version 3.51 the parameter is called stmt. Note, the driver supports the initial statement being executed only at the time of the initial connection.
password The password for the user account on server.
pwd Synonymous with password
socket The Unix socket file or Windows named pipe to connect to if server is localhost.
sslca The path to a file with a list of trust SSL CAs. Added in 3.51.16.
sslcapath The path to a directory that contains trusted SSL CA certificates in PEM format. Added in 3.51.16.
sslcert The name of the SSL certificate file to use for establishing a secure connection. Added in 3.51.16.
sslcipher A list of permissible ciphers to use for SSL encryption. The cipher list has the same format as the openssl ciphers command Added in 3.51.16.
sslkey The name of the SSL key file to use for establishing a secure connection. Added in 3.51.16.
charset キャラクタセット設定
sslverify If set to 1, the SSL certificate will be verified when used with the MySQL connection. If not set, then the default behavior is to ignore SSL certificate verification.
readtimeout The timeout in seconds for attempts to read from the server
writetimeout The timeout in seconds for attempts to write to the server
interactive Enables the CLIENT_INTERACTIVE connection option of mysql_real_connect.
次のステップ

VB.net 2008 : System.Data.Odbc 更新処理( MySQL 5.1 )


タグ:MySQL
posted by lightbox at 2011-08-30 13:55 | VB.NET : データベース | このブログの読者になる | 更新情報をチェックする

2010年05月26日


VB.net : Oracle の行を返さない SQL の実行

VB.net ビルド & サンプルセット



単純な SQL であれば、System.Data.Odbc でもかまいませんが、PL/SQL へのアクセスが必要な場合は OracleClient が必要となります

オブジェクト的には、OracleConnection や OracleCommand にも Dispose が存在しますが、通常業務処理として Oracle はアプリケーションの開始時に接続し、終了時に接続解除します。( リソースの再取得にはコストがかかりすぎる場合がある為 )。よって、途中で Dispose する事はまずあり得ません
Imports System.Data.OracleClient

Module MyModule

' ********************************************************
' Oracle の行を返さない SQL の実行
' ********************************************************
Sub Main()

	' Oracle 接続用オブジェクト
	Dim myCon As New OracleConnection()
	' Oracle コマンド用オブジェクト
	Dim myCommand As New OracleCommand()
	' SQL文字列格納用
	Dim Query As String = Nothing


	' 接続文字列の作成
	' Server=PC名/サービス名
	myCon.ConnectionString = _
		"Server=pc名/orcl;" + _
		"User ID=lightbox;" + _
		"Password=lightbox;"

	' *******************************************
	' 接続
	' *******************************************
	Try
		' 接続文字列を使用して接続
		myCon.Open()
		' コマンドオブジェクトに接続をセット
		myCommand.Connection = myCon
		' コマンドを通常 SQL用に変更
		myCommand.CommandType = System.Data.CommandType.Text
	Catch ex As Exception
		Console.WriteLine(ex.Message)
		Return
	End Try

	' *******************************************
	' SQL 実行
	' *******************************************
	Query = "update 社員マスタ set 氏名 = 'lightbox' where 社員コード = '0001'"
	myCommand.CommandText = Query
	Try
		myCommand.ExecuteNonQuery()
	Catch ex As Exception
		myCon.Close()
		Console.WriteLine(ex.Message)
		Return
	End Try

	' 接続解除
	myCon.Close()

End Sub

End Module



タグ:Oracle
posted by lightbox at 2010-05-26 19:45 | VB.NET : データベース | このブログの読者になる | 更新情報をチェックする
Seesaa の各ページの表示について
Seesaa の 記事がたまに全く表示されない場合があります。その場合は、設定> 詳細設定> ブログ設定 で 最新の情報に更新の『実行ボタン』で記事やアーカイブが最新にビルドされます。

Seesaa のページで、アーカイブとタグページは要注意です。タグページはコンテンツが全く無い状態になりますし、アーカイブページも歯抜けページはコンテンツが存在しないのにページが表示されてしまいます。

また、カテゴリページもそういう意味では完全ではありません。『カテゴリID-番号』というフォーマットで表示されるページですが、実際存在するより大きな番号でも表示されてしまいます。

※ インデックスページのみ、実際の記事数を超えたページを指定しても最後のページが表示されるようです

対処としては、このようなヘルプ的な情報を固定でページの最後に表示するようにするといいでしょう。具体的には、メインの記事コンテンツの下に『自由形式』を追加し、アーカイブとカテゴリページでのみ表示するように設定し、コンテンツを用意するといいと思います。


※ エキスパートモードで表示しています

アーカイブとカテゴリページはこのように簡単に設定できますが、タグページは HTML 設定を直接変更して、以下の『タグページでのみ表示される内容』の記述方法で設定する必要があります

<% if:page_name eq 'archive' -%>
アーカイブページでのみ表示される内容
<% /if %>

<% if:page_name eq 'category' -%>
カテゴリページでのみ表示される内容
<% /if %>

<% if:page_name eq 'tag' -%>
タグページでのみ表示される内容
<% /if %>
この記述は、以下の場所で使用します
container 終わり



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

CSS ドロップシャドウの参考デモ
イラストAC
ぱくたそ
写真素材 足成
フリーフォント一覧
utf8 文字ツール
右サイド 終わり
base 終わり