SQLの窓

2014年12月21日


VB.net : GetSchema メソッドでデータベース内のテーブル一覧と指定したテーブルの列名一覧を取得する

▼ これは、ODBC ドライバを列挙するスクリプトです


この仕様は元々 ADO のものです。Framework のドキュメントからはとても解りづらくなっていますが、古いドキュメントで容易に確認できます。

SchemaEnum

C# のコードはこちら

VB.net から C# へのオンライン変換ツールを久しぶりに使ってみましたが、後から手作業で変更したのは、ControlChars.CrLf を "\r\n" にしただけでした。
Imports System.Data
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.3 Unicode 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

		' データベースのテーブル一覧のメタデータを取得
		' TABLE_CATALOG
		' TABLE_SCHEMA
		' TABLE_NAME
		' TABLE_TYPE
		Dim dataTable As DataTable = myCon.GetSchema(OdbcMetaDataCollectionNames.Tables)

		' 一覧表示
		Dim row As DataRow
		For Each row In  dataTable.Rows
			Dim column As DataColumn = dataTable.Columns.item("TABLE_NAME")
			Console.WriteLine( row.item(column) )
		Next

		' データベースの列名一覧のメタデータを取得
		' TABLE_CATALOG
		' TABLE_SCHEMA
		' TABLE_NAME
		' COLUMN_NAME
		' 配列で、対象データを絞る
		Dim restrictionValues As String() = {Nothing,Nothing,"社員マスタ"}

		' 社員マスタの列のメタデータ
		dataTable = myCon.GetSchema(OdbcMetaDataCollectionNames.Columns,restrictionValues)

		' 列名の一覧を表示
		For Each row In  dataTable.Rows
			Dim column As DataColumn = dataTable.Columns.item("COLUMN_NAME")
			Console.WriteLine(row.item(column))
		Next

		' 接続を閉じる
		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

関連する記事

ODBC ドライバの列挙 / VBScript

WMIのレジストリアクセスで、レジストリエントリの一覧を取得する VBScript クラス


タグ:ODBC
posted by lightbox at 2014-12-21 20:52 | VB.NET : データベース | このブログの読者になる | 更新情報をチェックする

2011年10月30日


VB.net : ListView に DB から読み込んだデータをセットする



NAVER まとめで手順書

表形式でデータを表示する最も簡単な方法です。



以下のようなプライベートクラスを使うのがミソです
' ********************************************************
' ListView 用のプライベートクラス
' ********************************************************
Private Class RowData
	Inherits System.Windows.Forms.ListViewItem

	Public Sub New(ByVal myReader As OdbcDataReader)

		Me.Text = Form1.GetValue(myReader, "社員コード")
		Me.SubItems.Add(Form1.GetValue(myReader, "氏名"))

	End Sub
End Class

このプライベートクラスを使って以下のように呼び出します。



※ ListView 側は、デザイナから列を作成しておいて下さい。




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

2011年10月23日


VB.net : 一時 PL/SQL で Data Pump Exportユーティリティと同じデータをエクスポートして処理結果を取得する

PL/SQL のユーティリティを使用すると、VB.net を通してパラメータを
カスタマイズ可能なエクスポートアプリケーションを作成できます。

結果を知る為のパラメータは ParameterDirection.Output で出力のみで
取得しています。正常終了すると、"COMPLETED" という文字列が返ります。
( 既にファイルがある場合は、"例外発生" が返ります。)

各プロシージャの詳細は Oracle ドキュメント : DBMS_DATAPUMP
DECLARE 
	J_HANDLE NUMBER;
