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