作成者 |
メッセージ |
|
|
hanchanさんのソースをベースに SQLBindCol関数と[AB4.1]で警告を減らしたモジュールを投稿します。
SQLBindCol関数を使用している為、データアクセスに関する互換性はほぼ無いと考えて下さい。
- 今回のモジュールは3部構成になっています。
- 定義部分
- コネクション部分
- レコードセット部分
- 呼び出し方法はhanchanさんと同じなので掲載なし
- データの参照は 3 で定義した変数をそのまま使用
1.定義部分
コード:
'=====================================================================
' 名 称:データベースアクセスクラス
' 概 要:ODBC接続にてデータベースにアクセスする
' 参照元:hanchan さん
'=====================================================================
'== 定数 =============================================================
Const DBCLASS_OK = 0 As Integer 'クラス正常終了
Const DBCLASS_NG = -1 As Integer 'クラス異常終了
Const SQL_NTS = -3 'Multi Use
'=====================================================================
'== API用定数 ========================================================
'データソース用定数
Const ODBC_ADD_DSN = 1 As Integer 'ユーザーデータソースの追加
Const ODBC_CONFIG_DSN = 2 As Integer 'ユーザーデータソースの編集
Const ODBC_REMOVE_DSN = 3 As Integer 'ユーザーデータソースの削除
Const ODBC_ADD_SYS_DSN = 4 As Integer 'システム データ ソースを追加
Const ODBC_CONFIG_SYS_DSN = 5 As Integer 'システム データ ソースを設定 (編集)
Const ODBC_REMOVE_SYS_DSN = 6 As Integer 'システム データ ソースを削除
'トランザクション用定数
Const SQL_COMMIT = 0 As Integer 'トランザクション-コミット
Const SQL_ROLLBACK = 1 As Integer 'トランザクション-ロールバック
'返却値用定数
Const SQL_SUCCESS = 0 As Integer 'SQL結果-正常終了
Const SQL_SUCCESS_WITH_INFO = 1 As Integer 'SQL結果-正常終了(警告あり)
Const SQL_ERROR = -1 As Integer 'SQL結果-異常終了
Const SQL_INVALID_HANDLE = -2 As Integer 'SQL結果-不正ハンドル返却
Const SQL_NO_DATA_FOUND = 100 As Integer 'SQL結果-データなし
'SQLAllocHandle、SQLFreeHandle用定数
Const SQL_NULL_HANDLE = 0 As Integer 'SQL_HANDLE_ENV時パラメータ
Const SQL_HANDLE_ENV = 1 As Integer '環境ハンドル
Const SQL_HANDLE_DBC = 2 As Integer '接続ハンドル
Const SQL_HANDLE_STMT = 3 As Integer 'ステートメントハンドル
Const SQL_HANDLE_DESC = 4 As Integer
'SQLSetConnectOption用定数
Const SQL_AUTOCOMMIT = 102 As Integer 'AutoCommitオプション
Const SQL_AUTOCOMMIT_OFF = 0 As Integer 'AutoCommitOff
Const SQL_AUTOCOMMIT_ON = 1 As Integer 'AutoCommitOn
'Fetch用定数
Const SQL_FETCH_NEXT = 1 As Integer
Const SQL_FETCH_FIRST = 2 As Integer
Const SQL_FETCH_LAST = 3 As Integer
Const SQL_FETCH_PRIOR = 4 As Integer
Const SQL_FETCH_ABSOLUTE = 5 As Integer
Const SQL_FETCH_RELATIVE = 6 As Integer
'環境定数
Const SQL_ATTR_CURSOR_TYPE = 6 As Integer
Const SQL_ATTR_ROW_NUMBER = 14 As Integer
Const SQL_ATTR_ODBC_VERSION = 200 As Integer
Const SQL_OV_ODBC3 = 3 As Integer
'行操作・結果定数
Const SQL_ROW_SUCCESS = 0 As Integer
Const SQL_ROW_DELETED = 1 As Integer
Const SQL_ROW_UPDATED = 2 As Integer
Const SQL_ROW_NOROW = 3 As Integer
Const SQL_ROW_ADDED = 4 As Integer
Const SQL_ROW_ERROR = 5 As Integer
Const SQL_ROW_SUCCESS_WITH_INFO = 6 As Integer
Const SQL_ROW_PROCEED = 0 As Integer
Const SQL_ROW_IGNORE = 1 As Integer
Const SQL_NO_DATA = 100 As Integer
'サイズ用定数
Const BRWS_LEN = 1000 As Integer
Const SQL_LEN = 1000 As Integer
'接続用定数
Const SQL_DRIVER_COMPLETE_REQUIRED = 3 As Integer
'型宣言用定数
Const SQL_UNKNOWN_TYPE = 0 As Integer
Const SQL_CHAR = 1 As Integer
Const SQL_NUMERIC = 2 As Integer
Const SQL_DECIMAL = 3 As Integer
Const SQL_INTEGER = 4 As Integer
Const SQL_SMALLINT = 5 As Integer
Const SQL_FLOAT = 6 As Integer
Const SQL_REAL = 7 As Integer
Const SQL_DOUBLE = 8 As Integer
Const SQL_DATETIME = 9 As Integer
Const SQL_VARCHAR = 12 As Integer
Const SQL_TYPE_DATE = 91 As Integer
Const SQL_TYPE_TIMESTAMP = 93 As Integer
Const SQL_INTERVAL = 10 As Integer
Const SQL_TIME = 10 As Integer
Const SQL_TIMESTAMP = 11 As Integer
Const SQL_LONGVARCHAR = -1 As Integer
Const SQL_BINARY = -2 As Integer
Const SQL_VARBINARY = -3 As Integer
Const SQL_LONGVARBINARY = -4 As Integer
Const SQL_BIGINT = -5 As Integer
Const SQL_TINYINT = -6 As Integer
Const SQL_BIT = -7 As Integer
Const SQL_GUID = -11 As Integer
Const SQL_C_BINARY = SQL_BINARY
Const SQL_C_BIT = SQL_BIT
Const SQL_C_CHAR = SQL_CHAR
Const SQL_C_DOUBLE = SQL_DOUBLE
Const SQL_C_FLOAT = SQL_REAL
Const SQL_C_LONG = SQL_INTEGER
Const SQL_C_SHORT = SQL_SMALLINT
Const SQL_C_TYPE_DATE = SQL_TYPE_DATE
Const SQL_C_TYPE_TIME = SQL_TYPE_DATE
Const SQL_C_TYPE_TIMESTAMP = SQL_TYPE_TIMESTAMP
Const SQL_C_TINYINT = SQL_TINYINT
'=====================================================================
'Declare Function SQLGetStmtAttr Lib "odbc32" (hstmt As HANDLE,Attribute As Long,ValuePtr As VoidPtr,StringLength As Long,StringLengthPtr As WordPtr) As Integer
'Declare Function SQLSetStmtAttr Lib "odbc32" (hstmt As HANDLE,Attribute As Long,ValuePtr As VoidPtr,StringLength As Long) As Integer
'Declare Function SQLAllocHandle Lib "odbc32" (HandleType As Integer,InputHandle As HANDLE,OutputHandlePtr As DWordPtr) As Integer
'SQLAllocHandle - ハンドルの割り当て
Declare Function SQLAllocHandle _
Lib "odbc32.dll" ( _
ByVal handletype As Integer, _
ByVal inputhandle As HANDLE, _
ByRef outputhandle As HANDLE _
) As Integer
'Declare Function SQLFreeHandle Lib "odbc32" (HandleType As Integer,Handle As HANDLE) As Integer
'SQLFreeHandle - ハンドル・リソースの解放
Declare Function SQLFreeHandle _
Lib "odbc32.dll" ( _
ByVal handletype As Integer, _
ByVal handle As HANDLE _
) As Integer
'Declare Function SQLDisconnect Lib "odbc32" (hdbc As HANDLE) As Integer
'SQLDisconnect - データ・ソースからの切断
Declare Function SQLDisconnect _
Lib "odbc32.dll" ( _
ByVal hdbc As HANDLE _
) As Integer
'SQLPrepare - ステートメントの準備
Declare Function SQLPrepare _
Lib "odbc32.dll" ( _
ByVal hstmt As HANDLE, _
ByVal stmt As String, _
ByVal stmtlen As Long _
) As Integer
'SQLExecute - ステートメントの実行
Declare Function SQLExecute _
Lib "odbc32.dll" ( _
ByVal hstmt As Long _
) As Integer
'Declare Function SQLNumResultCols Lib "odbc32" (hstmt As HANDLE,ColumnCountPtr As WordPtr) As Integer
'SQLNumResultCols - 結果の列数の入手
Declare Function SQLNumResultCols _
Lib "odbc32.dll" ( _
ByVal hstmt As Long, _
ByRef nCou As Integer _
) As Integer
'SQLDescribeCol - 列の属性セットの戻し
Declare Function SQLDescribeCol _
Lib "odbc32.dll" ( _
ByVal hstmt As Long, _
ByVal colno As Integer, _
ByVal colname As String, _
ByVal namelen As Integer, _
ByRef pnamelen As Integer, _
ByRef datatype As Integer, _
ByRef colsize As Long, _
ByRef pdecimal As Integer, _
ByRef pnull As Integer _
) As Integer
'Declare Function SQLFetch Lib "odbc32" (hstmt As HANDLE) As Integer
'SQLFetch - 次の行の取り出し
Declare Function SQLFetch _
Lib "odbc32.dll" ( _
ByVal hstmt As HANDLE _
) As Integer
'Declare Function SQLFetchScroll Lib "odbc32" (hstmt As HANDLE,FetchOrientation As Integer,FetchOffset As Long) As Integer
'SQLFetchScroll - 行セットの取り出しと、バインドされたすべての列のデータの戻し
Declare Function SQLFetchScroll _
Lib "odbc32" ( _
hstmt As HANDLE, _
FetchOrientation As Integer, _
FetchOffset As Long _
) As Integer
'Declare Function SQLGetData Lib "odbc32" (hstmt As HANDLE,icol As Integer,fCType As Integer,rgbValue As BytePtr,cbValueMax As Long,pcbValue As DWordPtr) As Integer
'SQLGetData - 列からのデータの入手
Declare Function SQLGetData _
Lib "odbc32.dll" ( _
ByVal hstmt As HANDLE, _
ByVal colno As Integer, _
ByVal targettype As Integer, _
ByVal pVal As VoidPtr, _
ByVal buflen As Long, _
ByRef ind As Long _
) As Integer
'Declare Function SQLDriverConnect Lib "odbc32" (hdbc As HANDLE,hwnd As Word,szCSIn As BytePtr,cbCSIn As Integer,szCSOut As BytePtr,cbCSMax As Integer,cbCSOut As WordPtr,fDrvrComp As Integer) As Integer
'SQLDriverConnect - データ・ソースへの接続
Declare Function SQLDriverConnect _
Lib "odbc32.dll" ( _
hdbc As HANDLE, _
hwnd As Word, _
szCSIn As BytePtr, _
cbCSIn As Integer, _
szCSOut As BytePtr, _
cbCSMax As Integer, _
cbCSOut As WordPtr, _
fDrvrComp As Integer _
) As Integer
'SQLSetConnectOption - 接続オプションの設定
Declare Function SQLSetConnectOption _
Lib "odbc32.dll" ( _
ByVal hDBc As HANDLE, _
ByVal fOption As Integer, _
ByVal vParam As Long
) As Integer
'Declare Function SQLSetEnvAttr Lib "odbc32" (henv As HANDLE,Attribute As Long,ValuePtr As VoidPtr,StringLength As Long) As Integer
'SQLSetEnvAttr - 環境属性を設定
Declare Function SQLSetEnvAttr _
Lib "odbc32.dll" ( _
henv As HANDLE, _
Attribute As Long, _
ValuePtr As Long, _
StringLength As Long _
) As Integer 'Matea
'SQLTransact - トランザクション管理
Declare Function SQLTransact _
Lib "odbc32.dll" ( _
ByVal hEnv As HANDLE, _
ByVal hDBc As HANDLE, _
ByVal fnType As Integer _
) As Integer
'SQLConfigDataSource - ODBC への登録・編集・削除
Declare Function SQLConfigDataSource _
Lib "odbccp32.dll" ( _
ByVal hwndParent As Long, _
ByVal fRequest As Long, _
ByVal lpszDriver As String, _
ByVal lpszAttributes As String _
) As Long
'****** 列をバインド ******
Declare Function SQLExecDirect Lib "odbc32" ( _
hstmt As HANDLE, _
szSqlStr As BytePtr, _
cbSqlStr As Long _
) As Integer
'****** 列をバインド ******
Declare Function SQLBindCol Lib "odbc32.dll" ( _
ByVal hstmt As HANDLE, _
ByVal icol As Long, _
ByVal fCType As Long, _
ByRef rgbValue As Any, _
ByVal cbValueMax As Long, _
ByRef pcbValue As Long _
) As Long
'=====================================================================
' 定義の終了
'=====================================================================
2.コネクション部分
コード:
'******************************************************************************
' 名 称:コネクション接続クラス
' 概 要:ODBC接続にてデータベースに接続を行う
'******************************************************************************
Class DBConnection
henv As HANDLE '環境ハンドル
hdbc As HANDLE '接続ハンドル
hstmt As HANDLE 'ステートメントハンドル
iConStrOut As Long
sTableName As String
Public
'==========================================================================
' 関数名:コンストラクタ関数
' 説 明:コンストラクタ
' 呼 出:なし
' 引き数:なし
' 戻り値:なし
'==========================================================================
Sub DBConnection()
'変数初期化
hdbc = 0
henv = 0
hstmt = 0
'
SQLAllocHandle( SQL_HANDLE_ENV, 0 , henv ) '環境ハンドル取得
SQLSetEnvAttr ( henv, SQL_ATTR_ODBC_VERSION, SQL_OV_ODBC3, 0 ) '環境属性設定【ODBC3.0】
SQLAllocHandle( SQL_HANDLE_DBC, henv, hdbc ) '接続ハンドル取得
End Sub
'==========================================================================
' 関数名:デストラクタ関数
' 説 明:デストラクタ
' 呼 出:なし
' 引き数:なし
' 戻り値:なし
'==========================================================================
Sub ~DBConnection()
DBCFreeHandle() 'ステートメントハンドルを解放する
SQLDisconnect( hdbc ) '接続を切断する
SQLFreeHandle( SQL_HANDLE_DBC, hdbc ) '接続ハンドルを解放する
SQLFreeHandle( SQL_HANDLE_ENV, henv ) '環境ハンドルを解放する
End Sub
'==========================================================================
' 関数名:ConOpen関数
' 説 明:データベースへ接続を行う
' 呼 出:ConOpen(psDataSource As String)
' 引き数:psDataSource As String (I/ ) ODBCデータソース
' 戻り値:接続状況
'==========================================================================
Function ConOpen(psDataSource As String)
Dim sConStrOut[BRWS_LEN-1] As Byte
Dim ret As Integer
'データベースへ接続する
ret = SQLDriverConnect( hdbc, 0, psDataSource, SQL_NTS, sConStrOut, BRWS_LEN, VarPtr(iConStrOut), SQL_DRIVER_COMPLETE_REQUIRED )
If (ret = SQL_NO_DATA_FOUND) THen
ConOpen = DBCLASS_NG '返却値(NG)
Else
ConOpen = DBCLASS_OK '返却値(OK)
End If
End Function
'==========================================================================
' 関数名:ConClose関数
' 説 明:データベースを切断する
' 呼 出:ConClose()
' 引き数:なし
' 戻り値:なし
'==========================================================================
Sub ConClose()
DBCFreeHandle() 'ステートメントハンドルを解放する
SQLDisconnect(hdbc) 'データベースを切断する
End Sub
'==========================================================================
' 関数名:Execute関数
' 説 明:SQL文を実行する
' 呼 出:Execute(psSqlStr As String)
' 引き数:psSqlStr As String (I/ ) SQL文格納用
' 戻り値:なし
'==========================================================================
Sub Execute(psSqlStr As String)
DBCFreeHandle() 'ステートメントハンドルを解放する
SQLAllocHandle( SQL_HANDLE_STMT, hdbc, hstmt ) 'ステートメントハンドルを取得する
SQLPrepare( hstmt, psSqlStr, Len(psSqlStr) ) 'SQL文を設定する
SQLExecute( hstmt ) 'SQL文を実行する
End Sub
'==========================================================================
' 関数名:BeginTransact関数
' 説 明:AutoCommitを解除し、明示的にトランザクションを行う
' 呼 出:BeginTransact()
' 引き数:なし
' 戻り値:なし
'==========================================================================
Sub BeginTransact()
SQLSetConnectOption( hdbc, SQL_AUTOCOMMIT, SQL_AUTOCOMMIT_OFF ) 'AutoCommitをOFFにする
End Sub
'==========================================================================
' 関数名:Commit関数
' 説 明:Commitを行い、AutoCommitをONにする
' 呼 出:Commit()
' 引き数:なし
' 戻り値:なし
'==========================================================================
Sub Commit()
SQLTransact( henv, hdbc, SQL_COMMIT ) 'トランザクションをCommitする
SQLSetConnectOption( hdbc, SQL_AUTOCOMMIT, SQL_AUTOCOMMIT_ON ) 'AutoCommitをONにする
End Sub
'==========================================================================
' 関数名:RollBack関数
' 説 明:RollBackを行い、AutoCommitをONにする
' 呼 出:RollBack()
' 引き数:なし
' 戻り値:なし
'==========================================================================
Sub RollBack()
SQLTransact( henv, hdbc, SQL_ROLLBACK ) 'トランザクションをRollBackする
SQLSetConnectOption( hdbc, SQL_AUTOCOMMIT, SQL_AUTOCOMMIT_ON ) 'AutoCommitをONにする
End Sub
'==========================================================================
' 関数名:GetEnvHandle関数
' 説 明:接続されたコネクションの環境ハンドルを返却する
' 呼 出:GetEnvHandle()
' 引き数:なし
' 戻り値:環境ハンドル
'==========================================================================
Function GetEnvHandle() As HANDLE
GetEnvHandle = henv
End Function
'==========================================================================
' 関数名:GetDbcHandle関数
' 説 明:接続されたコネクションの接続ハンドルを返却する
' 呼 出:GetDbcHandle()
' 引き数:なし
' 戻り値:接続ハンドル
'==========================================================================
Function GetDbcHandle() As HANDLE
GetDbcHandle = hdbc
End Function
'--------- おまけ -------------------------------------------------------------
'==========================================================================
' 関数名:Compact関数
' 説 明:AccessMDBファイルの最適化を行う
' 呼 出:Compact(psFilePath As String)
' 引き数:psFilePath As String (I/ ) MDBファイルパス
' 戻り値:なし
'==========================================================================
' Function Compact(psFilePath As String) As Integer
'
' 'AccessMDBの最適化を行う
' SQLConfigDataSource( _
' 0, _
' ODBC_CONFIG_DSN, _
' "Microsoft Access Driver (*.MDB)", _
' "DSN=MS Access Database;COMPACT_DB=" & psFilePath & " " & psFilePath _
' )
'
' End Function
'==========================================================================
' 内部関数
'==========================================================================
Private
'------------------------------------------------------
' ハンドルの開放
'------------------------------------------------------
Sub DBCFreeHandle()
If hstmt = 0 Then Exit Sub 'ステートメントハンドルが設定されているか?
SQLFreeHandle( SQL_HANDLE_STMT, hstmt ) 'ステートメントハンドルを解放
hstmt = 0 'ステートメントハンドルを初期化
End Sub
End Class
'******************************************************************************
'******************************************************************************
3.レコードセット部分
コード:
'******************************************************************************
' 名 称:レコードセットクラス
' 概 要:テーブルのレコードセットを取得する(疑似?)
'******************************************************************************
' ●印の場所を、手書きで作成する事で、データの呼び出し性能が数倍高速化します
' ただし、DBのテーブル定義順を知っている必要があります。
' (現在:この定義を自動生成するツールを作成予定です)
'******************************************************************************
'※変数名に!が使用できる用なので、VB風にコーディングしました!!!
Dim DbRs!JUMINCD As DWord '●
Dim DbRs!KARA As Word '●
Dim DbRs!MADE As Word '●
Dim DbRs!SEX As Word '●
Dim DbRs!FAMILY As DWord '●
Dim DbRs!KANA[60+1] As Byte '●
Dim DbRs!NAME[80+1] As Byte '●
Dim DbRs!YUBIN As DWord '●
Dim DbRs!ADR1[80+1] As Byte '●
Dim DbRs!ADR2[60+1] As Byte '●
Dim DbRs!TEL[29] As Byte '●
Dim DbRs!BIRTHDAY As DWord '●
Dim xTest As Long '●
'******************************************************************************
Class DBRecordSet
henv As HANDLE '環境ハンドル
hdbc As HANDLE '接続ハンドル
hstmt As HANDLE 'ステートメントハンドル
iEof As Integer
Public
'==========================================================================
' 関数名:コンストラクタ関数
' 説 明:コンストラクタ
' 呼 出:なし
' 引き数:なし
' 戻り値:なし
'==========================================================================
Sub DBRecordSet()
'変数初期化
hdbc = 0
henv = 0
hstmt = 0
iEof = 0
End Sub
'==========================================================================
' 関数名:デストラクタ関数
' 説 明:デストラクタ
' 呼 出:なし
' 引き数:なし
' 戻り値:なし
'==========================================================================
Sub ~DBRecordSet()
DBRFreeHandle() 'ステートメントハンドルを解放する
End Sub
'==========================================================================
' 関数名:RecOpen関数
' 説 明:SQLをオープンする
' 呼 出:RecOpen(psSqlStr As String, pDbCn As *DBConnection)
' 引き数:psSqlStr As String (I/ ) SQL文格納用
' pDbCn As *DBConnection (I/ ) コネクション接続クラス
' 戻り値:なし
'==========================================================================
Sub RecOpen(psSqlStr As String, pDbCn As *DBConnection)
Dim ret As Integer
henv = pDbCn->GetEnvHandle() '環境ハンドルを取得する
hdbc = pDbCn->GetDbcHandle() '接続ハンドルを取得する
DBRFreeHandle() 'ステートメントハンドルを解放する
'
SQLAllocHandle( SQL_HANDLE_STMT, hdbc, hstmt ) 'ステートメントハンドルを取得する
SQLExecDirect( hstmt, psSqlStr, SQL_NTS ) 'SQL文を実行する
'---------------------------------------------
' データ受取領域の設定
'---------------------------------------------
'(説明) SQLBindCol( ハンドル, データの順番, データ型 , 受取データ ,列バイト, 戻バイト)'●
SQLBindCol( hstmt, 1 As Integer, SQL_C_LONG , DbRs!JUMINCD , 0, xTest )'●
SQLBindCol( hstmt, 2 As Integer, SQL_C_SHORT , DbRs!KARA , 0, xTest )'●
SQLBindCol( hstmt, 3 As Integer, SQL_C_SHORT , DbRs!MADE , 0, xTest )'●
SQLBindCol( hstmt, 4 As Integer, SQL_C_SHORT , DbRs!SEX , 0, xTest )'●
SQLBindCol( hstmt, 5 As Integer, SQL_C_LONG , DbRs!FAMILY , 0, xTest )'●
SQLBindCol( hstmt, 6 As Integer, SQL_C_CHAR , DbRs!KANA , 61, xTest )'●
SQLBindCol( hstmt, 7 As Integer, SQL_C_CHAR , DbRs!NAME , 81, xTest )'●
SQLBindCol( hstmt, 8 As Integer, SQL_C_LONG , DbRs!YUBIN , 0, xTest )'●
SQLBindCol( hstmt, 9 As Integer, SQL_C_CHAR , DbRs!ADR1 , 81, xTest )'●
SQLBindCol( hstmt,10 As Integer, SQL_C_CHAR , DbRs!ADR2 , 61, xTest )'●
SQLBindCol( hstmt,11 As Integer, SQL_C_CHAR , DbRs!TEL , 29, xTest )'●
SQLBindCol( hstmt,12 As Integer, SQL_C_LONG , DbRs!BIRTHDAY, 0, xTest )'●
'
MoveFirst()
End Sub
'==========================================================================
' 関数名:RecClose関数
' 説 明:SQLをクローズする
' 呼 出:RecClose()
' 引き数:なし
' 戻り値:なし
'==========================================================================
Sub RecClose()
DBRFreeHandle() 'ステートメントハンドルを解放する
End Sub
'==========================================================================
' 関数名:MoveFirst関数
' 説 明:先頭行へカーソルを移動する
' 呼 出:MoveFirst()
' 引き数:なし
' 戻り値:なし
'==========================================================================
Sub MoveFirst()
SQLFetchScroll( hstmt, SQL_FETCH_FIRST, 0 ) '先頭行へ移動する
SQLFetch( hstmt )
End Sub
'==========================================================================
' 関数名:MoveNext関数
' 説 明:次行へカーソルを移動する
' 呼 出:MoveNext()
' 引き数:なし
' 戻り値:なし
'==========================================================================
Sub MoveNext()
Dim ret As Integer
ret = SQLFetchScroll( hstmt, SQL_FETCH_NEXT, 0 ) '次行へ移動する
iEof = (ret = SQL_NO_DATA) As Integer
End Sub
'==========================================================================
' 関数名:Eof関数
' 説 明:EOFの状態を返却する
' 呼 出:Eof()
' 引き数:なし
' 戻り値: 0:正常
' :-1:EOF ( 1 から -1 へ変更 )
'==========================================================================
Function Eof() As Integer
Eof = iEof
End Function
'==========================================================================
' 内部関数
'==========================================================================
Private
'------------------------------------------------------
' ハンドルの開放
'------------------------------------------------------
Sub DBRFreeHandle()
If hstmt Then 'ステートメントハンドルが設定されているか判定する
SQLFreeHandle( SQL_HANDLE_STMT, hstmt ) 'ステートメントハンドルを解放する
hstmt = 0
End If
End Sub
End Class
'******************************************************************************
'
'******************************************************************************
[b]hanchanさん[/b]のソースをベースに[b]SQLBindCol[/b]関数と[AB4.1]で警告を減らしたモジュールを投稿します。 [b]SQLBindCol[/b]関数を使用している為、データアクセスに関する互換性はほぼ無いと考えて下さい。 [list=1][b]今回のモジュールは3部構成になっています。[/b] [*]定義部分 [*]コネクション部分 [*]レコードセット部分 [*]呼び出し方法は[b]hanchanさん[/b]と同じなので掲載なし [*]データの参照は [b]3[/b] で定義した変数をそのまま使用[/list] [color=red]1.定義部分[/color] [code] '===================================================================== ' 名 称:データベースアクセスクラス ' 概 要:ODBC接続にてデータベースにアクセスする ' 参照元:hanchan さん '=====================================================================
'== 定数 ============================================================= Const DBCLASS_OK = 0 As Integer 'クラス正常終了 Const DBCLASS_NG = -1 As Integer 'クラス異常終了
Const SQL_NTS = -3 'Multi Use '=====================================================================
'== API用定数 ======================================================== 'データソース用定数 Const ODBC_ADD_DSN = 1 As Integer 'ユーザーデータソースの追加 Const ODBC_CONFIG_DSN = 2 As Integer 'ユーザーデータソースの編集 Const ODBC_REMOVE_DSN = 3 As Integer 'ユーザーデータソースの削除 Const ODBC_ADD_SYS_DSN = 4 As Integer 'システム データ ソースを追加 Const ODBC_CONFIG_SYS_DSN = 5 As Integer 'システム データ ソースを設定 (編集) Const ODBC_REMOVE_SYS_DSN = 6 As Integer 'システム データ ソースを削除
'トランザクション用定数 Const SQL_COMMIT = 0 As Integer 'トランザクション-コミット Const SQL_ROLLBACK = 1 As Integer 'トランザクション-ロールバック
'返却値用定数 Const SQL_SUCCESS = 0 As Integer 'SQL結果-正常終了 Const SQL_SUCCESS_WITH_INFO = 1 As Integer 'SQL結果-正常終了(警告あり) Const SQL_ERROR = -1 As Integer 'SQL結果-異常終了 Const SQL_INVALID_HANDLE = -2 As Integer 'SQL結果-不正ハンドル返却 Const SQL_NO_DATA_FOUND = 100 As Integer 'SQL結果-データなし
'SQLAllocHandle、SQLFreeHandle用定数 Const SQL_NULL_HANDLE = 0 As Integer 'SQL_HANDLE_ENV時パラメータ Const SQL_HANDLE_ENV = 1 As Integer '環境ハンドル Const SQL_HANDLE_DBC = 2 As Integer '接続ハンドル Const SQL_HANDLE_STMT = 3 As Integer 'ステートメントハンドル Const SQL_HANDLE_DESC = 4 As Integer
'SQLSetConnectOption用定数 Const SQL_AUTOCOMMIT = 102 As Integer 'AutoCommitオプション Const SQL_AUTOCOMMIT_OFF = 0 As Integer 'AutoCommitOff Const SQL_AUTOCOMMIT_ON = 1 As Integer 'AutoCommitOn
'Fetch用定数 Const SQL_FETCH_NEXT = 1 As Integer Const SQL_FETCH_FIRST = 2 As Integer Const SQL_FETCH_LAST = 3 As Integer Const SQL_FETCH_PRIOR = 4 As Integer Const SQL_FETCH_ABSOLUTE = 5 As Integer Const SQL_FETCH_RELATIVE = 6 As Integer
'環境定数 Const SQL_ATTR_CURSOR_TYPE = 6 As Integer Const SQL_ATTR_ROW_NUMBER = 14 As Integer Const SQL_ATTR_ODBC_VERSION = 200 As Integer Const SQL_OV_ODBC3 = 3 As Integer
'行操作・結果定数 Const SQL_ROW_SUCCESS = 0 As Integer Const SQL_ROW_DELETED = 1 As Integer Const SQL_ROW_UPDATED = 2 As Integer Const SQL_ROW_NOROW = 3 As Integer Const SQL_ROW_ADDED = 4 As Integer Const SQL_ROW_ERROR = 5 As Integer Const SQL_ROW_SUCCESS_WITH_INFO = 6 As Integer Const SQL_ROW_PROCEED = 0 As Integer Const SQL_ROW_IGNORE = 1 As Integer Const SQL_NO_DATA = 100 As Integer
'サイズ用定数 Const BRWS_LEN = 1000 As Integer Const SQL_LEN = 1000 As Integer
'接続用定数 Const SQL_DRIVER_COMPLETE_REQUIRED = 3 As Integer
'型宣言用定数 Const SQL_UNKNOWN_TYPE = 0 As Integer Const SQL_CHAR = 1 As Integer Const SQL_NUMERIC = 2 As Integer Const SQL_DECIMAL = 3 As Integer Const SQL_INTEGER = 4 As Integer Const SQL_SMALLINT = 5 As Integer Const SQL_FLOAT = 6 As Integer Const SQL_REAL = 7 As Integer Const SQL_DOUBLE = 8 As Integer Const SQL_DATETIME = 9 As Integer Const SQL_VARCHAR = 12 As Integer Const SQL_TYPE_DATE = 91 As Integer Const SQL_TYPE_TIMESTAMP = 93 As Integer Const SQL_INTERVAL = 10 As Integer Const SQL_TIME = 10 As Integer Const SQL_TIMESTAMP = 11 As Integer Const SQL_LONGVARCHAR = -1 As Integer Const SQL_BINARY = -2 As Integer Const SQL_VARBINARY = -3 As Integer Const SQL_LONGVARBINARY = -4 As Integer Const SQL_BIGINT = -5 As Integer Const SQL_TINYINT = -6 As Integer Const SQL_BIT = -7 As Integer Const SQL_GUID = -11 As Integer
Const SQL_C_BINARY = SQL_BINARY Const SQL_C_BIT = SQL_BIT Const SQL_C_CHAR = SQL_CHAR Const SQL_C_DOUBLE = SQL_DOUBLE Const SQL_C_FLOAT = SQL_REAL Const SQL_C_LONG = SQL_INTEGER Const SQL_C_SHORT = SQL_SMALLINT Const SQL_C_TYPE_DATE = SQL_TYPE_DATE Const SQL_C_TYPE_TIME = SQL_TYPE_DATE Const SQL_C_TYPE_TIMESTAMP = SQL_TYPE_TIMESTAMP Const SQL_C_TINYINT = SQL_TINYINT '===================================================================== 'Declare Function SQLGetStmtAttr Lib "odbc32" (hstmt As HANDLE,Attribute As Long,ValuePtr As VoidPtr,StringLength As Long,StringLengthPtr As WordPtr) As Integer 'Declare Function SQLSetStmtAttr Lib "odbc32" (hstmt As HANDLE,Attribute As Long,ValuePtr As VoidPtr,StringLength As Long) As Integer
'Declare Function SQLAllocHandle Lib "odbc32" (HandleType As Integer,InputHandle As HANDLE,OutputHandlePtr As DWordPtr) As Integer 'SQLAllocHandle - ハンドルの割り当て Declare Function SQLAllocHandle _ Lib "odbc32.dll" ( _ ByVal handletype As Integer, _ ByVal inputhandle As HANDLE, _ ByRef outputhandle As HANDLE _ ) As Integer
'Declare Function SQLFreeHandle Lib "odbc32" (HandleType As Integer,Handle As HANDLE) As Integer 'SQLFreeHandle - ハンドル・リソースの解放 Declare Function SQLFreeHandle _ Lib "odbc32.dll" ( _ ByVal handletype As Integer, _ ByVal handle As HANDLE _ ) As Integer
'Declare Function SQLDisconnect Lib "odbc32" (hdbc As HANDLE) As Integer 'SQLDisconnect - データ・ソースからの切断 Declare Function SQLDisconnect _ Lib "odbc32.dll" ( _ ByVal hdbc As HANDLE _ ) As Integer
'SQLPrepare - ステートメントの準備 Declare Function SQLPrepare _ Lib "odbc32.dll" ( _ ByVal hstmt As HANDLE, _ ByVal stmt As String, _ ByVal stmtlen As Long _ ) As Integer
'SQLExecute - ステートメントの実行 Declare Function SQLExecute _ Lib "odbc32.dll" ( _ ByVal hstmt As Long _ ) As Integer
'Declare Function SQLNumResultCols Lib "odbc32" (hstmt As HANDLE,ColumnCountPtr As WordPtr) As Integer 'SQLNumResultCols - 結果の列数の入手 Declare Function SQLNumResultCols _ Lib "odbc32.dll" ( _ ByVal hstmt As Long, _ ByRef nCou As Integer _ ) As Integer
'SQLDescribeCol - 列の属性セットの戻し Declare Function SQLDescribeCol _ Lib "odbc32.dll" ( _ ByVal hstmt As Long, _ ByVal colno As Integer, _ ByVal colname As String, _ ByVal namelen As Integer, _ ByRef pnamelen As Integer, _ ByRef datatype As Integer, _ ByRef colsize As Long, _ ByRef pdecimal As Integer, _ ByRef pnull As Integer _ ) As Integer
'Declare Function SQLFetch Lib "odbc32" (hstmt As HANDLE) As Integer 'SQLFetch - 次の行の取り出し Declare Function SQLFetch _ Lib "odbc32.dll" ( _ ByVal hstmt As HANDLE _ ) As Integer
'Declare Function SQLFetchScroll Lib "odbc32" (hstmt As HANDLE,FetchOrientation As Integer,FetchOffset As Long) As Integer 'SQLFetchScroll - 行セットの取り出しと、バインドされたすべての列のデータの戻し Declare Function SQLFetchScroll _ Lib "odbc32" ( _ hstmt As HANDLE, _ FetchOrientation As Integer, _ FetchOffset As Long _ ) As Integer
'Declare Function SQLGetData Lib "odbc32" (hstmt As HANDLE,icol As Integer,fCType As Integer,rgbValue As BytePtr,cbValueMax As Long,pcbValue As DWordPtr) As Integer
'SQLGetData - 列からのデータの入手 Declare Function SQLGetData _ Lib "odbc32.dll" ( _ ByVal hstmt As HANDLE, _ ByVal colno As Integer, _ ByVal targettype As Integer, _ ByVal pVal As VoidPtr, _ ByVal buflen As Long, _ ByRef ind As Long _ ) As Integer
'Declare Function SQLDriverConnect Lib "odbc32" (hdbc As HANDLE,hwnd As Word,szCSIn As BytePtr,cbCSIn As Integer,szCSOut As BytePtr,cbCSMax As Integer,cbCSOut As WordPtr,fDrvrComp As Integer) As Integer
'SQLDriverConnect - データ・ソースへの接続 Declare Function SQLDriverConnect _ Lib "odbc32.dll" ( _ hdbc As HANDLE, _ hwnd As Word, _ szCSIn As BytePtr, _ cbCSIn As Integer, _ szCSOut As BytePtr, _ cbCSMax As Integer, _ cbCSOut As WordPtr, _ fDrvrComp As Integer _ ) As Integer
'SQLSetConnectOption - 接続オプションの設定 Declare Function SQLSetConnectOption _ Lib "odbc32.dll" ( _ ByVal hDBc As HANDLE, _ ByVal fOption As Integer, _ ByVal vParam As Long ) As Integer
'Declare Function SQLSetEnvAttr Lib "odbc32" (henv As HANDLE,Attribute As Long,ValuePtr As VoidPtr,StringLength As Long) As Integer 'SQLSetEnvAttr - 環境属性を設定 Declare Function SQLSetEnvAttr _ Lib "odbc32.dll" ( _ henv As HANDLE, _ Attribute As Long, _ ValuePtr As Long, _ StringLength As Long _ ) As Integer 'Matea
'SQLTransact - トランザクション管理 Declare Function SQLTransact _ Lib "odbc32.dll" ( _ ByVal hEnv As HANDLE, _ ByVal hDBc As HANDLE, _ ByVal fnType As Integer _ ) As Integer
'SQLConfigDataSource - ODBC への登録・編集・削除 Declare Function SQLConfigDataSource _ Lib "odbccp32.dll" ( _ ByVal hwndParent As Long, _ ByVal fRequest As Long, _ ByVal lpszDriver As String, _ ByVal lpszAttributes As String _ ) As Long
'****** 列をバインド ****** Declare Function SQLExecDirect Lib "odbc32" ( _ hstmt As HANDLE, _ szSqlStr As BytePtr, _ cbSqlStr As Long _ ) As Integer
'****** 列をバインド ****** Declare Function SQLBindCol Lib "odbc32.dll" ( _ ByVal hstmt As HANDLE, _ ByVal icol As Long, _ ByVal fCType As Long, _ ByRef rgbValue As Any, _ ByVal cbValueMax As Long, _ ByRef pcbValue As Long _ ) As Long
'===================================================================== ' 定義の終了 '===================================================================== [/code]
[color=red]2.コネクション部分[/color]
[code] '****************************************************************************** ' 名 称:コネクション接続クラス ' 概 要:ODBC接続にてデータベースに接続を行う '****************************************************************************** Class DBConnection henv As HANDLE '環境ハンドル hdbc As HANDLE '接続ハンドル hstmt As HANDLE 'ステートメントハンドル iConStrOut As Long sTableName As String Public '========================================================================== ' 関数名:コンストラクタ関数 ' 説 明:コンストラクタ ' 呼 出:なし ' 引き数:なし ' 戻り値:なし '========================================================================== Sub DBConnection() '変数初期化 hdbc = 0 henv = 0 hstmt = 0 ' SQLAllocHandle( SQL_HANDLE_ENV, 0 , henv ) '環境ハンドル取得 SQLSetEnvAttr ( henv, SQL_ATTR_ODBC_VERSION, SQL_OV_ODBC3, 0 ) '環境属性設定【ODBC3.0】 SQLAllocHandle( SQL_HANDLE_DBC, henv, hdbc ) '接続ハンドル取得 End Sub '========================================================================== ' 関数名:デストラクタ関数 ' 説 明:デストラクタ ' 呼 出:なし ' 引き数:なし ' 戻り値:なし '========================================================================== Sub ~DBConnection() DBCFreeHandle() 'ステートメントハンドルを解放する SQLDisconnect( hdbc ) '接続を切断する SQLFreeHandle( SQL_HANDLE_DBC, hdbc ) '接続ハンドルを解放する SQLFreeHandle( SQL_HANDLE_ENV, henv ) '環境ハンドルを解放する End Sub '========================================================================== ' 関数名:ConOpen関数 ' 説 明:データベースへ接続を行う ' 呼 出:ConOpen(psDataSource As String) ' 引き数:psDataSource As String (I/ ) ODBCデータソース ' 戻り値:接続状況 '========================================================================== Function ConOpen(psDataSource As String) Dim sConStrOut[BRWS_LEN-1] As Byte Dim ret As Integer
'データベースへ接続する ret = SQLDriverConnect( hdbc, 0, psDataSource, SQL_NTS, sConStrOut, BRWS_LEN, VarPtr(iConStrOut), SQL_DRIVER_COMPLETE_REQUIRED ) If (ret = SQL_NO_DATA_FOUND) THen ConOpen = DBCLASS_NG '返却値(NG) Else ConOpen = DBCLASS_OK '返却値(OK) End If End Function '========================================================================== ' 関数名:ConClose関数 ' 説 明:データベースを切断する ' 呼 出:ConClose() ' 引き数:なし ' 戻り値:なし '========================================================================== Sub ConClose() DBCFreeHandle() 'ステートメントハンドルを解放する SQLDisconnect(hdbc) 'データベースを切断する End Sub
'========================================================================== ' 関数名:Execute関数 ' 説 明:SQL文を実行する ' 呼 出:Execute(psSqlStr As String) ' 引き数:psSqlStr As String (I/ ) SQL文格納用 ' 戻り値:なし '========================================================================== Sub Execute(psSqlStr As String) DBCFreeHandle() 'ステートメントハンドルを解放する SQLAllocHandle( SQL_HANDLE_STMT, hdbc, hstmt ) 'ステートメントハンドルを取得する SQLPrepare( hstmt, psSqlStr, Len(psSqlStr) ) 'SQL文を設定する SQLExecute( hstmt ) 'SQL文を実行する End Sub '========================================================================== ' 関数名:BeginTransact関数 ' 説 明:AutoCommitを解除し、明示的にトランザクションを行う ' 呼 出:BeginTransact() ' 引き数:なし ' 戻り値:なし '========================================================================== Sub BeginTransact() SQLSetConnectOption( hdbc, SQL_AUTOCOMMIT, SQL_AUTOCOMMIT_OFF ) 'AutoCommitをOFFにする End Sub '========================================================================== ' 関数名:Commit関数 ' 説 明:Commitを行い、AutoCommitをONにする ' 呼 出:Commit() ' 引き数:なし ' 戻り値:なし '========================================================================== Sub Commit() SQLTransact( henv, hdbc, SQL_COMMIT ) 'トランザクションをCommitする SQLSetConnectOption( hdbc, SQL_AUTOCOMMIT, SQL_AUTOCOMMIT_ON ) 'AutoCommitをONにする End Sub '========================================================================== ' 関数名:RollBack関数 ' 説 明:RollBackを行い、AutoCommitをONにする ' 呼 出:RollBack() ' 引き数:なし ' 戻り値:なし '========================================================================== Sub RollBack() SQLTransact( henv, hdbc, SQL_ROLLBACK ) 'トランザクションをRollBackする SQLSetConnectOption( hdbc, SQL_AUTOCOMMIT, SQL_AUTOCOMMIT_ON ) 'AutoCommitをONにする End Sub '========================================================================== ' 関数名:GetEnvHandle関数 ' 説 明:接続されたコネクションの環境ハンドルを返却する ' 呼 出:GetEnvHandle() ' 引き数:なし ' 戻り値:環境ハンドル '========================================================================== Function GetEnvHandle() As HANDLE GetEnvHandle = henv End Function '========================================================================== ' 関数名:GetDbcHandle関数 ' 説 明:接続されたコネクションの接続ハンドルを返却する ' 呼 出:GetDbcHandle() ' 引き数:なし ' 戻り値:接続ハンドル '========================================================================== Function GetDbcHandle() As HANDLE GetDbcHandle = hdbc End Function '--------- おまけ ------------------------------------------------------------- '========================================================================== ' 関数名:Compact関数 ' 説 明:AccessMDBファイルの最適化を行う ' 呼 出:Compact(psFilePath As String) ' 引き数:psFilePath As String (I/ ) MDBファイルパス ' 戻り値:なし '========================================================================== ' Function Compact(psFilePath As String) As Integer ' ' 'AccessMDBの最適化を行う ' SQLConfigDataSource( _ ' 0, _ ' ODBC_CONFIG_DSN, _ ' "Microsoft Access Driver (*.MDB)", _ ' "DSN=MS Access Database;COMPACT_DB=" & psFilePath & " " & psFilePath _ ' ) ' ' End Function '========================================================================== ' 内部関数 '========================================================================== Private '------------------------------------------------------ ' ハンドルの開放 '------------------------------------------------------ Sub DBCFreeHandle() If hstmt = 0 Then Exit Sub 'ステートメントハンドルが設定されているか? SQLFreeHandle( SQL_HANDLE_STMT, hstmt ) 'ステートメントハンドルを解放 hstmt = 0 'ステートメントハンドルを初期化 End Sub End Class '****************************************************************************** '****************************************************************************** [/code]
[color=red]3.レコードセット部分[/color]
[code] '****************************************************************************** ' 名 称:レコードセットクラス ' 概 要:テーブルのレコードセットを取得する(疑似?) '****************************************************************************** ' ●印の場所を、手書きで作成する事で、データの呼び出し性能が数倍高速化します ' ただし、DBのテーブル定義順を知っている必要があります。 ' (現在:この定義を自動生成するツールを作成予定です) '****************************************************************************** '※変数名に!が使用できる用なので、VB風にコーディングしました!!! Dim DbRs!JUMINCD As DWord '● Dim DbRs!KARA As Word '● Dim DbRs!MADE As Word '● Dim DbRs!SEX As Word '● Dim DbRs!FAMILY As DWord '● Dim DbRs!KANA[60+1] As Byte '● Dim DbRs!NAME[80+1] As Byte '● Dim DbRs!YUBIN As DWord '● Dim DbRs!ADR1[80+1] As Byte '● Dim DbRs!ADR2[60+1] As Byte '● Dim DbRs!TEL[29] As Byte '● Dim DbRs!BIRTHDAY As DWord '● Dim xTest As Long '● '****************************************************************************** Class DBRecordSet henv As HANDLE '環境ハンドル hdbc As HANDLE '接続ハンドル hstmt As HANDLE 'ステートメントハンドル iEof As Integer Public '========================================================================== ' 関数名:コンストラクタ関数 ' 説 明:コンストラクタ ' 呼 出:なし ' 引き数:なし ' 戻り値:なし '========================================================================== Sub DBRecordSet() '変数初期化 hdbc = 0 henv = 0 hstmt = 0 iEof = 0 End Sub '========================================================================== ' 関数名:デストラクタ関数 ' 説 明:デストラクタ ' 呼 出:なし ' 引き数:なし ' 戻り値:なし '========================================================================== Sub ~DBRecordSet() DBRFreeHandle() 'ステートメントハンドルを解放する End Sub '========================================================================== ' 関数名:RecOpen関数 ' 説 明:SQLをオープンする ' 呼 出:RecOpen(psSqlStr As String, pDbCn As *DBConnection) ' 引き数:psSqlStr As String (I/ ) SQL文格納用 ' pDbCn As *DBConnection (I/ ) コネクション接続クラス ' 戻り値:なし '========================================================================== Sub RecOpen(psSqlStr As String, pDbCn As *DBConnection) Dim ret As Integer
henv = pDbCn->GetEnvHandle() '環境ハンドルを取得する hdbc = pDbCn->GetDbcHandle() '接続ハンドルを取得する DBRFreeHandle() 'ステートメントハンドルを解放する ' SQLAllocHandle( SQL_HANDLE_STMT, hdbc, hstmt ) 'ステートメントハンドルを取得する SQLExecDirect( hstmt, psSqlStr, SQL_NTS ) 'SQL文を実行する '--------------------------------------------- ' データ受取領域の設定 '--------------------------------------------- '(説明) SQLBindCol( ハンドル, データの順番, データ型 , 受取データ ,列バイト, 戻バイト)'● SQLBindCol( hstmt, 1 As Integer, SQL_C_LONG , DbRs!JUMINCD , 0, xTest )'● SQLBindCol( hstmt, 2 As Integer, SQL_C_SHORT , DbRs!KARA , 0, xTest )'● SQLBindCol( hstmt, 3 As Integer, SQL_C_SHORT , DbRs!MADE , 0, xTest )'● SQLBindCol( hstmt, 4 As Integer, SQL_C_SHORT , DbRs!SEX , 0, xTest )'● SQLBindCol( hstmt, 5 As Integer, SQL_C_LONG , DbRs!FAMILY , 0, xTest )'● SQLBindCol( hstmt, 6 As Integer, SQL_C_CHAR , DbRs!KANA , 61, xTest )'● SQLBindCol( hstmt, 7 As Integer, SQL_C_CHAR , DbRs!NAME , 81, xTest )'● SQLBindCol( hstmt, 8 As Integer, SQL_C_LONG , DbRs!YUBIN , 0, xTest )'● SQLBindCol( hstmt, 9 As Integer, SQL_C_CHAR , DbRs!ADR1 , 81, xTest )'● SQLBindCol( hstmt,10 As Integer, SQL_C_CHAR , DbRs!ADR2 , 61, xTest )'● SQLBindCol( hstmt,11 As Integer, SQL_C_CHAR , DbRs!TEL , 29, xTest )'● SQLBindCol( hstmt,12 As Integer, SQL_C_LONG , DbRs!BIRTHDAY, 0, xTest )'● ' MoveFirst() End Sub '========================================================================== ' 関数名:RecClose関数 ' 説 明:SQLをクローズする ' 呼 出:RecClose() ' 引き数:なし ' 戻り値:なし '========================================================================== Sub RecClose() DBRFreeHandle() 'ステートメントハンドルを解放する End Sub '========================================================================== ' 関数名:MoveFirst関数 ' 説 明:先頭行へカーソルを移動する ' 呼 出:MoveFirst() ' 引き数:なし ' 戻り値:なし '========================================================================== Sub MoveFirst() SQLFetchScroll( hstmt, SQL_FETCH_FIRST, 0 ) '先頭行へ移動する SQLFetch( hstmt ) End Sub '========================================================================== ' 関数名:MoveNext関数 ' 説 明:次行へカーソルを移動する ' 呼 出:MoveNext() ' 引き数:なし ' 戻り値:なし '========================================================================== Sub MoveNext() Dim ret As Integer ret = SQLFetchScroll( hstmt, SQL_FETCH_NEXT, 0 ) '次行へ移動する iEof = (ret = SQL_NO_DATA) As Integer End Sub '========================================================================== ' 関数名:Eof関数 ' 説 明:EOFの状態を返却する ' 呼 出:Eof() ' 引き数:なし ' 戻り値: 0:正常 ' :-1:EOF ( 1 から -1 へ変更 ) '========================================================================== Function Eof() As Integer Eof = iEof End Function '========================================================================== ' 内部関数 '========================================================================== Private '------------------------------------------------------ ' ハンドルの開放 '------------------------------------------------------ Sub DBRFreeHandle() If hstmt Then 'ステートメントハンドルが設定されているか判定する SQLFreeHandle( SQL_HANDLE_STMT, hstmt ) 'ステートメントハンドルを解放する hstmt = 0 End If End Sub End Class '****************************************************************************** ' '****************************************************************************** [/code]
|
|
|
投稿記事 |
Posted: 2005年9月21日(水) 11:36 |
|
|
|
|
|
ループ中にテーブルを2つオープンする場合などに使いづらかったのでDB接続とテーブルオープンのクラスを分けました。
相変わらずテストは不十分です。
コード:
'=====================================================================
' 名 称:データベースアクセスクラス
' 概 要:ODBC接続にてデータベースにアクセスする
'=====================================================================
'== 定数 =============================================================
Const DBCLASS_OK = 0 'クラス正常終了
Const DBCLASS_NG = -1 'クラス異常終了
'=====================================================================
'== API用定数 ========================================================
'データソース用定数
Const ODBC_ADD_DSN = 1 'ユーザーデータソースの追加
Const ODBC_CONFIG_DSN = 2 'ユーザーデータソースの編集
Const ODBC_REMOVE_DSN = 3 'ユーザーデータソースの削除
Const ODBC_ADD_SYS_DSN = 4 'システム データ ソースを追加
Const ODBC_CONFIG_SYS_DSN = 5 'システム データ ソースを設定 (編集)
Const ODBC_REMOVE_SYS_DSN = 6 'システム データ ソースを削除
'トランザクション用定数
Const SQL_COMMIT = 0 'トランザクション-コミット
Const SQL_ROLLBACK = 1 'トランザクション-ロールバック
'返却値用定数
Const SQL_NTS = -3
Const SQL_SUCCESS = 0 'SQL結果-正常終了
Const SQL_SUCCESS_WITH_INFO = 1 'SQL結果-正常終了(警告あり)
Const SQL_ERROR = -1 'SQL結果-異常終了
Const SQL_INVALID_HANDLE = -2 'SQL結果-不正ハンドル返却
Const SQL_NO_DATA_FOUND = 100 'SQL結果-データなし
'SQLAllocHandle、SQLFreeHandle用定数
Const SQL_NULL_HANDLE = 0 'SQL_HANDLE_ENV時パラメータ
Const SQL_HANDLE_ENV = 1 '環境ハンドル
Const SQL_HANDLE_DBC = 2 '接続ハンドル
Const SQL_HANDLE_STMT = 3 'ステートメントハンドル
Const SQL_HANDLE_DESC = 4
'SQLSetConnectOption用定数
Const SQL_AUTOCOMMIT = 102 'AutoCommitオプション
Const SQL_AUTOCOMMIT_OFF = 0 'AutoCommitOff
Const SQL_AUTOCOMMIT_ON = 1 'AutoCommitOn
'Fetch用定数
Const SQL_FETCH_NEXT = 1
Const SQL_FETCH_FIRST = 2
Const SQL_FETCH_LAST = 3
Const SQL_FETCH_PRIOR = 4
Const SQL_FETCH_ABSOLUTE = 5
Const SQL_FETCH_RELATIVE = 6
'環境定数
Const SQL_ATTR_CURSOR_TYPE = 6
Const SQL_ATTR_ROW_NUMBER = 14
Const SQL_ATTR_ODBC_VERSION = 200
Const SQL_OV_ODBC3 = 3
'行操作・結果定数
Const SQL_ROW_SUCCESS = 0
Const SQL_ROW_DELETED = 1
Const SQL_ROW_UPDATED = 2
Const SQL_ROW_NOROW = 3
Const SQL_ROW_ADDED = 4
Const SQL_ROW_ERROR = 5
Const SQL_ROW_SUCCESS_WITH_INFO = 6
Const SQL_ROW_PROCEED = 0
Const SQL_ROW_IGNORE = 1
Const SQL_NO_DATA = 100
'サイズ用定数
Const BRWS_LEN = 1000
Const SQL_LEN = 1000
'接続用定数
Const SQL_DRIVER_COMPLETE_REQUIRED = 3
'型宣言用定数
Const SQL_UNKNOWN_TYPE = 0
Const SQL_CHAR = 1
Const SQL_NUMERIC = 2
Const SQL_DECIMAL = 3
Const SQL_INTEGER = 4
Const SQL_SMALLINT = 5
Const SQL_FLOAT = 6
Const SQL_REAL = 7
Const SQL_DOUBLE = 8
Const SQL_DATETIME = 9
Const SQL_VARCHAR = 12
Const SQL_TYPE_DATE = 91
Const SQL_TYPE_TIMESTAMP = 93
Const SQL_INTERVAL = 10
Const SQL_TIME = 10
Const SQL_TIMESTAMP = 11
Const SQL_LONGVARCHAR = -1
Const SQL_BINARY = -2
Const SQL_VARBINARY = -3
Const SQL_LONGVARBINARY = -4
Const SQL_BIGINT = -5
Const SQL_TINYINT = -6
Const SQL_BIT = -7
Const SQL_GUID = -11
Const SQL_C_BINARY = SQL_BINARY
Const SQL_C_BIT = SQL_BIT
Const SQL_C_CHAR = SQL_CHAR
Const SQL_C_DOUBLE = SQL_DOUBLE
Const SQL_C_FLOAT = SQL_REAL
Const SQL_C_LONG = SQL_INTEGER
Const SQL_C_SHORT = SQL_SMALLINT
Const SQL_C_TYPE_DATE = SQL_TYPE_DATE
Const SQL_C_TYPE_TIME = SQL_TYPE_DATE
Const SQL_C_TYPE_TIMESTAMP = SQL_TYPE_TIMESTAMP
Const SQL_C_TINYINT = SQL_TINYINT
'=====================================================================
'SQLAllocHandle - ハンドルの割り当て
Declare Function SQLAllocHandle _
Lib "odbc32.dll" ( _
ByVal handletype As Integer, _
ByVal inputhandle As HANDLE, _
ByRef outputhandle As HANDLE _
) As Integer
'SQLFreeHandle - ハンドル・リソースの解放
Declare Function SQLFreeHandle _
Lib "odbc32.dll" ( _
ByVal handletype As Integer, _
ByVal handle As HANDLE _
) As Integer
'SQLDisconnect - データ・ソースからの切断
Declare Function SQLDisconnect _
Lib "odbc32.dll" ( _
ByVal hdbc As Long _
) As Integer
'SQLPrepare - ステートメントの準備
Declare Function SQLPrepare _
Lib "odbc32.dll" ( _
ByVal hstmt As HANDLE, _
ByVal stmt As String, _
ByVal stmtlen As Long _
) As Integer
'SQLExecute - ステートメントの実行
Declare Function SQLExecute _
Lib "odbc32.dll" ( _
ByVal hstmt As Long _
) As Integer
'SQLNumResultCols - 結果の列数の入手
Declare Function SQLNumResultCols _
Lib "odbc32.dll" ( _
ByVal hstmt As Long, _
ByRef nCou As Integer _
) As Integer
'SQLDescribeCol - 列の属性セットの戻し
Declare Function SQLDescribeCol _
Lib "odbc32.dll" ( _
ByVal hstmt As Long, _
ByVal colno As Integer, _
ByVal colname As String, _
ByVal namelen As Integer, _
ByRef pnamelen As Integer, _
ByRef datatype As Integer, _
ByRef colsize As Long, _
ByRef pdecimal As Integer, _
ByRef pnull As Integer _
) As Integer
'SQLFetch - 次の行の取り出し
Declare Function SQLFetch _
Lib "odbc32.dll" ( _
ByVal hstmt As Long _
) As Integer
'SQLFetchScroll - 行セットの取り出しと、バインドされたすべての列のデータの戻し
Declare Function SQLFetchScroll _
Lib "odbc32" ( _
hstmt As HANDLE, _
FetchOrientation As Integer, _
FetchOffset As Long _
) As Integer
'SQLGetData - 列からのデータの入手
Declare Function SQLGetData _
Lib "odbc32.dll" ( _
ByVal hstmt As Long, _
ByVal colno As Integer, _
ByVal targettype As Integer, _
ByVal pVal As Any, _
ByVal buflen As Long, _
ByRef ind As Long _
) As Integer
'SQLDriverConnect - データ・ソースへの接続
Declare Function SQLDriverConnect _
Lib "odbc32.dll" ( _
hdbc As HANDLE, _
hwnd As Word, _
szCSIn As BytePtr, _
cbCSIn As Integer, _
szCSOut As BytePtr, _
cbCSMax As Integer, _
cbCSOut As WordPtr, _
fDrvrComp As Integer _
) As Integer
'SQLSetConnectOption - 接続オプションの設定
Declare Function SQLSetConnectOption _
Lib "odbc32.dll" ( _
ByVal hDBc As HANDLE, _
ByVal fOption As Integer, _
ByVal vParam As Long
) As Integer
'SQLSetEnvAttr - 環境属性を設定
Declare Function SQLSetEnvAttr _
Lib "odbc32.dll" ( _
henv As HANDLE, _
Attribute As Long, _
ValuePtr As VoidPtr, _
StringLength As Long _
) As Integer
'SQLTransact - トランザクション管理
Declare Function SQLTransact _
Lib "odbc32.dll" ( _
ByVal hEnv As HANDLE, _
ByVal hDBc As HANDLE, _
ByVal fnType As Integer _
) As Integer
'SQLConfigDataSource - ODBC への登録・編集・削除
Declare Function SQLConfigDataSource _
Lib "odbccp32.dll" ( _
ByVal hwndParent As Long, _
ByVal fRequest As Long, _
ByVal lpszDriver As String, _
ByVal lpszAttributes As String _
) As Long
'=====================================================================
' 名 称:コネクション接続クラス
' 概 要:ODBC接続にてデータベースに接続を行う
'=====================================================================
Class DBConnection
henv As HANDLE '環境ハンドル
hdbc As HANDLE '接続ハンドル
hstmt As HANDLE 'ステートメントハンドル
iConStrOut As Long
sTableName As String
Public
'==========================================================================
' 関数名:コンストラクタ関数
' 説 明:コンストラクタ
' 呼 出:なし
' 引き数:なし
' 戻り値:なし
'==========================================================================
Sub DBConnection()
'変数初期化
hdbc = 0
henv = 0
hstmt = 0
'SQL接続用の環境ハンドルを取得する
SQLAllocHandle(SQL_HANDLE_ENV, 0, henv)
'環境属性をODBC3.0に設定する
SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, SQL_OV_ODBC3, 0)
'接続ハンドルを取得する
SQLAllocHandle(SQL_HANDLE_DBC, henv, hdbc)
End Sub
'==========================================================================
' 関数名:デストラクタ関数
' 説 明:デストラクタ
' 呼 出:なし
' 引き数:なし
' 戻り値:なし
'==========================================================================
Sub ~DBConnection()
'ステートメントハンドルが設定されているか判定する
If hstmt Then
'ステートメントハンドルを解放する
SQLFreeHandle(
SQL_HANDLE_STMT, _
hstmt _
)
'接続を切断する
SQLDisconnect(hdbc)
End If
'接続ハンドルを解放する
SQLFreeHandle( _
SQL_HANDLE_DBC, _
hdbc _
)
'環境ハンドルを解放する
SQLFreeHandle( _
SQL_HANDLE_ENV, _
henv _
)
End Sub
'==========================================================================
' 関数名:ConOpen関数
' 説 明:データベースへ接続を行う
' 呼 出:ConOpen(psDataSource As String)
' 引き数:psDataSource As String (I/ ) ODBCデータソース
' 戻り値:なし
'==========================================================================
Function ConOpen(psDataSource As String) As Integer
Dim sConStrOut[BRWS_LEN-1] As Byte
Dim ret As Integer
'返却値初期化
ConOpen = DBCLASS_OK
'データベースへ接続する
ret = SQLDriverConnect( _
hdbc, _
0, _
psDataSource, _
-3, _
sConStrOut, _
BRWS_LEN, _
VarPtr(iConStrOut), _
SQL_DRIVER_COMPLETE_REQUIRED _
)
If (ret = SQL_NO_DATA_FOUND) THen
'返却値を設定する
ConOpen = DBCLASS_NG
End If
End Function
'==========================================================================
' 関数名:ConClose関数
' 説 明:データベースを切断する
' 呼 出:ConClose()
' 引き数:なし
' 戻り値:なし
'==========================================================================
Function ConClose() As Integer
'ステートメントハンドルが設定されているか確認する
If hstmt Then
'ステートメントハンドルを解放する
SQLFreeHandle( _
SQL_HANDLE_STMT, _
hstmt _
)
'ステートメントハンドルを初期化する
hstmt = 0
End If
'データベースを切断する
SQLDisconnect(hdbc)
End Function
'==========================================================================
' 関数名:Execute関数
' 説 明:SQL文を実行する
' 呼 出:Execute(psSqlStr As String)
' 引き数:psSqlStr As String (I/ ) SQL文格納用
' 戻り値:なし
'==========================================================================
Function Execute(psSqlStr As String) As Integer
'ステートメントハンドルが取得されているか確認する
If hstmt Then
'ステートメントハンドルを解放する
SQLFreeHandle( _
SQL_HANDLE_STMT, _
hstmt _
)
'ステートメントハンドルを初期化する
hstmt = 0
End If
'ステートメントハンドルを取得する
SQLAllocHandle( _
SQL_HANDLE_STMT, _
hdbc, _
hstmt _
)
'SQL文を設定する
SQLPrepare( _
hstmt, _
psSqlStr, _
Len(psSqlStr) _
)
'SQL文を実行する
SQLExecute(hstmt)
End Function
'==========================================================================
' 関数名:BeginTransact関数
' 説 明:AutoCommitを解除し、明示的にトランザクションを行う
' 呼 出:BeginTransact()
' 引き数:なし
' 戻り値:なし
'==========================================================================
Function BeginTransact() As Integer
'AutoCommitをOFFにする
SQLSetConnectOption( _
hdbc, _
SQL_AUTOCOMMIT, _
SQL_AUTOCOMMIT_OFF _
)
End Function
'==========================================================================
' 関数名:Commit関数
' 説 明:Commitを行い、AutoCommitをONにする
' 呼 出:Commit()
' 引き数:なし
' 戻り値:なし
'==========================================================================
Function Commit() As Integer
'トランザクションをCommitする
SQLTransact( _
henv, _
hdbc, _
SQL_COMMIT _
)
'AutoCommitをONにする
SQLSetConnectOption( _
hdbc, _
SQL_AUTOCOMMIT, _
SQL_AUTOCOMMIT_ON _
)
End Function
'==========================================================================
' 関数名:RollBack関数
' 説 明:RollBackを行い、AutoCommitをONにする
' 呼 出:RollBack()
' 引き数:なし
' 戻り値:なし
'==========================================================================
Function RollBack() As Integer
'トランザクションをCommitする
SQLTransact( _
henv, _
hdbc, _
SQL_ROLLBACK _
)
'AutoCommitをONにする
SQLSetConnectOption( _
hdbc, _
SQL_AUTOCOMMIT, _
SQL_AUTOCOMMIT_ON _
)
End Function
'==========================================================================
' 関数名:GetEnvHandle関数
' 説 明:接続されたコネクションの環境ハンドルを返却する
' 呼 出:GetEnvHandle()
' 引き数:なし
' 戻り値:環境ハンドル
'==========================================================================
Function GetEnvHandle() As HANDLE
GetEnvHandle = henv
End Function
'==========================================================================
' 関数名:GetDbcHandle関数
' 説 明:接続されたコネクションの接続ハンドルを返却する
' 呼 出:GetDbcHandle()
' 引き数:なし
' 戻り値:接続ハンドル
'==========================================================================
Function GetDbcHandle() As HANDLE
GetDbcHandle = hdbc
End Function
'--------- おまけ -------------------------------------------------------------
'==========================================================================
' 関数名:Compact関数
' 説 明:AccessMDBファイルの最適化を行う
' 呼 出:Compact(psFilePath As String)
' 引き数:psFilePath As String (I/ ) MDBファイルパス
' 戻り値:なし
'==========================================================================
Function Compact(psFilePath As String) As Integer
'AccessMDBの最適化を行う
SQLConfigDataSource( _
0, _
ODBC_CONFIG_DSN, _
"Microsoft Access Driver (*.MDB)", _
"DSN=MS Access Database;COMPACT_DB=" & psFilePath & " " & psFilePath _
)
End Function
'-----------------------------------------------------------------------------
End Class
'=====================================================================
' 名 称:レコードセットクラス
' 概 要:テーブルのレコードセットを取得する(疑似?)
'=====================================================================
Class DBRecordSet
henv As HANDLE '環境ハンドル
hdbc As HANDLE '接続ハンドル
hstmt As HANDLE 'ステートメントハンドル
iEof As Integer
Public
'==========================================================================
' 関数名:コンストラクタ関数
' 説 明:コンストラクタ
' 呼 出:なし
' 引き数:なし
' 戻り値:なし
'==========================================================================
Sub DBRecordSet()
'変数初期化
hdbc = 0
henv = 0
hstmt = 0
iEof = 0
End Sub
'==========================================================================
' 関数名:デストラクタ関数
' 説 明:デストラクタ
' 呼 出:なし
' 引き数:なし
' 戻り値:なし
'==========================================================================
Sub ~DBRecordSet()
'ステートメントハンドルが設定されているか判定する
If hstmt Then
'ステートメントハンドルを解放する
SQLFreeHandle(
SQL_HANDLE_STMT, _
hstmt _
)
hstmt = 0
End If
End Sub
'==========================================================================
' 関数名:RecOpen関数
' 説 明:SQLをオープンする
' 呼 出:RecOpen(psSqlStr As String, pDbCn As *DBConnection)
' 引き数:psSqlStr As String (I/ ) SQL文格納用
' pDbCn As *DBConnection (I/ ) コネクション接続クラス
' 戻り値:なし
'==========================================================================
Function RecOpen(psSqlStr As String, pDbCn As *DBConnection) As Integer
'環境ハンドルを取得する
henv = pDbCn->GetEnvHandle()
'接続ハンドルを取得する
hdbc = pDbCn->GetDbcHandle()
'ステートメントハンドルが取得されているか確認する
If hstmt Then
'ステートメントハンドルを解放する
SQLFreeHandle( _
SQL_HANDLE_STMT, _
hstmt _
)
'ステートメントハンドルを初期化する
hstmt = 0
End If
'ステートメントハンドルを取得する
SQLAllocHandle( _
SQL_HANDLE_STMT, _
hdbc, _
hstmt _
)
'SQL文を設定する
SQLPrepare( _
hstmt, _
psSqlStr, _
Len(psSqlStr) _
)
'SQL文を実行する
SQLExecute(hstmt)
MoveFirst()
iEof = 0
End Function
'==========================================================================
' 関数名:RecClose関数
' 説 明:SQLをクローズする
' 呼 出:RecClose()
' 引き数:なし
' 戻り値:なし
'==========================================================================
Function RecClose() As Integer
'
'SQLが実行されている場合に処理を行う
IF hstmt Then
'ステートメントハンドル解放
SQLFreeHandle( _
SQL_HANDLE_STMT, _
hstmt _
)
hstmt = 0
End If
End Function
'==========================================================================
' 関数名:MoveFirst関数
' 説 明:先頭行へカーソルを移動する
' 呼 出:MoveFirst()
' 引き数:なし
' 戻り値:なし
'==========================================================================
Function MoveFirst() As Integer
'先頭行へ移動する
SQLFetchScroll( _
hstmt, _
SQL_FETCH_FIRST, _
0 _
)
SQLFetch(hstmt)
End Function
'==========================================================================
' 関数名:MoveNext関数
' 説 明:次行へカーソルを移動する
' 呼 出:MoveNext()
' 引き数:なし
' 戻り値:なし
'==========================================================================
Function MoveNext() As Integer
Dim ret As Integer
'次行へ移動する
ret = SQLFetchScroll( _
hstmt, _
SQL_FETCH_NEXT, _
0 _
)
If (ret = SQL_NO_DATA) Then
iEof = 1
Else
iEof = 0
End If
End Function
'==========================================================================
' 関数名:GetValueString関数
' 説 明:指定されたフィールドの値を取得する
' 呼 出:GetValueString(psFiledName As String)
' 引き数:psFiledName As String (I/ ) フィールド名
' 戻り値:なし
'==========================================================================
Function GetValueString(psFiledName As String) As String
Dim lColCnt As Integer
Dim i As Integer
Dim sFiledName As String
Dim Ret As Long
Dim pNameLen As Integer
Dim iDataType As Integer
Dim iColSize As Long
Dim iDecimal As Integer
Dim ipNull As Integer
Dim lngRetByteSize As Long
'SQLが実行されている場合に処理を行う
IF hstmt Then
'カラム数を取得する
SQLNumResultCols( _
hstmt, _
lColCnt _
)
'String領域確保
sFiledName = ZeroString(SQL_LEN)
For i = 1 To lColCnt
'フィールド名を取得する
SQLDescribeCol( _
hstmt, _
i, _
StrPtr(sFiledName), _
SQL_LEN, _
pNameLen, _
iDataType, _
iColSize, _
iDecimal, _
ipNull _
)
'対象のフィールドか判定する
If (psFiledName = sFiledName) Then
'対象のフィールドの場合、値を取得する
Select Case iDataType
Case SQL_VARCHAR
GetValueString = ZeroString(iColSize)
'SQLの値を取得する
SQLGetData( _
hstmt, _
i, _
SQL_CHAR, _
StrPtr(GetValueString),
iColSize, _
lngRetByteSize _
)
Case Else
End Select
End If
Next i
End If
End Function
'==========================================================================
' 関数名:GetValueDouble関数
' 説 明:指定されたフィールドの値を取得する
' 呼 出:GetValueDouble(psFiledName As String)
' 引き数:psFiledName As String (I/ ) フィールド名
' 戻り値:なし
'==========================================================================
Function GetValueDouble(psFiledName As String) As Double
Dim lColCnt As Integer
Dim i As Integer
Dim sFiledName As String
Dim Ret As Long
Dim pNameLen As Integer
Dim iDataType As Integer
Dim iColSize As Long
Dim iDecimal As Integer
Dim ipNull As Integer
Dim lngRetByteSize As Long
'SQLが実行されている場合に処理を行う
IF hstmt Then
'カラム数を取得する
SQLNumResultCols( _
hstmt, _
lColCnt _
)
'String領域確保
sFiledName = ZeroString(SQL_LEN)
For i = 1 To lColCnt
'フィールド名を取得する
SQLDescribeCol( _
hstmt, _
i, _
StrPtr(sFiledName), _
SQL_LEN, _
pNameLen, _
iDataType, _
iColSize, _
iDecimal, _
ipNull _
)
'対象のフィールドか判定する
If (psFiledName = sFiledName) Then
'対象のフィールドの場合、値を取得する
Select Case iDataType
Case SQL_INTEGER, SQL_SMALLINT, SQL_FLOAT, SQL_REAL, SQL_DOUBLE
SQLGetData( _
hstmt, _
i, _
SQL_DOUBLE, _
VarPtr(GetValueDouble), _
0, _
lngRetByteSize _
)
Case Else
End Select
End If
Next i
End If
End Function
'==========================================================================
' 関数名:Eof関数
' 説 明:EOFの状態を返却する
' 呼 出:Eof()
' 引き数:なし
' 戻り値: 0:正常
' : 1:EOF
'==========================================================================
Function Eof() As Integer
Eof = iEof
End Function
End Class
以下、呼出のサンプルです。
「tbl_test1」の「test1code」と「tbl_test2」の「test1code」がリンクするものとします。
mdb名:test.mdb
テーブル名:tbl_test1
フィールド1:test1code int
テーブル名:tbl_test2
フィールド1:test1code int
フィールド2:test2code int
フィールド3:test2char char(10)
コード:
Dim DbCn As *DBConnection
Dim DbRs1 As *DBRecordSet
Dim DbRs2 As *DBRecordSet
Dim lngtest1code As long
DIm lngtest2code As long
Dim strtest2char As string
'DBクラス初期化
DbCn = New DBConnection
DbRs1 = New DBRecordSet
DbRs2 = New DBRecordSet
'mdbへ接続する
DbCn->ConOpen("DRIVER=Microsoft Access Driver(*.mdb);UID=;PWD=;DBQ=D:\test.mdb")
'tbl_test1をオープンする
DbRs1->RecOpen("SELECT * FROM tbl_test1", DbCn)
While (DbRs1->Eof() = 0)
lngtest1code = DbRs1->GetValueDouble("test1code")
'test1codeを条件にtbl_test2をオープンする
DbRs2->RecOpen("SELECT test2code, test2char FROM tbl_test2 WHERE test1code = " & Str$(lngtest1code), DbCn)
If (DbRs2->Eof() = 0) Then
lngtest2code = DbRs2->GetValueDouble("test2code")
strtest2char = DbRs2->GetValueString("test2char")
End If
'tbl_test2をクローズする
DbRs2->RecClose()
'tbl_test1の次レコードを検索
DbRs1->MoveNext()
Wend
'tbl_test1をクローズする
DbRs1->RecClose()
'mdbから切断する
DbCn->ConClose()
'クラス解放
Delete DbRs1
Delete DbRs2
ループ中にテーブルを2つオープンする場合などに使いづらかったのでDB接続とテーブルオープンのクラスを分けました。
相変わらずテストは不十分です。 [code] '===================================================================== ' 名 称:データベースアクセスクラス ' 概 要:ODBC接続にてデータベースにアクセスする '=====================================================================
'== 定数 ============================================================= Const DBCLASS_OK = 0 'クラス正常終了 Const DBCLASS_NG = -1 'クラス異常終了
'=====================================================================
'== API用定数 ======================================================== 'データソース用定数 Const ODBC_ADD_DSN = 1 'ユーザーデータソースの追加 Const ODBC_CONFIG_DSN = 2 'ユーザーデータソースの編集 Const ODBC_REMOVE_DSN = 3 'ユーザーデータソースの削除 Const ODBC_ADD_SYS_DSN = 4 'システム データ ソースを追加 Const ODBC_CONFIG_SYS_DSN = 5 'システム データ ソースを設定 (編集) Const ODBC_REMOVE_SYS_DSN = 6 'システム データ ソースを削除
'トランザクション用定数 Const SQL_COMMIT = 0 'トランザクション-コミット Const SQL_ROLLBACK = 1 'トランザクション-ロールバック
'返却値用定数 Const SQL_NTS = -3 Const SQL_SUCCESS = 0 'SQL結果-正常終了 Const SQL_SUCCESS_WITH_INFO = 1 'SQL結果-正常終了(警告あり) Const SQL_ERROR = -1 'SQL結果-異常終了 Const SQL_INVALID_HANDLE = -2 'SQL結果-不正ハンドル返却 Const SQL_NO_DATA_FOUND = 100 'SQL結果-データなし
'SQLAllocHandle、SQLFreeHandle用定数 Const SQL_NULL_HANDLE = 0 'SQL_HANDLE_ENV時パラメータ Const SQL_HANDLE_ENV = 1 '環境ハンドル Const SQL_HANDLE_DBC = 2 '接続ハンドル Const SQL_HANDLE_STMT = 3 'ステートメントハンドル Const SQL_HANDLE_DESC = 4
'SQLSetConnectOption用定数 Const SQL_AUTOCOMMIT = 102 'AutoCommitオプション Const SQL_AUTOCOMMIT_OFF = 0 'AutoCommitOff Const SQL_AUTOCOMMIT_ON = 1 'AutoCommitOn
'Fetch用定数 Const SQL_FETCH_NEXT = 1 Const SQL_FETCH_FIRST = 2 Const SQL_FETCH_LAST = 3 Const SQL_FETCH_PRIOR = 4 Const SQL_FETCH_ABSOLUTE = 5 Const SQL_FETCH_RELATIVE = 6
'環境定数 Const SQL_ATTR_CURSOR_TYPE = 6 Const SQL_ATTR_ROW_NUMBER = 14 Const SQL_ATTR_ODBC_VERSION = 200 Const SQL_OV_ODBC3 = 3
'行操作・結果定数 Const SQL_ROW_SUCCESS = 0 Const SQL_ROW_DELETED = 1 Const SQL_ROW_UPDATED = 2 Const SQL_ROW_NOROW = 3 Const SQL_ROW_ADDED = 4 Const SQL_ROW_ERROR = 5 Const SQL_ROW_SUCCESS_WITH_INFO = 6 Const SQL_ROW_PROCEED = 0 Const SQL_ROW_IGNORE = 1 Const SQL_NO_DATA = 100
'サイズ用定数 Const BRWS_LEN = 1000 Const SQL_LEN = 1000
'接続用定数 Const SQL_DRIVER_COMPLETE_REQUIRED = 3
'型宣言用定数 Const SQL_UNKNOWN_TYPE = 0 Const SQL_CHAR = 1 Const SQL_NUMERIC = 2 Const SQL_DECIMAL = 3 Const SQL_INTEGER = 4 Const SQL_SMALLINT = 5 Const SQL_FLOAT = 6 Const SQL_REAL = 7 Const SQL_DOUBLE = 8 Const SQL_DATETIME = 9 Const SQL_VARCHAR = 12 Const SQL_TYPE_DATE = 91 Const SQL_TYPE_TIMESTAMP = 93 Const SQL_INTERVAL = 10 Const SQL_TIME = 10 Const SQL_TIMESTAMP = 11 Const SQL_LONGVARCHAR = -1 Const SQL_BINARY = -2 Const SQL_VARBINARY = -3 Const SQL_LONGVARBINARY = -4 Const SQL_BIGINT = -5 Const SQL_TINYINT = -6 Const SQL_BIT = -7 Const SQL_GUID = -11
Const SQL_C_BINARY = SQL_BINARY Const SQL_C_BIT = SQL_BIT Const SQL_C_CHAR = SQL_CHAR Const SQL_C_DOUBLE = SQL_DOUBLE Const SQL_C_FLOAT = SQL_REAL Const SQL_C_LONG = SQL_INTEGER Const SQL_C_SHORT = SQL_SMALLINT Const SQL_C_TYPE_DATE = SQL_TYPE_DATE Const SQL_C_TYPE_TIME = SQL_TYPE_DATE Const SQL_C_TYPE_TIMESTAMP = SQL_TYPE_TIMESTAMP Const SQL_C_TINYINT = SQL_TINYINT '=====================================================================
'SQLAllocHandle - ハンドルの割り当て Declare Function SQLAllocHandle _ Lib "odbc32.dll" ( _ ByVal handletype As Integer, _ ByVal inputhandle As HANDLE, _ ByRef outputhandle As HANDLE _ ) As Integer 'SQLFreeHandle - ハンドル・リソースの解放 Declare Function SQLFreeHandle _ Lib "odbc32.dll" ( _ ByVal handletype As Integer, _ ByVal handle As HANDLE _ ) As Integer
'SQLDisconnect - データ・ソースからの切断 Declare Function SQLDisconnect _ Lib "odbc32.dll" ( _ ByVal hdbc As Long _ ) As Integer
'SQLPrepare - ステートメントの準備 Declare Function SQLPrepare _ Lib "odbc32.dll" ( _ ByVal hstmt As HANDLE, _ ByVal stmt As String, _ ByVal stmtlen As Long _ ) As Integer
'SQLExecute - ステートメントの実行 Declare Function SQLExecute _ Lib "odbc32.dll" ( _ ByVal hstmt As Long _ ) As Integer
'SQLNumResultCols - 結果の列数の入手 Declare Function SQLNumResultCols _ Lib "odbc32.dll" ( _ ByVal hstmt As Long, _ ByRef nCou As Integer _ ) As Integer
'SQLDescribeCol - 列の属性セットの戻し Declare Function SQLDescribeCol _ Lib "odbc32.dll" ( _ ByVal hstmt As Long, _ ByVal colno As Integer, _ ByVal colname As String, _ ByVal namelen As Integer, _ ByRef pnamelen As Integer, _ ByRef datatype As Integer, _ ByRef colsize As Long, _ ByRef pdecimal As Integer, _ ByRef pnull As Integer _ ) As Integer
'SQLFetch - 次の行の取り出し Declare Function SQLFetch _ Lib "odbc32.dll" ( _ ByVal hstmt As Long _ ) As Integer
'SQLFetchScroll - 行セットの取り出しと、バインドされたすべての列のデータの戻し Declare Function SQLFetchScroll _ Lib "odbc32" ( _ hstmt As HANDLE, _ FetchOrientation As Integer, _ FetchOffset As Long _ ) As Integer
'SQLGetData - 列からのデータの入手 Declare Function SQLGetData _ Lib "odbc32.dll" ( _ ByVal hstmt As Long, _ ByVal colno As Integer, _ ByVal targettype As Integer, _ ByVal pVal As Any, _ ByVal buflen As Long, _ ByRef ind As Long _ ) As Integer
'SQLDriverConnect - データ・ソースへの接続 Declare Function SQLDriverConnect _ Lib "odbc32.dll" ( _ hdbc As HANDLE, _ hwnd As Word, _ szCSIn As BytePtr, _ cbCSIn As Integer, _ szCSOut As BytePtr, _ cbCSMax As Integer, _ cbCSOut As WordPtr, _ fDrvrComp As Integer _ ) As Integer
'SQLSetConnectOption - 接続オプションの設定 Declare Function SQLSetConnectOption _ Lib "odbc32.dll" ( _ ByVal hDBc As HANDLE, _ ByVal fOption As Integer, _ ByVal vParam As Long ) As Integer
'SQLSetEnvAttr - 環境属性を設定 Declare Function SQLSetEnvAttr _ Lib "odbc32.dll" ( _ henv As HANDLE, _ Attribute As Long, _ ValuePtr As VoidPtr, _ StringLength As Long _ ) As Integer
'SQLTransact - トランザクション管理 Declare Function SQLTransact _ Lib "odbc32.dll" ( _ ByVal hEnv As HANDLE, _ ByVal hDBc As HANDLE, _ ByVal fnType As Integer _ ) As Integer
'SQLConfigDataSource - ODBC への登録・編集・削除 Declare Function SQLConfigDataSource _ Lib "odbccp32.dll" ( _ ByVal hwndParent As Long, _ ByVal fRequest As Long, _ ByVal lpszDriver As String, _ ByVal lpszAttributes As String _ ) As Long
'===================================================================== ' 名 称:コネクション接続クラス ' 概 要:ODBC接続にてデータベースに接続を行う '===================================================================== Class DBConnection henv As HANDLE '環境ハンドル hdbc As HANDLE '接続ハンドル hstmt As HANDLE 'ステートメントハンドル iConStrOut As Long sTableName As String Public
'========================================================================== ' 関数名:コンストラクタ関数 ' 説 明:コンストラクタ ' 呼 出:なし ' 引き数:なし ' 戻り値:なし '========================================================================== Sub DBConnection()
'変数初期化 hdbc = 0 henv = 0 hstmt = 0
'SQL接続用の環境ハンドルを取得する SQLAllocHandle(SQL_HANDLE_ENV, 0, henv)
'環境属性をODBC3.0に設定する SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, SQL_OV_ODBC3, 0)
'接続ハンドルを取得する SQLAllocHandle(SQL_HANDLE_DBC, henv, hdbc)
End Sub
'========================================================================== ' 関数名:デストラクタ関数 ' 説 明:デストラクタ ' 呼 出:なし ' 引き数:なし ' 戻り値:なし '========================================================================== Sub ~DBConnection()
'ステートメントハンドルが設定されているか判定する If hstmt Then
'ステートメントハンドルを解放する SQLFreeHandle( SQL_HANDLE_STMT, _ hstmt _ )
'接続を切断する SQLDisconnect(hdbc) End If
'接続ハンドルを解放する SQLFreeHandle( _ SQL_HANDLE_DBC, _ hdbc _ )
'環境ハンドルを解放する SQLFreeHandle( _ SQL_HANDLE_ENV, _ henv _ )
End Sub
'========================================================================== ' 関数名:ConOpen関数 ' 説 明:データベースへ接続を行う ' 呼 出:ConOpen(psDataSource As String) ' 引き数:psDataSource As String (I/ ) ODBCデータソース ' 戻り値:なし '========================================================================== Function ConOpen(psDataSource As String) As Integer
Dim sConStrOut[BRWS_LEN-1] As Byte Dim ret As Integer
'返却値初期化 ConOpen = DBCLASS_OK
'データベースへ接続する ret = SQLDriverConnect( _ hdbc, _ 0, _ psDataSource, _ -3, _ sConStrOut, _ BRWS_LEN, _ VarPtr(iConStrOut), _ SQL_DRIVER_COMPLETE_REQUIRED _ ) If (ret = SQL_NO_DATA_FOUND) THen
'返却値を設定する ConOpen = DBCLASS_NG
End If
End Function
'========================================================================== ' 関数名:ConClose関数 ' 説 明:データベースを切断する ' 呼 出:ConClose() ' 引き数:なし ' 戻り値:なし '========================================================================== Function ConClose() As Integer
'ステートメントハンドルが設定されているか確認する If hstmt Then
'ステートメントハンドルを解放する SQLFreeHandle( _ SQL_HANDLE_STMT, _ hstmt _ )
'ステートメントハンドルを初期化する hstmt = 0
End If
'データベースを切断する SQLDisconnect(hdbc)
End Function
'========================================================================== ' 関数名:Execute関数 ' 説 明:SQL文を実行する ' 呼 出:Execute(psSqlStr As String) ' 引き数:psSqlStr As String (I/ ) SQL文格納用 ' 戻り値:なし '========================================================================== Function Execute(psSqlStr As String) As Integer
'ステートメントハンドルが取得されているか確認する If hstmt Then
'ステートメントハンドルを解放する SQLFreeHandle( _ SQL_HANDLE_STMT, _ hstmt _ )
'ステートメントハンドルを初期化する hstmt = 0
End If
'ステートメントハンドルを取得する SQLAllocHandle( _ SQL_HANDLE_STMT, _ hdbc, _ hstmt _ )
'SQL文を設定する SQLPrepare( _ hstmt, _ psSqlStr, _ Len(psSqlStr) _ )
'SQL文を実行する SQLExecute(hstmt)
End Function
'========================================================================== ' 関数名:BeginTransact関数 ' 説 明:AutoCommitを解除し、明示的にトランザクションを行う ' 呼 出:BeginTransact() ' 引き数:なし ' 戻り値:なし '========================================================================== Function BeginTransact() As Integer
'AutoCommitをOFFにする SQLSetConnectOption( _ hdbc, _ SQL_AUTOCOMMIT, _ SQL_AUTOCOMMIT_OFF _ )
End Function
'========================================================================== ' 関数名:Commit関数 ' 説 明:Commitを行い、AutoCommitをONにする ' 呼 出:Commit() ' 引き数:なし ' 戻り値:なし '========================================================================== Function Commit() As Integer
'トランザクションをCommitする SQLTransact( _ henv, _ hdbc, _ SQL_COMMIT _ )
'AutoCommitをONにする SQLSetConnectOption( _ hdbc, _ SQL_AUTOCOMMIT, _ SQL_AUTOCOMMIT_ON _ )
End Function
'========================================================================== ' 関数名:RollBack関数 ' 説 明:RollBackを行い、AutoCommitをONにする ' 呼 出:RollBack() ' 引き数:なし ' 戻り値:なし '========================================================================== Function RollBack() As Integer
'トランザクションをCommitする SQLTransact( _ henv, _ hdbc, _ SQL_ROLLBACK _ )
'AutoCommitをONにする SQLSetConnectOption( _ hdbc, _ SQL_AUTOCOMMIT, _ SQL_AUTOCOMMIT_ON _ )
End Function
'========================================================================== ' 関数名:GetEnvHandle関数 ' 説 明:接続されたコネクションの環境ハンドルを返却する ' 呼 出:GetEnvHandle() ' 引き数:なし ' 戻り値:環境ハンドル '========================================================================== Function GetEnvHandle() As HANDLE GetEnvHandle = henv End Function
'========================================================================== ' 関数名:GetDbcHandle関数 ' 説 明:接続されたコネクションの接続ハンドルを返却する ' 呼 出:GetDbcHandle() ' 引き数:なし ' 戻り値:接続ハンドル '========================================================================== Function GetDbcHandle() As HANDLE GetDbcHandle = hdbc End Function
'--------- おまけ ------------------------------------------------------------- '========================================================================== ' 関数名:Compact関数 ' 説 明:AccessMDBファイルの最適化を行う ' 呼 出:Compact(psFilePath As String) ' 引き数:psFilePath As String (I/ ) MDBファイルパス ' 戻り値:なし '========================================================================== Function Compact(psFilePath As String) As Integer
'AccessMDBの最適化を行う SQLConfigDataSource( _ 0, _ ODBC_CONFIG_DSN, _ "Microsoft Access Driver (*.MDB)", _ "DSN=MS Access Database;COMPACT_DB=" & psFilePath & " " & psFilePath _ )
End Function '----------------------------------------------------------------------------- End Class
'===================================================================== ' 名 称:レコードセットクラス ' 概 要:テーブルのレコードセットを取得する(疑似?) '===================================================================== Class DBRecordSet henv As HANDLE '環境ハンドル hdbc As HANDLE '接続ハンドル hstmt As HANDLE 'ステートメントハンドル iEof As Integer Public
'========================================================================== ' 関数名:コンストラクタ関数 ' 説 明:コンストラクタ ' 呼 出:なし ' 引き数:なし ' 戻り値:なし '========================================================================== Sub DBRecordSet()
'変数初期化 hdbc = 0 henv = 0 hstmt = 0 iEof = 0
End Sub
'========================================================================== ' 関数名:デストラクタ関数 ' 説 明:デストラクタ ' 呼 出:なし ' 引き数:なし ' 戻り値:なし '========================================================================== Sub ~DBRecordSet()
'ステートメントハンドルが設定されているか判定する If hstmt Then
'ステートメントハンドルを解放する SQLFreeHandle( SQL_HANDLE_STMT, _ hstmt _ )
hstmt = 0
End If
End Sub
'========================================================================== ' 関数名:RecOpen関数 ' 説 明:SQLをオープンする ' 呼 出:RecOpen(psSqlStr As String, pDbCn As *DBConnection) ' 引き数:psSqlStr As String (I/ ) SQL文格納用 ' pDbCn As *DBConnection (I/ ) コネクション接続クラス ' 戻り値:なし '========================================================================== Function RecOpen(psSqlStr As String, pDbCn As *DBConnection) As Integer
'環境ハンドルを取得する henv = pDbCn->GetEnvHandle()
'接続ハンドルを取得する hdbc = pDbCn->GetDbcHandle()
'ステートメントハンドルが取得されているか確認する If hstmt Then
'ステートメントハンドルを解放する SQLFreeHandle( _ SQL_HANDLE_STMT, _ hstmt _ )
'ステートメントハンドルを初期化する hstmt = 0
End If
'ステートメントハンドルを取得する SQLAllocHandle( _ SQL_HANDLE_STMT, _ hdbc, _ hstmt _ )
'SQL文を設定する SQLPrepare( _ hstmt, _ psSqlStr, _ Len(psSqlStr) _ )
'SQL文を実行する SQLExecute(hstmt)
MoveFirst()
iEof = 0
End Function
'========================================================================== ' 関数名:RecClose関数 ' 説 明:SQLをクローズする ' 呼 出:RecClose() ' 引き数:なし ' 戻り値:なし '========================================================================== Function RecClose() As Integer ' 'SQLが実行されている場合に処理を行う IF hstmt Then 'ステートメントハンドル解放 SQLFreeHandle( _ SQL_HANDLE_STMT, _ hstmt _ )
hstmt = 0 End If
End Function
'========================================================================== ' 関数名:MoveFirst関数 ' 説 明:先頭行へカーソルを移動する ' 呼 出:MoveFirst() ' 引き数:なし ' 戻り値:なし '========================================================================== Function MoveFirst() As Integer
'先頭行へ移動する SQLFetchScroll( _ hstmt, _ SQL_FETCH_FIRST, _ 0 _ )
SQLFetch(hstmt)
End Function
'========================================================================== ' 関数名:MoveNext関数 ' 説 明:次行へカーソルを移動する ' 呼 出:MoveNext() ' 引き数:なし ' 戻り値:なし '========================================================================== Function MoveNext() As Integer Dim ret As Integer
'次行へ移動する ret = SQLFetchScroll( _ hstmt, _ SQL_FETCH_NEXT, _ 0 _ ) If (ret = SQL_NO_DATA) Then iEof = 1 Else iEof = 0 End If
End Function
'========================================================================== ' 関数名:GetValueString関数 ' 説 明:指定されたフィールドの値を取得する ' 呼 出:GetValueString(psFiledName As String) ' 引き数:psFiledName As String (I/ ) フィールド名 ' 戻り値:なし '========================================================================== Function GetValueString(psFiledName As String) As String Dim lColCnt As Integer Dim i As Integer Dim sFiledName As String Dim Ret As Long Dim pNameLen As Integer Dim iDataType As Integer Dim iColSize As Long Dim iDecimal As Integer Dim ipNull As Integer Dim lngRetByteSize As Long
'SQLが実行されている場合に処理を行う IF hstmt Then
'カラム数を取得する SQLNumResultCols( _ hstmt, _ lColCnt _ )
'String領域確保 sFiledName = ZeroString(SQL_LEN)
For i = 1 To lColCnt 'フィールド名を取得する SQLDescribeCol( _ hstmt, _ i, _ StrPtr(sFiledName), _ SQL_LEN, _ pNameLen, _ iDataType, _ iColSize, _ iDecimal, _ ipNull _ )
'対象のフィールドか判定する If (psFiledName = sFiledName) Then
'対象のフィールドの場合、値を取得する Select Case iDataType Case SQL_VARCHAR
GetValueString = ZeroString(iColSize)
'SQLの値を取得する SQLGetData( _ hstmt, _ i, _ SQL_CHAR, _ StrPtr(GetValueString), iColSize, _ lngRetByteSize _ )
Case Else End Select End If Next i End If
End Function
'========================================================================== ' 関数名:GetValueDouble関数 ' 説 明:指定されたフィールドの値を取得する ' 呼 出:GetValueDouble(psFiledName As String) ' 引き数:psFiledName As String (I/ ) フィールド名 ' 戻り値:なし '========================================================================== Function GetValueDouble(psFiledName As String) As Double Dim lColCnt As Integer Dim i As Integer Dim sFiledName As String Dim Ret As Long Dim pNameLen As Integer Dim iDataType As Integer Dim iColSize As Long Dim iDecimal As Integer Dim ipNull As Integer Dim lngRetByteSize As Long
'SQLが実行されている場合に処理を行う IF hstmt Then
'カラム数を取得する SQLNumResultCols( _ hstmt, _ lColCnt _ )
'String領域確保 sFiledName = ZeroString(SQL_LEN)
For i = 1 To lColCnt 'フィールド名を取得する SQLDescribeCol( _ hstmt, _ i, _ StrPtr(sFiledName), _ SQL_LEN, _ pNameLen, _ iDataType, _ iColSize, _ iDecimal, _ ipNull _ )
'対象のフィールドか判定する If (psFiledName = sFiledName) Then
'対象のフィールドの場合、値を取得する Select Case iDataType Case SQL_INTEGER, SQL_SMALLINT, SQL_FLOAT, SQL_REAL, SQL_DOUBLE
SQLGetData( _ hstmt, _ i, _ SQL_DOUBLE, _ VarPtr(GetValueDouble), _ 0, _ lngRetByteSize _ )
Case Else End Select End If Next i End If
End Function
'========================================================================== ' 関数名:Eof関数 ' 説 明:EOFの状態を返却する ' 呼 出:Eof() ' 引き数:なし ' 戻り値: 0:正常 ' : 1:EOF '========================================================================== Function Eof() As Integer
Eof = iEof
End Function
End Class [/code] 以下、呼出のサンプルです。 「tbl_test1」の「test1code」と「tbl_test2」の「test1code」がリンクするものとします。 mdb名:test.mdb
テーブル名:tbl_test1 フィールド1:test1code int
テーブル名:tbl_test2 フィールド1:test1code int フィールド2:test2code int フィールド3:test2char char(10) [code] Dim DbCn As *DBConnection Dim DbRs1 As *DBRecordSet Dim DbRs2 As *DBRecordSet Dim lngtest1code As long DIm lngtest2code As long Dim strtest2char As string
'DBクラス初期化 DbCn = New DBConnection DbRs1 = New DBRecordSet DbRs2 = New DBRecordSet
'mdbへ接続する DbCn->ConOpen("DRIVER=Microsoft Access Driver(*.mdb);UID=;PWD=;DBQ=D:\test.mdb")
'tbl_test1をオープンする DbRs1->RecOpen("SELECT * FROM tbl_test1", DbCn)
While (DbRs1->Eof() = 0)
lngtest1code = DbRs1->GetValueDouble("test1code")
'test1codeを条件にtbl_test2をオープンする DbRs2->RecOpen("SELECT test2code, test2char FROM tbl_test2 WHERE test1code = " & Str$(lngtest1code), DbCn)
If (DbRs2->Eof() = 0) Then lngtest2code = DbRs2->GetValueDouble("test2code") strtest2char = DbRs2->GetValueString("test2char") End If
'tbl_test2をクローズする DbRs2->RecClose()
'tbl_test1の次レコードを検索 DbRs1->MoveNext() Wend
'tbl_test1をクローズする DbRs1->RecClose()
'mdbから切断する DbCn->ConClose()
'クラス解放 Delete DbRs1 Delete DbRs2 [/code]
|
|
|
投稿記事 |
Posted: 2005年8月22日(月) 12:40 |
|
|
|
|
|
データベースアクセスのクラスのサンプルを作成して見ました。
Windows2000+Access2000Mdbでは正常に接続できること確認済みです。
エラー処理が殆どありませんので、不安な方は追加してください。
テストが不十分ですので、重要なデータはバックアップしてから試して下さい。
コード:
'=====================================================================
' 名 称:データベースアクセスクラス
' 概 要:ODBC接続にてデータベースにアクセスする
'=====================================================================
'== 定数 =============================================================
Const DBCLASS_OK = 0 'クラス正常終了
Const DBCLASS_NG = -1 'クラス異常終了
'=====================================================================
'== API用定数 ========================================================
'データソース用定数
Const ODBC_ADD_DSN = 1 'ユーザーデータソースの追加
Const ODBC_CONFIG_DSN = 2 'ユーザーデータソースの編集
Const ODBC_REMOVE_DSN = 3 'ユーザーデータソースの削除
Const ODBC_ADD_SYS_DSN = 4 'システム データ ソースを追加
Const ODBC_CONFIG_SYS_DSN = 5 'システム データ ソースを設定 (編集)
Const ODBC_REMOVE_SYS_DSN = 6 'システム データ ソースを削除
'トランザクション用定数
Const SQL_COMMIT = 0 'トランザクション-コミット
Const SQL_ROLLBACK = 1 'トランザクション-ロールバック
'返却値用定数
Const SQL_NTS = -3
Const SQL_SUCCESS = 0 'SQL結果-正常終了
Const SQL_SUCCESS_WITH_INFO = 1 'SQL結果-正常終了(警告あり)
Const SQL_ERROR = -1 'SQL結果-異常終了
Const SQL_INVALID_HANDLE = -2 'SQL結果-不正ハンドル返却
Const SQL_NO_DATA_FOUND = 100 'SQL結果-データなし
'SQLAllocHandle、SQLFreeHandle用定数
Const SQL_NULL_HANDLE = 0 'SQL_HANDLE_ENV時パラメータ
Const SQL_HANDLE_ENV = 1 '環境ハンドル
Const SQL_HANDLE_DBC = 2 '接続ハンドル
Const SQL_HANDLE_STMT = 3 'ステートメントハンドル
Const SQL_HANDLE_DESC = 4
'SQLSetConnectOption用定数
Const SQL_AUTOCOMMIT = 102 'AutoCommitオプション
Const SQL_AUTOCOMMIT_OFF = 0 'AutoCommitOff
Const SQL_AUTOCOMMIT_ON = 1 'AutoCommitOn
'Fetch用定数
Const SQL_FETCH_NEXT = 1
Const SQL_FETCH_FIRST = 2
Const SQL_FETCH_LAST = 3
Const SQL_FETCH_PRIOR = 4
Const SQL_FETCH_ABSOLUTE = 5
Const SQL_FETCH_RELATIVE = 6
'環境定数
Const SQL_ATTR_CURSOR_TYPE = 6
Const SQL_ATTR_ROW_NUMBER = 14
Const SQL_ATTR_ODBC_VERSION = 200
Const SQL_OV_ODBC3 = 3
'行操作・結果定数
Const SQL_ROW_SUCCESS = 0
Const SQL_ROW_DELETED = 1
Const SQL_ROW_UPDATED = 2
Const SQL_ROW_NOROW = 3
Const SQL_ROW_ADDED = 4
Const SQL_ROW_ERROR = 5
Const SQL_ROW_SUCCESS_WITH_INFO = 6
Const SQL_ROW_PROCEED = 0
Const SQL_ROW_IGNORE = 1
Const SQL_NO_DATA = 100
'サイズ用定数
Const BRWS_LEN = 1000
Const SQL_LEN = 1000
'接続用定数
Const SQL_DRIVER_COMPLETE_REQUIRED = 3
'型宣言用定数
Const SQL_UNKNOWN_TYPE = 0
Const SQL_CHAR = 1
Const SQL_NUMERIC = 2
Const SQL_DECIMAL = 3
Const SQL_INTEGER = 4
Const SQL_SMALLINT = 5
Const SQL_FLOAT = 6
Const SQL_REAL = 7
Const SQL_DOUBLE = 8
Const SQL_DATETIME = 9
Const SQL_VARCHAR = 12
Const SQL_TYPE_DATE = 91
Const SQL_TYPE_TIMESTAMP = 93
Const SQL_INTERVAL = 10
Const SQL_TIME = 10
Const SQL_TIMESTAMP = 11
Const SQL_LONGVARCHAR = -1
Const SQL_BINARY = -2
Const SQL_VARBINARY = -3
Const SQL_LONGVARBINARY = -4
Const SQL_BIGINT = -5
Const SQL_TINYINT = -6
Const SQL_BIT = -7
Const SQL_GUID = -11
Const SQL_C_BINARY = SQL_BINARY
Const SQL_C_BIT = SQL_BIT
Const SQL_C_CHAR = SQL_CHAR
Const SQL_C_DOUBLE = SQL_DOUBLE
Const SQL_C_FLOAT = SQL_REAL
Const SQL_C_LONG = SQL_INTEGER
Const SQL_C_SHORT = SQL_SMALLINT
Const SQL_C_TYPE_DATE = SQL_TYPE_DATE
Const SQL_C_TYPE_TIME = SQL_TYPE_DATE
Const SQL_C_TYPE_TIMESTAMP = SQL_TYPE_TIMESTAMP
Const SQL_C_TINYINT = SQL_TINYINT
'=====================================================================
'SQLAllocHandle - ハンドルの割り当て
Declare Function SQLAllocHandle _
Lib "odbc32.dll" ( _
ByVal handletype As Integer, _
ByVal inputhandle As HANDLE, _
ByRef outputhandle As HANDLE _
) As Integer
'SQLFreeHandle - ハンドル・リソースの解放
Declare Function SQLFreeHandle _
Lib "odbc32.dll" ( _
ByVal handletype As Integer, _
ByVal handle As HANDLE _
) As Integer
'SQLDisconnect - データ・ソースからの切断
Declare Function SQLDisconnect _
Lib "odbc32.dll" ( _
ByVal hdbc As Long _
) As Integer
'SQLPrepare - ステートメントの準備
Declare Function SQLPrepare _
Lib "odbc32.dll" ( _
ByVal hstmt As HANDLE, _
ByVal stmt As String, _
ByVal stmtlen As Long _
) As Integer
'SQLExecute - ステートメントの実行
Declare Function SQLExecute _
Lib "odbc32.dll" ( _
ByVal hstmt As Long _
) As Integer
'SQLNumResultCols - 結果の列数の入手
Declare Function SQLNumResultCols _
Lib "odbc32.dll" ( _
ByVal hstmt As Long, _
ByRef nCou As Integer _
) As Integer
'SQLDescribeCol - 列の属性セットの戻し
Declare Function SQLDescribeCol _
Lib "odbc32.dll" ( _
ByVal hstmt As Long, _
ByVal colno As Integer, _
ByVal colname As String, _
ByVal namelen As Integer, _
ByRef pnamelen As Integer, _
ByRef datatype As Integer, _
ByRef colsize As Long, _
ByRef pdecimal As Integer, _
ByRef pnull As Integer _
) As Integer
'SQLFetch - 次の行の取り出し
Declare Function SQLFetch _
Lib "odbc32.dll" ( _
ByVal hstmt As Long _
) As Integer
'SQLFetchScroll - 行セットの取り出しと、バインドされたすべての列のデータの戻し
Declare Function SQLFetchScroll _
Lib "odbc32" ( _
hstmt As HANDLE, _
FetchOrientation As Integer, _
FetchOffset As Long _
) As Integer
'SQLGetData - 列からのデータの入手
Declare Function SQLGetData _
Lib "odbc32.dll" ( _
ByVal hstmt As Long, _
ByVal colno As Integer, _
ByVal targettype As Integer, _
ByVal pVal As Any, _
ByVal buflen As Long, _
ByRef ind As Long _
) As Integer
'SQLDriverConnect - データ・ソースへの接続
Declare Function SQLDriverConnect _
Lib "odbc32.dll" ( _
hdbc As HANDLE, _
hwnd As Word, _
szCSIn As BytePtr, _
cbCSIn As Integer, _
szCSOut As BytePtr, _
cbCSMax As Integer, _
cbCSOut As WordPtr, _
fDrvrComp As Integer _
) As Integer
'SQLSetConnectOption - 接続オプションの設定
Declare Function SQLSetConnectOption _
Lib "odbc32.dll" ( _
ByVal hDBc As HANDLE, _
ByVal fOption As Integer, _
ByVal vParam As Long
) As Integer
'SQLSetEnvAttr - 環境属性を設定
Declare Function SQLSetEnvAttr _
Lib "odbc32.dll" ( _
henv As HANDLE, _
Attribute As Long, _
ValuePtr As VoidPtr, _
StringLength As Long _
) As Integer
'SQLTransact - トランザクション管理
Declare Function SQLTransact _
Lib "odbc32.dll" ( _
ByVal hEnv As HANDLE, _
ByVal hDBc As HANDLE, _
ByVal fnType As Integer _
) As Integer
'SQLConfigDataSource - ODBC への登録・編集・削除
Declare Function SQLConfigDataSource _
Lib "odbccp32.dll" ( _
ByVal hwndParent As Long, _
ByVal fRequest As Long, _
ByVal lpszDriver As String, _
ByVal lpszAttributes As String _
) As Long
Class CDBClass
henv As HANDLE '環境ハンドル
hdbc As HANDLE '接続ハンドル
hstmt As HANDLE 'ステートメントハンドル
iConStrOut As Long
sTableName As String
iEof As Integer
Public
'==========================================================================
' 関数名:コンストラクタ関数
' 説 明:コンストラクタ
' 呼 出:なし
' 引き数:なし
' 戻り値:なし
'==========================================================================
Sub CDBClass()
'変数初期化
hdbc = 0
henv = 0
hstmt = 0
iEof = 0
'SQL接続用の環境ハンドルを取得する
SQLAllocHandle(SQL_HANDLE_ENV, 0, henv)
'環境属性をODBC3.0に設定する
SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, SQL_OV_ODBC3, 0)
'接続ハンドルを取得する
SQLAllocHandle(SQL_HANDLE_DBC, henv, hdbc)
End Sub
'==========================================================================
' 関数名:デストラクタ関数
' 説 明:デストラクタ
' 呼 出:なし
' 引き数:なし
' 戻り値:なし
'==========================================================================
Sub ~CDBClass()
'ステートメントハンドルが設定されているか判定する
If hstmt Then
'ステートメントハンドルを解放する
SQLFreeHandle(
SQL_HANDLE_STMT, _
hstmt _
)
'接続を切断する
SQLDisconnect(hdbc)
End If
'接続ハンドルを解放する
SQLFreeHandle( _
SQL_HANDLE_DBC, _
hdbc _
)
'環境ハンドルを解放する
SQLFreeHandle( _
SQL_HANDLE_ENV, _
henv _
)
End Sub
'==========================================================================
' 関数名:ConnectOpen関数
' 説 明:データベースへ接続を行う
' 呼 出:ConnectOpen(psDataSource As String)
' 引き数:psDataSource As String (I/ ) ODBCデータソース
' 戻り値:なし
'==========================================================================
Function ConnectOpen(psDataSource As String) As Integer
Dim sConStrOut[BRWS_LEN-1] As Byte
Dim ret As Integer
'返却値初期化
ConnectOpen = DBCLASS_OK
'データベースへ接続する
ret = SQLDriverConnect( _
hdbc, _
0, _
psDataSource, _
-3, _
sConStrOut, _
BRWS_LEN, _
VarPtr(iConStrOut), _
SQL_DRIVER_COMPLETE_REQUIRED _
)
If (ret = SQL_NO_DATA_FOUND) THen
'返却値を設定する
ConnectOpen = DBCLASS_NG
End If
End Function
'==========================================================================
' 関数名:ConnectClose関数
' 説 明:データベースを切断する
' 呼 出:Close()
' 引き数:なし
' 戻り値:なし
'==========================================================================
Function ConnectClose() As Integer
'ステートメントハンドルが設定されているか確認する
If hstmt Then
'ステートメントハンドルを解放する
SQLFreeHandle( _
SQL_HANDLE_STMT, _
hstmt _
)
'ステートメントハンドルを初期化する
hstmt = 0
End If
'データベースを切断する
SQLDisconnect(hdbc)
End Function
'==========================================================================
' 関数名:Execute関数
' 説 明:SQL文を実行する
' 呼 出:Execute(psSqlStr As String)
' 引き数:psSqlStr As String (I/ ) SQL文格納用
' 戻り値:なし
'==========================================================================
Function Execute(psSqlStr As String) As Integer
'ステートメントハンドルが取得されているか確認する
If hstmt Then
'ステートメントハンドルを解放する
SQLFreeHandle( _
SQL_HANDLE_STMT, _
hstmt _
)
'ステートメントハンドルを初期化する
hstmt = 0
End If
'ステートメントハンドルを取得する
SQLAllocHandle( _
SQL_HANDLE_STMT, _
hdbc, _
hstmt _
)
'SQL文を設定する
SQLPrepare( _
hstmt, _
psSqlStr, _
Len(psSqlStr) _
)
'SQL文を実行する
SQLExecute(hstmt)
iEof = 0
End Function
'==========================================================================
' 関数名:Open関数
' 説 明:SQLをオープンする
' 呼 出:Open(psSqlStr As String)
' 引き数:psSqlStr As String (I/ ) SQL文格納用
' 戻り値:なし
'==========================================================================
Function Open(psSqlStr As String) As Integer
'
Execute(psSqlStr)
MoveFirst()
End Function
'==========================================================================
' 関数名:Close関数
' 説 明:SQLをクローズする
' 呼 出:Close()
' 引き数:なし
' 戻り値:なし
'==========================================================================
Function Close() As Integer
'
'SQLが実行されている場合に処理を行う
IF hstmt Then
'ステートメントハンドル解放
SQLFreeHandle( _
SQL_HANDLE_STMT, _
hstmt _
)
hstmt = 0
End If
End Function
'==========================================================================
' 関数名:BeginTransact関数
' 説 明:AutoCommitを解除し、明示的にトランザクションを行う
' 呼 出:BeginTransact()
' 引き数:なし
' 戻り値:なし
'==========================================================================
Function BeginTransact() As Integer
'AutoCommitをOFFにする
SQLSetConnectOption( _
hdbc, _
SQL_AUTOCOMMIT, _
SQL_AUTOCOMMIT_OFF _
)
End Function
'==========================================================================
' 関数名:Commit関数
' 説 明:Commitを行い、AutoCommitをONにする
' 呼 出:Commit()
' 引き数:なし
' 戻り値:なし
'==========================================================================
Function Commit() As Integer
'トランザクションをCommitする
SQLTransact( _
henv, _
hdbc, _
SQL_COMMIT _
)
'AutoCommitをONにする
SQLSetConnectOption( _
hdbc, _
SQL_AUTOCOMMIT, _
SQL_AUTOCOMMIT_ON _
)
End Function
'==========================================================================
' 関数名:RollBack関数
' 説 明:RollBackを行い、AutoCommitをONにする
' 呼 出:RollBack()
' 引き数:なし
' 戻り値:なし
'==========================================================================
Function RollBack() As Integer
'トランザクションをCommitする
SQLTransact( _
henv, _
hdbc, _
SQL_ROLLBACK _
)
'AutoCommitをONにする
SQLSetConnectOption( _
hdbc, _
SQL_AUTOCOMMIT, _
SQL_AUTOCOMMIT_ON _
)
End Function
'==========================================================================
' 関数名:Compact関数
' 説 明:AccessMDBファイルの最適化を行う
' 呼 出:Compact(psFilePath As String)
' 引き数:psFilePath As String (I/ ) MDBファイルパス
' 戻り値:なし
'==========================================================================
Function Compact(psFilePath As String) As Integer
'AccessMDBの最適化を行う
SQLConfigDataSource( _
0, _
ODBC_CONFIG_DSN, _
"Microsoft Access Driver (*.MDB)", _
"DSN=MS Access Database;COMPACT_DB=" & psFilePath & " " & psFilePath _
)
End Function
'==========================================================================
' 関数名:GetValueString関数
' 説 明:指定されたフィールドの値を取得する
' 呼 出:GetValueString(psFiledName As String)
' 引き数:psFiledName As String (I/ ) フィールド名
' 戻り値:なし
'==========================================================================
Function GetValueString(psFiledName As String) As String
Dim lColCnt As Integer
Dim i As Integer
Dim sFiledName As String
Dim Ret As Long
Dim pNameLen As Integer
Dim iDataType As Integer
Dim iColSize As Long
Dim iDecimal As Integer
Dim ipNull As Integer
Dim lngRetByteSize As Long
'SQLが実行されている場合に処理を行う
IF hstmt Then
'カラム数を取得する
SQLNumResultCols( _
hstmt, _
lColCnt _
)
'String領域確保
sFiledName = ZeroString(SQL_LEN)
For i = 1 To lColCnt
'フィールド名を取得する
SQLDescribeCol( _
hstmt, _
i, _
StrPtr(sFiledName), _
SQL_LEN, _
pNameLen, _
iDataType, _
iColSize, _
iDecimal, _
ipNull _
)
'対象のフィールドか判定する
If (psFiledName = sFiledName) Then
'対象のフィールドの場合、値を取得する
Select Case iDataType
Case SQL_VARCHAR
GetValueString = ZeroString(iColSize)
'SQLの値を取得する
SQLGetData( _
hstmt, _
i, _
SQL_CHAR, _
StrPtr(GetValueString),
iColSize, _
lngRetByteSize _
)
Case Else
End Select
End If
Next i
End If
End Function
'==========================================================================
' 関数名:GetValueDouble関数
' 説 明:指定されたフィールドの値を取得する
' 呼 出:GetValueDouble(psFiledName As String)
' 引き数:psFiledName As String (I/ ) フィールド名
' 戻り値:なし
'==========================================================================
Function GetValueDouble(psFiledName As String) As Double
Dim lColCnt As Integer
Dim i As Integer
Dim sFiledName As String
Dim Ret As Long
Dim pNameLen As Integer
Dim iDataType As Integer
Dim iColSize As Long
Dim iDecimal As Integer
Dim ipNull As Integer
Dim lngRetByteSize As Long
'SQLが実行されている場合に処理を行う
IF hstmt Then
'カラム数を取得する
SQLNumResultCols( _
hstmt, _
lColCnt _
)
'String領域確保
sFiledName = ZeroString(SQL_LEN)
For i = 1 To lColCnt
'フィールド名を取得する
SQLDescribeCol( _
hstmt, _
i, _
StrPtr(sFiledName), _
SQL_LEN, _
pNameLen, _
iDataType, _
iColSize, _
iDecimal, _
ipNull _
)
'対象のフィールドか判定する
If (psFiledName = sFiledName) Then
'対象のフィールドの場合、値を取得する
Select Case iDataType
Case SQL_INTEGER, SQL_SMALLINT, SQL_FLOAT, SQL_REAL, SQL_DOUBLE
SQLGetData( _
hstmt, _
i, _
SQL_DOUBLE, _
VarPtr(GetValueDouble), _
0, _
lngRetByteSize _
)
Case Else
End Select
End If
Next i
End If
End Function
'==========================================================================
' 関数名:MoveFirst関数
' 説 明:先頭行へカーソルを移動する
' 呼 出:MoveFirst()
' 引き数:なし
' 戻り値:なし
'==========================================================================
Function MoveFirst() As Integer
'先頭行へ移動する
SQLFetchScroll( _
hstmt, _
SQL_FETCH_FIRST, _
0 _
)
SQLFetch(hstmt)
End Function
'==========================================================================
' 関数名:MoveNext関数
' 説 明:次行へカーソルを移動する
' 呼 出:MoveNext()
' 引き数:なし
' 戻り値:なし
'==========================================================================
Function MoveNext() As Integer
Dim ret As Integer
'次行へ移動する
ret = SQLFetchScroll( _
hstmt, _
SQL_FETCH_NEXT, _
0 _
)
If (ret = SQL_NO_DATA) Then
iEof = 1
Else
iEof = 0
End If
End Function
'==========================================================================
' 関数名:Eof関数
' 説 明:EOFの状態を返却する
' 呼 出:Eof()
' 引き数:なし
' 戻り値: 0:正常
' : 1:EOF
'==========================================================================
Function Eof() As Integer
Eof = iEof
End Function
End Class
呼び出しのサンプルです。
mdb名:test.mdb
テーブル名:tbl_test
フィールド1:filed01 int
フィールド2:filed02 char(10)
コード:
Dim a As *CDBClass
a = New CDBClass
a->ConnectOpen("DRIVER=Microsoft Access Driver(*.mdb);UID=;PWD=;DBQ=D:\test.mdb")
a->Execute("DELETE FROM tbl_test")
a->Execute("INSERT INTO tbl_test VALUES(1,'あ')")
a->Execute("INSERT INTO tbl_test VALUES(1,'い')")
a->Open("SELECT * FROM tbl_test")
While (a->Eof() = 0)
ret = a->GetValueDouble("filed01")
Buff = a->GetValueString("filed02")
debug
a->MoveNext()
Wend
a->Close()
a->ConnectClose()
Delete a
データベースアクセスのクラスのサンプルを作成して見ました。 Windows2000+Access2000Mdbでは正常に接続できること確認済みです。
エラー処理が殆どありませんので、不安な方は追加してください。 テストが不十分ですので、重要なデータはバックアップしてから試して下さい。
[code] '===================================================================== ' 名 称:データベースアクセスクラス ' 概 要:ODBC接続にてデータベースにアクセスする '=====================================================================
'== 定数 ============================================================= Const DBCLASS_OK = 0 'クラス正常終了 Const DBCLASS_NG = -1 'クラス異常終了
'=====================================================================
'== API用定数 ======================================================== 'データソース用定数 Const ODBC_ADD_DSN = 1 'ユーザーデータソースの追加 Const ODBC_CONFIG_DSN = 2 'ユーザーデータソースの編集 Const ODBC_REMOVE_DSN = 3 'ユーザーデータソースの削除 Const ODBC_ADD_SYS_DSN = 4 'システム データ ソースを追加 Const ODBC_CONFIG_SYS_DSN = 5 'システム データ ソースを設定 (編集) Const ODBC_REMOVE_SYS_DSN = 6 'システム データ ソースを削除
'トランザクション用定数 Const SQL_COMMIT = 0 'トランザクション-コミット Const SQL_ROLLBACK = 1 'トランザクション-ロールバック
'返却値用定数 Const SQL_NTS = -3 Const SQL_SUCCESS = 0 'SQL結果-正常終了 Const SQL_SUCCESS_WITH_INFO = 1 'SQL結果-正常終了(警告あり) Const SQL_ERROR = -1 'SQL結果-異常終了 Const SQL_INVALID_HANDLE = -2 'SQL結果-不正ハンドル返却 Const SQL_NO_DATA_FOUND = 100 'SQL結果-データなし
'SQLAllocHandle、SQLFreeHandle用定数 Const SQL_NULL_HANDLE = 0 'SQL_HANDLE_ENV時パラメータ Const SQL_HANDLE_ENV = 1 '環境ハンドル Const SQL_HANDLE_DBC = 2 '接続ハンドル Const SQL_HANDLE_STMT = 3 'ステートメントハンドル Const SQL_HANDLE_DESC = 4
'SQLSetConnectOption用定数 Const SQL_AUTOCOMMIT = 102 'AutoCommitオプション Const SQL_AUTOCOMMIT_OFF = 0 'AutoCommitOff Const SQL_AUTOCOMMIT_ON = 1 'AutoCommitOn
'Fetch用定数 Const SQL_FETCH_NEXT = 1 Const SQL_FETCH_FIRST = 2 Const SQL_FETCH_LAST = 3 Const SQL_FETCH_PRIOR = 4 Const SQL_FETCH_ABSOLUTE = 5 Const SQL_FETCH_RELATIVE = 6
'環境定数 Const SQL_ATTR_CURSOR_TYPE = 6 Const SQL_ATTR_ROW_NUMBER = 14 Const SQL_ATTR_ODBC_VERSION = 200 Const SQL_OV_ODBC3 = 3
'行操作・結果定数 Const SQL_ROW_SUCCESS = 0 Const SQL_ROW_DELETED = 1 Const SQL_ROW_UPDATED = 2 Const SQL_ROW_NOROW = 3 Const SQL_ROW_ADDED = 4 Const SQL_ROW_ERROR = 5 Const SQL_ROW_SUCCESS_WITH_INFO = 6 Const SQL_ROW_PROCEED = 0 Const SQL_ROW_IGNORE = 1 Const SQL_NO_DATA = 100
'サイズ用定数 Const BRWS_LEN = 1000 Const SQL_LEN = 1000
'接続用定数 Const SQL_DRIVER_COMPLETE_REQUIRED = 3
'型宣言用定数 Const SQL_UNKNOWN_TYPE = 0 Const SQL_CHAR = 1 Const SQL_NUMERIC = 2 Const SQL_DECIMAL = 3 Const SQL_INTEGER = 4 Const SQL_SMALLINT = 5 Const SQL_FLOAT = 6 Const SQL_REAL = 7 Const SQL_DOUBLE = 8 Const SQL_DATETIME = 9 Const SQL_VARCHAR = 12 Const SQL_TYPE_DATE = 91 Const SQL_TYPE_TIMESTAMP = 93 Const SQL_INTERVAL = 10 Const SQL_TIME = 10 Const SQL_TIMESTAMP = 11 Const SQL_LONGVARCHAR = -1 Const SQL_BINARY = -2 Const SQL_VARBINARY = -3 Const SQL_LONGVARBINARY = -4 Const SQL_BIGINT = -5 Const SQL_TINYINT = -6 Const SQL_BIT = -7 Const SQL_GUID = -11
Const SQL_C_BINARY = SQL_BINARY Const SQL_C_BIT = SQL_BIT Const SQL_C_CHAR = SQL_CHAR Const SQL_C_DOUBLE = SQL_DOUBLE Const SQL_C_FLOAT = SQL_REAL Const SQL_C_LONG = SQL_INTEGER Const SQL_C_SHORT = SQL_SMALLINT Const SQL_C_TYPE_DATE = SQL_TYPE_DATE Const SQL_C_TYPE_TIME = SQL_TYPE_DATE Const SQL_C_TYPE_TIMESTAMP = SQL_TYPE_TIMESTAMP Const SQL_C_TINYINT = SQL_TINYINT '=====================================================================
'SQLAllocHandle - ハンドルの割り当て Declare Function SQLAllocHandle _ Lib "odbc32.dll" ( _ ByVal handletype As Integer, _ ByVal inputhandle As HANDLE, _ ByRef outputhandle As HANDLE _ ) As Integer 'SQLFreeHandle - ハンドル・リソースの解放 Declare Function SQLFreeHandle _ Lib "odbc32.dll" ( _ ByVal handletype As Integer, _ ByVal handle As HANDLE _ ) As Integer
'SQLDisconnect - データ・ソースからの切断 Declare Function SQLDisconnect _ Lib "odbc32.dll" ( _ ByVal hdbc As Long _ ) As Integer
'SQLPrepare - ステートメントの準備 Declare Function SQLPrepare _ Lib "odbc32.dll" ( _ ByVal hstmt As HANDLE, _ ByVal stmt As String, _ ByVal stmtlen As Long _ ) As Integer
'SQLExecute - ステートメントの実行 Declare Function SQLExecute _ Lib "odbc32.dll" ( _ ByVal hstmt As Long _ ) As Integer
'SQLNumResultCols - 結果の列数の入手 Declare Function SQLNumResultCols _ Lib "odbc32.dll" ( _ ByVal hstmt As Long, _ ByRef nCou As Integer _ ) As Integer
'SQLDescribeCol - 列の属性セットの戻し Declare Function SQLDescribeCol _ Lib "odbc32.dll" ( _ ByVal hstmt As Long, _ ByVal colno As Integer, _ ByVal colname As String, _ ByVal namelen As Integer, _ ByRef pnamelen As Integer, _ ByRef datatype As Integer, _ ByRef colsize As Long, _ ByRef pdecimal As Integer, _ ByRef pnull As Integer _ ) As Integer
'SQLFetch - 次の行の取り出し Declare Function SQLFetch _ Lib "odbc32.dll" ( _ ByVal hstmt As Long _ ) As Integer
'SQLFetchScroll - 行セットの取り出しと、バインドされたすべての列のデータの戻し Declare Function SQLFetchScroll _ Lib "odbc32" ( _ hstmt As HANDLE, _ FetchOrientation As Integer, _ FetchOffset As Long _ ) As Integer
'SQLGetData - 列からのデータの入手 Declare Function SQLGetData _ Lib "odbc32.dll" ( _ ByVal hstmt As Long, _ ByVal colno As Integer, _ ByVal targettype As Integer, _ ByVal pVal As Any, _ ByVal buflen As Long, _ ByRef ind As Long _ ) As Integer
'SQLDriverConnect - データ・ソースへの接続 Declare Function SQLDriverConnect _ Lib "odbc32.dll" ( _ hdbc As HANDLE, _ hwnd As Word, _ szCSIn As BytePtr, _ cbCSIn As Integer, _ szCSOut As BytePtr, _ cbCSMax As Integer, _ cbCSOut As WordPtr, _ fDrvrComp As Integer _ ) As Integer
'SQLSetConnectOption - 接続オプションの設定 Declare Function SQLSetConnectOption _ Lib "odbc32.dll" ( _ ByVal hDBc As HANDLE, _ ByVal fOption As Integer, _ ByVal vParam As Long ) As Integer
'SQLSetEnvAttr - 環境属性を設定 Declare Function SQLSetEnvAttr _ Lib "odbc32.dll" ( _ henv As HANDLE, _ Attribute As Long, _ ValuePtr As VoidPtr, _ StringLength As Long _ ) As Integer
'SQLTransact - トランザクション管理 Declare Function SQLTransact _ Lib "odbc32.dll" ( _ ByVal hEnv As HANDLE, _ ByVal hDBc As HANDLE, _ ByVal fnType As Integer _ ) As Integer
'SQLConfigDataSource - ODBC への登録・編集・削除 Declare Function SQLConfigDataSource _ Lib "odbccp32.dll" ( _ ByVal hwndParent As Long, _ ByVal fRequest As Long, _ ByVal lpszDriver As String, _ ByVal lpszAttributes As String _ ) As Long
Class CDBClass henv As HANDLE '環境ハンドル hdbc As HANDLE '接続ハンドル hstmt As HANDLE 'ステートメントハンドル iConStrOut As Long sTableName As String iEof As Integer Public
'========================================================================== ' 関数名:コンストラクタ関数 ' 説 明:コンストラクタ ' 呼 出:なし ' 引き数:なし ' 戻り値:なし '========================================================================== Sub CDBClass()
'変数初期化 hdbc = 0 henv = 0 hstmt = 0 iEof = 0
'SQL接続用の環境ハンドルを取得する SQLAllocHandle(SQL_HANDLE_ENV, 0, henv)
'環境属性をODBC3.0に設定する SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, SQL_OV_ODBC3, 0)
'接続ハンドルを取得する SQLAllocHandle(SQL_HANDLE_DBC, henv, hdbc)
End Sub
'========================================================================== ' 関数名:デストラクタ関数 ' 説 明:デストラクタ ' 呼 出:なし ' 引き数:なし ' 戻り値:なし '========================================================================== Sub ~CDBClass()
'ステートメントハンドルが設定されているか判定する If hstmt Then
'ステートメントハンドルを解放する SQLFreeHandle( SQL_HANDLE_STMT, _ hstmt _ )
'接続を切断する SQLDisconnect(hdbc) End If
'接続ハンドルを解放する SQLFreeHandle( _ SQL_HANDLE_DBC, _ hdbc _ )
'環境ハンドルを解放する SQLFreeHandle( _ SQL_HANDLE_ENV, _ henv _ )
End Sub
'========================================================================== ' 関数名:ConnectOpen関数 ' 説 明:データベースへ接続を行う ' 呼 出:ConnectOpen(psDataSource As String) ' 引き数:psDataSource As String (I/ ) ODBCデータソース ' 戻り値:なし '========================================================================== Function ConnectOpen(psDataSource As String) As Integer
Dim sConStrOut[BRWS_LEN-1] As Byte Dim ret As Integer
'返却値初期化 ConnectOpen = DBCLASS_OK
'データベースへ接続する ret = SQLDriverConnect( _ hdbc, _ 0, _ psDataSource, _ -3, _ sConStrOut, _ BRWS_LEN, _ VarPtr(iConStrOut), _ SQL_DRIVER_COMPLETE_REQUIRED _ ) If (ret = SQL_NO_DATA_FOUND) THen
'返却値を設定する ConnectOpen = DBCLASS_NG
End If
End Function
'========================================================================== ' 関数名:ConnectClose関数 ' 説 明:データベースを切断する ' 呼 出:Close() ' 引き数:なし ' 戻り値:なし '========================================================================== Function ConnectClose() As Integer
'ステートメントハンドルが設定されているか確認する If hstmt Then
'ステートメントハンドルを解放する SQLFreeHandle( _ SQL_HANDLE_STMT, _ hstmt _ )
'ステートメントハンドルを初期化する hstmt = 0
End If
'データベースを切断する SQLDisconnect(hdbc)
End Function
'========================================================================== ' 関数名:Execute関数 ' 説 明:SQL文を実行する ' 呼 出:Execute(psSqlStr As String) ' 引き数:psSqlStr As String (I/ ) SQL文格納用 ' 戻り値:なし '========================================================================== Function Execute(psSqlStr As String) As Integer
'ステートメントハンドルが取得されているか確認する If hstmt Then
'ステートメントハンドルを解放する SQLFreeHandle( _ SQL_HANDLE_STMT, _ hstmt _ )
'ステートメントハンドルを初期化する hstmt = 0
End If
'ステートメントハンドルを取得する SQLAllocHandle( _ SQL_HANDLE_STMT, _ hdbc, _ hstmt _ )
'SQL文を設定する SQLPrepare( _ hstmt, _ psSqlStr, _ Len(psSqlStr) _ )
'SQL文を実行する SQLExecute(hstmt)
iEof = 0 End Function
'========================================================================== ' 関数名:Open関数 ' 説 明:SQLをオープンする ' 呼 出:Open(psSqlStr As String) ' 引き数:psSqlStr As String (I/ ) SQL文格納用 ' 戻り値:なし '========================================================================== Function Open(psSqlStr As String) As Integer ' Execute(psSqlStr)
MoveFirst()
End Function
'========================================================================== ' 関数名:Close関数 ' 説 明:SQLをクローズする ' 呼 出:Close() ' 引き数:なし ' 戻り値:なし '========================================================================== Function Close() As Integer ' 'SQLが実行されている場合に処理を行う IF hstmt Then 'ステートメントハンドル解放 SQLFreeHandle( _ SQL_HANDLE_STMT, _ hstmt _ )
hstmt = 0 End If
End Function
'========================================================================== ' 関数名:BeginTransact関数 ' 説 明:AutoCommitを解除し、明示的にトランザクションを行う ' 呼 出:BeginTransact() ' 引き数:なし ' 戻り値:なし '========================================================================== Function BeginTransact() As Integer
'AutoCommitをOFFにする SQLSetConnectOption( _ hdbc, _ SQL_AUTOCOMMIT, _ SQL_AUTOCOMMIT_OFF _ )
End Function
'========================================================================== ' 関数名:Commit関数 ' 説 明:Commitを行い、AutoCommitをONにする ' 呼 出:Commit() ' 引き数:なし ' 戻り値:なし '========================================================================== Function Commit() As Integer
'トランザクションをCommitする SQLTransact( _ henv, _ hdbc, _ SQL_COMMIT _ )
'AutoCommitをONにする SQLSetConnectOption( _ hdbc, _ SQL_AUTOCOMMIT, _ SQL_AUTOCOMMIT_ON _ )
End Function
'========================================================================== ' 関数名:RollBack関数 ' 説 明:RollBackを行い、AutoCommitをONにする ' 呼 出:RollBack() ' 引き数:なし ' 戻り値:なし '========================================================================== Function RollBack() As Integer
'トランザクションをCommitする SQLTransact( _ henv, _ hdbc, _ SQL_ROLLBACK _ )
'AutoCommitをONにする SQLSetConnectOption( _ hdbc, _ SQL_AUTOCOMMIT, _ SQL_AUTOCOMMIT_ON _ )
End Function
'========================================================================== ' 関数名:Compact関数 ' 説 明:AccessMDBファイルの最適化を行う ' 呼 出:Compact(psFilePath As String) ' 引き数:psFilePath As String (I/ ) MDBファイルパス ' 戻り値:なし '========================================================================== Function Compact(psFilePath As String) As Integer
'AccessMDBの最適化を行う SQLConfigDataSource( _ 0, _ ODBC_CONFIG_DSN, _ "Microsoft Access Driver (*.MDB)", _ "DSN=MS Access Database;COMPACT_DB=" & psFilePath & " " & psFilePath _ )
End Function
'========================================================================== ' 関数名:GetValueString関数 ' 説 明:指定されたフィールドの値を取得する ' 呼 出:GetValueString(psFiledName As String) ' 引き数:psFiledName As String (I/ ) フィールド名 ' 戻り値:なし '========================================================================== Function GetValueString(psFiledName As String) As String Dim lColCnt As Integer Dim i As Integer Dim sFiledName As String Dim Ret As Long Dim pNameLen As Integer Dim iDataType As Integer Dim iColSize As Long Dim iDecimal As Integer Dim ipNull As Integer Dim lngRetByteSize As Long
'SQLが実行されている場合に処理を行う IF hstmt Then
'カラム数を取得する SQLNumResultCols( _ hstmt, _ lColCnt _ )
'String領域確保 sFiledName = ZeroString(SQL_LEN)
For i = 1 To lColCnt 'フィールド名を取得する SQLDescribeCol( _ hstmt, _ i, _ StrPtr(sFiledName), _ SQL_LEN, _ pNameLen, _ iDataType, _ iColSize, _ iDecimal, _ ipNull _ )
'対象のフィールドか判定する If (psFiledName = sFiledName) Then
'対象のフィールドの場合、値を取得する Select Case iDataType Case SQL_VARCHAR
GetValueString = ZeroString(iColSize)
'SQLの値を取得する SQLGetData( _ hstmt, _ i, _ SQL_CHAR, _ StrPtr(GetValueString), iColSize, _ lngRetByteSize _ )
Case Else End Select End If Next i End If
End Function
'========================================================================== ' 関数名:GetValueDouble関数 ' 説 明:指定されたフィールドの値を取得する ' 呼 出:GetValueDouble(psFiledName As String) ' 引き数:psFiledName As String (I/ ) フィールド名 ' 戻り値:なし '========================================================================== Function GetValueDouble(psFiledName As String) As Double Dim lColCnt As Integer Dim i As Integer Dim sFiledName As String Dim Ret As Long Dim pNameLen As Integer Dim iDataType As Integer Dim iColSize As Long Dim iDecimal As Integer Dim ipNull As Integer Dim lngRetByteSize As Long
'SQLが実行されている場合に処理を行う IF hstmt Then
'カラム数を取得する SQLNumResultCols( _ hstmt, _ lColCnt _ )
'String領域確保 sFiledName = ZeroString(SQL_LEN)
For i = 1 To lColCnt 'フィールド名を取得する SQLDescribeCol( _ hstmt, _ i, _ StrPtr(sFiledName), _ SQL_LEN, _ pNameLen, _ iDataType, _ iColSize, _ iDecimal, _ ipNull _ )
'対象のフィールドか判定する If (psFiledName = sFiledName) Then
'対象のフィールドの場合、値を取得する Select Case iDataType Case SQL_INTEGER, SQL_SMALLINT, SQL_FLOAT, SQL_REAL, SQL_DOUBLE
SQLGetData( _ hstmt, _ i, _ SQL_DOUBLE, _ VarPtr(GetValueDouble), _ 0, _ lngRetByteSize _ )
Case Else End Select End If Next i End If
End Function
'========================================================================== ' 関数名:MoveFirst関数 ' 説 明:先頭行へカーソルを移動する ' 呼 出:MoveFirst() ' 引き数:なし ' 戻り値:なし '========================================================================== Function MoveFirst() As Integer
'先頭行へ移動する SQLFetchScroll( _ hstmt, _ SQL_FETCH_FIRST, _ 0 _ )
SQLFetch(hstmt)
End Function
'========================================================================== ' 関数名:MoveNext関数 ' 説 明:次行へカーソルを移動する ' 呼 出:MoveNext() ' 引き数:なし ' 戻り値:なし '========================================================================== Function MoveNext() As Integer Dim ret As Integer
'次行へ移動する ret = SQLFetchScroll( _ hstmt, _ SQL_FETCH_NEXT, _ 0 _ ) If (ret = SQL_NO_DATA) Then iEof = 1 Else iEof = 0 End If
End Function
'========================================================================== ' 関数名:Eof関数 ' 説 明:EOFの状態を返却する ' 呼 出:Eof() ' 引き数:なし ' 戻り値: 0:正常 ' : 1:EOF '========================================================================== Function Eof() As Integer
Eof = iEof
End Function
End Class
[/code]
呼び出しのサンプルです。 mdb名:test.mdb テーブル名:tbl_test フィールド1:filed01 int フィールド2:filed02 char(10)
[code] Dim a As *CDBClass
a = New CDBClass
a->ConnectOpen("DRIVER=Microsoft Access Driver(*.mdb);UID=;PWD=;DBQ=D:\test.mdb")
a->Execute("DELETE FROM tbl_test")
a->Execute("INSERT INTO tbl_test VALUES(1,'あ')")
a->Execute("INSERT INTO tbl_test VALUES(1,'い')")
a->Open("SELECT * FROM tbl_test")
While (a->Eof() = 0) ret = a->GetValueDouble("filed01") Buff = a->GetValueString("filed02") debug a->MoveNext() Wend
a->Close() a->ConnectClose()
Delete a
[/code]
|
|
|
投稿記事 |
Posted: 2005年7月27日(水) 10:29 |
|
|
|
|