/**********************************************************/
/* 処理開始 */
/**********************************************************/
BEGIN
	/***************************/
	/* OPEN */
	/***************************/
	J_HANDLE := DBMS_DATAPUMP.OPEN(
		'EXPORT'
		,'TABLE'
		,NULL
		,NULL
		,'COMPATIBLE'
		,DBMS_DATAPUMP.KU$_COMPRESS_METADATA
	);

	/***************************/
	/* 出力ファイル */
	/***************************/
	DBMS_DATAPUMP.ADD_FILE(
		J_HANDLE
		,'MY_TABLE_BACKUP.DMP'
		,'MYDIR'
		,NULL
		,DBMS_DATAPUMP.KU$_FILE_TYPE_DUMP_FILE
	);

	/***************************/
	/* SQL 式で スキーマを指定 */
	/***************************/
	DBMS_DATAPUMP.METADATA_FILTER(
		J_HANDLE
		,'SCHEMA_EXPR'
		,'IN (''LIGHTBOX'')'
	);

	/***************************/
	/* SQL 式で 表を指定 */
	/***************************/
	DBMS_DATAPUMP.METADATA_FILTER(
		J_HANDLE
		,'NAME_EXPR'
		,'IN (''社員マスタ'',''商品マスタ'')'
	);

	/***************************/
	/* データを出力しない */
	/***************************/
	DBMS_DATAPUMP.DATA_FILTER (
		J_HANDLE
		,'INCLUDE_ROWS'
		,0
	);

	/***************************/
	/* 開始 */
	/***************************/
	DBMS_DATAPUMP.START_JOB(
		J_HANDLE
		,0
	);

	/***************************/
	/* JOB 終了まで待機 */
	/***************************/
	DBMS_DATAPUMP.WAIT_FOR_JOB(
		J_HANDLE
		,:J_STS
	);

	/***************************/
	/* 終了ステータスの表示 */
	/***************************/
	DBMS_OUTPUT.PUT_LINE('処理終了:'||:J_STS);

/**********************************************************/
/* 一番外側のブロックの例外処理 */
/**********************************************************/
EXCEPTION
	WHEN OTHERS THEN
		DBMS_OUTPUT.PUT_LINE('例外発生:'||SQLCODE||':'||SQLERRM);
		:J_STS := '例外発生';
END;

' キャラクタセット
Dim SJIS_Enc As Encoding = Encoding.GetEncoding(932) 
' 読み込み用
' plsql.sql は、改行コードを LF のみにして下さい
Dim ReadFile As StreamReader = New StreamReader( "plsql.sql", SJIS_Enc )

' SHIFT_JIS で読み込み
Dim SqlText As String = ReadFile.ReadToEnd()
ReadFile.Close() 

Dim myCommand As New OracleCommand()
myCommand.Connection = myCon

Dim myParam1 As OracleParameter
' *******************************************
' プロシージャの実行
' *******************************************
' 実行タイプ( SQLとして実行 )
myCommand.CommandType = CommandType.Text
' プロシージャ名
myCommand.CommandText = SqlText

' パラメータクリア
myCommand.Parameters.Clear()
' 内容を取得する変数用パラメータ( OUT なので、Direction プロパティにセット )
myParam1 = myCommand.Parameters.Add("J_STS", OracleType.Varchar)
myParam1.Direction = ParameterDirection.Output 
myParam1.Size = 50		' 長さ

Try
	' 結果を受け取り、後で処理する
	myCommand.ExecuteNonQuery()
Catch ex As Exception
	myCon.Close()
	Console.WriteLine(ex.Message)
	Return
End Try

Console.WriteLine(myParam1.Value)

関連する記事

VB.net : 一時PL/SQL 内の変数をプログラムでやり取りする



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

VB.net : 一時PL/SQL 内の変数をプログラムでやり取りする

一番重要なのは、PL/SQL の改行コードに CRLF の CR を含めない事です。

:変数名 でバインドさせると、自動的に PL/SQL 側で変数として定義されます

ここでは、テストの為に ParameterDirection.InputOutput を使っていますが、
入力データはもともと PL/SQL がテキストなので、文字列を置き換えて実行する
方法もあります。

関連する記事

http://logicalerror.seesaa.net/article/228467533.html

もっと言えば、PL/SQL 側の動的 PL/SQL を使わないでも比較的簡単に 動的な
SQL の実行が可能です。むしろ、パーツ化してマクロ化してしまえばより便利
になると思います。
DECLARE 

	WK_STRING VARCHAR2(50);

BEGIN 

	WK_STRING := :RET_VALUE;

	DBMS_OUTPUT.PUT_LINE(:RET_VALUE); 

	UPDATE 社員マスタ SET 氏名 = :RET_VALUE
		WHERE 社員コード = '0001';

	DBMS_OUTPUT.PUT_LINE(WK_STRING); 

	:RET_VALUE := '最終値';

