by マティ » 2005年9月21日(水) 11:36
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]