END; 

Imports System.Data
Imports System.Data.OracleClient
Imports System.IO
Imports System.Text

Module Module1

	Sub Main()

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

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

		'---------------------------------------------------
		' キャラクタセット
		Dim SJIS_Enc As Encoding = Encoding.GetEncoding(932) 
		' 読み込み用
		' plsql.sql は、改行コードを LF のみにして下さい
		Dim ReadFile As StreamReader = New StreamReader( "plsql.sql", SJIS_Enc )

		' SHIFT_JIS で読み込み
		Dim SqlText As String = ReadFile.ReadToEnd()
		ReadFile.Close() 

		Dim myCommand As New OracleCommand()
		myCommand.Connection = myCon

		Dim myParam1 As OracleParameter
		' *******************************************
		' プロシージャの実行
		' *******************************************
		' 実行タイプ( SQLとして実行 )
		myCommand.CommandType = CommandType.Text
		' プロシージャ名
		myCommand.CommandText = SqlText

		' パラメータクリア
		myCommand.Parameters.Clear()
		' 内容を取得する変数用パラメータ( OUT なので、Direction プロパティにセット )
		myParam1 = myCommand.Parameters.Add("RET_VALUE", OracleType.Varchar)
		myParam1.Direction = ParameterDirection.InputOutput 
		myParam1.Size = 50		' 長さ
		myParam1.Value = "山田 太郎"

		Try
			' 結果を受け取り、後で処理する
			myCommand.ExecuteNonQuery()
		Catch ex As Exception
			myCon.Close()
			Console.WriteLine(ex.Message)
			Return
		End Try

		Console.WriteLine(myParam1.Value)

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

		Call EndConnection( myCon )

	End Sub


	' ******************************************************
	' 接続終了
	' ******************************************************
	Sub EndConnection( myCon As OracleConnection )

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

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

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

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

	End Sub

	' ******************************************************
	' 接続作成
	' ******************************************************
	Function CreateConnection( ) As OracleConnection

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

		' 接続用のパラメータを追加
		builder.Add("Server", "light/xe")
		builder.Add("User ID", "LIGHTBOX")
		builder.Add("Password", "LIGHTBOX")

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

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

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

		' 接続を開く
		Try
			myCon.Open()
		Catch ex As OracleException
			Console.WriteLine("接続エラーです")
			Console.WriteLine( ex.Message )
			Return Nothing
		End Try

		Return myCon

	End Function

End Module



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

2011年10月14日


VB.net : PL/SQL の OUT パラメータから実行結果を取得する

PL/SQL 側で、以下のように定義されたプロシージャを呼び出します
PROCEDURE PARAM_OUT_TEST 
( 
	PM_STRING IN VARCHAR2, 
	PM_NUMBER OUT NUMBER 
) 
第一引数は、入力のみなので Direction の設定はしていません。第二引数は 入力はしませんが、出力するので Direction の設定をします。 ※ Inpit、Output、InputOutput、ReturnValue があります
Imports System.Data
Imports System.Data.OracleClient

Module Module1

	Sub Main()

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

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

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

		Dim myCommand As New OracleCommand()
		myCommand.Connection = myCon

		Dim myParam1 As OracleParameter
		Dim myParam2 As OracleParameter
		' *******************************************
		' プロシージャの実行
		' *******************************************
		' 実行タイプ( ストアードプロシージャとして実行 )
		myCommand.CommandType = CommandType.StoredProcedure
		' プロシージャ名
		myCommand.CommandText = "PARAM_OUT_TEST"

		' パラメータクリア
		myCommand.Parameters.Clear()
		' 1つ目のパラメータ( IN なのでデータセット )
		myParam1 = myCommand.Parameters.Add("PM_STRING", OracleType.VarChar)
		myParam1.Value = "0010"

		' 2つ目のパラメータ( OUT なので、Direction プロパティにセット )
		myParam2 = myCommand.Parameters.Add("PM_NUMBER", OracleType.Number)
		myParam2.Direction = ParameterDirection.Output
	
		Try
			' 結果を受け取り、後で処理する
			myCommand.ExecuteNonQuery()
		Catch ex As Exception
			myCon.Close()
			Console.WriteLine(ex.Message)
			Return
		End Try

		' Decimal で返されている
		Console.WriteLine(myParam2.Value.GetType())

		Dim myValue As Decimal = myParam2.Value
		Console.WriteLine(myValue)

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

		Call EndConnection( myCon )

	End Sub


	' ******************************************************
	' 接続終了
	' ******************************************************
	Sub EndConnection( myCon As OracleConnection )

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

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

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

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

	End Sub

	' ******************************************************
	' 接続作成
	' ******************************************************
	Function CreateConnection( ) As OracleConnection

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

		' 接続用のパラメータを追加
		builder.Add("Server", "light/xe")
		builder.Add("User ID", "LIGHTBOX")
		builder.Add("Password", "LIGHTBOX")

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

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

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

		' 接続を開く
		Try
			myCon.Open()
		Catch ex As OracleException
			Console.WriteLine("接続エラーです")
			Console.WriteLine( ex.Message )
			Return Nothing
		End Try

		Return myCon

	End Function

End Module

Function の場合の戻り値の取得は以下のようにして記述できます
この場合、戻り値は最初に定義しますが、変数名は何でもいいです。
' パラメータクリア
myCommand.Parameters.Clear()
' 1つ目のパラメータ( 戻り値として )
myParam1 = myCommand.Parameters.Add("RET_VALUE", OracleType.Number)
myParam1.Direction = ParameterDirection.ReturnValue

' 2つ目のパラメータ( 第一引数として )
myParam2 = myCommand.Parameters.Add("PM_STRING", OracleType.Varchar)
myParam2.Value = "0001"

※ :を使って、SQL文内にバインド変数を埋め込む方法もあります
( CommandType.Text を使います )

コロン( : ) を使った場合の引数の処理 :サーバー側のカーソルを取得して使用する



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

2011年09月18日


VB.net : ODBC + MySQL で CSV をインポート( クラス化サンプル )



VB.net : CSVによるインポート用ファイルの作成( つまりエクスポート ) で作成した
CSV をインポートする処理ですが、データベースの処理等をクラス化しています

MyClass.vb
社員マスタ.sql
社員マスタ.csv
Imports System.IO
Imports System.Text

Module Module1

	Sub Main()

		' データベースとその他の処理をまとめたクラス
		Dim MyObj As MyLib = New MyLib("localhost","lightbox","root","password")

		' オブジェクトを使って接続処理
		if Not MyObj.CreateConnection() then
			Console.WriteLine("処理が異常終了しました")
			Return
		end if

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

		' insert 構文固定部分
		Dim InsertQueryBase As String = "insert into `社員マスタ` ("
		' 行毎完成 insert 文 を格納する変数
		Dim InsertQuery As String = Nothing

		' SHIFT_JIS で入力する為のテキストファイルの準備
		Dim SJIS_Enc As Encoding = Encoding.GetEncoding(932)
		Dim ReadFile As StreamReader = New StreamReader( MyLib.CsvPath, SJIS_Enc )

		' SHIFT_JIS で読み込む準備
		Dim LineText As String = Nothing
		' ループカウンタ用
		Dim idx As Integer = 0

		' Peek() は、StreamReader オブジェクトの現在位置は変わりません
		' それ以上読み取り可能な文字がない場合、戻り値は -1 です。
		Do While ReadFile.Peek() >= 0

			' 一行を読み込む
			LineText = ReadFile.ReadLine()

			if idx = 0 then
				LineText = LineText.Replace("""","`")
				InsertQueryBase = InsertQueryBase + LineText + ")"
				idx += 1
				Continue Do
			end if

			InsertQuery = InsertQueryBase + " values("
			LineText = LineText.Replace("""""","NULL")
			LineText = LineText.Replace("""","'")
			InsertQuery = InsertQuery + LineText + ")"

'			Console.WriteLine( InsertQuery )
			MyObj.Execute(InsertQuery)

			' 読み込みカウンタアップ
			idx += 1
		Loop

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

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

		MyObj.EndConnection()

	End Sub

End Module



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

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=night/xe;" + _
		"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 %>
この記述は、以下の場所で使用します


Windows
container 終わり

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

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