23 #pragma comment(lib, "odbc32.lib")
26 #pragma comment(lib, "mimodbcp.lib")
27 #pragma comment(lib, "minodbcw.lib")
28 #pragma comment(lib, "minsql32.lib")
41struct TPhFreeStmtHandle
43 void operator()(SQLHSTMT h)
47 ::SQLFreeHandle(SQL_HANDLE_STMT, h);
49 __except( EXCEPTION_EXECUTE_HANDLER )
51 ASSERT0(
false,
"",
"先に CTinySqlAccessor が Disconnect しているか Stop しているか破棄されています。" );
196 CReturnCode(
void) : m_type(0), m_handle(0), m_returnCode(SQL_SUCCESS)
208 CReturnCode(SQLSMALLINT type, SQLHANDLE handle, SQLRETURN rc,
bool isSilent =
false) : m_type(type), m_handle(handle), m_returnCode(rc)
235 operator bool(
void)
const
247 return (m_returnCode != SQL_SUCCESS && m_returnCode != SQL_SUCCESS_WITH_INFO);
258 switch ( m_returnCode )
261 case SQL_SUCCESS_WITH_INFO:
269 case SQL_INVALID_HANDLE:
270 s = _T(
"Invalid Handle");
276 s = _T(
"Unknown Error");
290 SQLRETURN rc = SQL_SUCCESS;
291 SQLSMALLINT record = 1;
292 while ( rc == SQL_SUCCESS )
295 SQLSMALLINT emLen = 0;
300 if ( rc == SQL_SUCCESS )
302 if ( withDiagnostics )
304 m_GetDiagField(record, SQL_DIAG_ROW_NUMBER, &c.
plm_Rownumber, SQL_IS_INTEGER);
325 case SQL_SUCCESS_WITH_INFO:
341 if ( m_returnCode != SQL_SUCCESS )
348 TTRACE2(
"No%d; state[%s]", i + 1, t.
sqlState);
357 SQLRETURN m_GetDiagField(SQLSMALLINT iRecord, SQLSMALLINT fDiagField, SQLPOINTER rgbDiagInfo, SQLSMALLINT cbDiagInfoMax, SQLSMALLINT* pcbDiagInfo = NULL)
const
359 return ::SQLGetDiagField(m_type, m_handle, iRecord, fDiagField, rgbDiagInfo, cbDiagInfoMax, pcbDiagInfo);
363 SQLRETURN m_returnCode;
515 m_hStmt = other.m_hStmt;
517 m_isLastNull =
false;
528 return ! m_hStmt.
IsNull();
552 if ( ! m_Rst(::SQLFetch(m_hStmt)) )
558 TBindWork &b = m_bindWorks[i];
560 if ( b.dataType == SQL_VARBINARY )
564 if ( ! m_Rst(::SQLGetData(m_hStmt, down_cast<SQLUSMALLINT>(i + 1),
Type_Binary, b.work.Ref(), ll, &b.length)) )
572 if ( b.size == 0x7FFFFFFF )
575 RETCODE rc = ::SQLGetData(m_hStmt, down_cast<SQLUSMALLINT>(i + 1), SQL_C_CHAR, &tmp, 1, &ll);
587 SQLSMALLINT cc = (
sizeof(TCHAR) == 1) ? SQL_C_CHAR : SQL_WCHAR;
588 if ( ! m_Rst(::SQLGetData(m_hStmt, down_cast<SQLUSMALLINT>(i + 1), b.dataType, b.work.Ref(), ll, &b.length),
true) )
590 if ( ! m_Rst(::SQLGetData(m_hStmt, down_cast<SQLUSMALLINT>(i + 1), cc, b.work.Ref(), ll, &b.length)) )
623 m_Check(index).Get(r);
638 m_Check(index).Get(r);
653 m_Check(index).Get(r);
668 m_Check(index).Get(r);
683 m_Check(index).Get(r);
698 m_Check(index).Get(r);
713 m_Check(index).Get(_v);
727 TBindWork& B = m_Check(index);
728 _v.
Reset(B.length, B.work.Ref());
741 return m_bindWorks[m_Find(index)];
756 if ( m_bindWorks[i].name.CompareNoCase(lpszLabel) == 0 )
780 return m_lastReturnCode;
792 SQLSMALLINT columnCount;
793 SQLRETURN r = ::SQLNumResultCols(m_hStmt, &columnCount);
794 if ( ! m_Rst(r,
true) )
799 m_bindWorks.
Resize(columnCount);
800 loop ( i, columnCount )
803 TBindWork& b = m_bindWorks[i];
804 SQLSMALLINT nullable;
805 r = ::SQLDescribeCol(m_hStmt,
806 down_cast<SQLUSMALLINT>(i + 1),
814 b.isNullable = (nullable != 0);
815 b.name.ReleaseBuffer();
820 TTRACE3(
"Col %d-[%s], type=%d, ", i + 1, b.name, b.dataType);
821 TTRACE3(
"size=%d, dec=%d, nullable=%d\n", b.size, b.decimalDigits, b.isNullable);
829 struct TBindWork : TColumnInformation
861 bool Get(
CAscii& _value)
const
882 bool Get(
double& _value)
const
888 if ( length <
sizeof(
double) )
892 _value = *
reinterpret_cast<const double*
>(work.
Ref());
897 if ( length <
sizeof(
float) )
901 _value = *
reinterpret_cast<const float*
>(work.
Ref());
924 bool Get(
float& _value)
const
929 _value =
static_cast<float>(d);
941 bool Get(
int& _value)
const
947 if ( length <
sizeof(
int) )
951 _value = *
reinterpret_cast<const int*
>(work.
Ref());
956 if ( length <
sizeof(
short) )
960 _value = *
reinterpret_cast<const short*
>(work.
Ref());
965 if ( length <
sizeof(BYTE) )
998 if ( length <
sizeof(TIMESTAMP_STRUCT) )
1002 const TIMESTAMP_STRUCT* T =
reinterpret_cast<const TIMESTAMP_STRUCT*
>(work.
Ref());
1004 _time.
wYear = T->year;
1006 _time.
wDay = T->day;
1007 _time.
wHour = T->hour;
1046 bool m_Get(
CStr& _value)
const
1061 _value.
Format(_T(
"%d"), v);
1068 _value.
Format(_T(
"%.2f"), v);
1077 _value.
Format(_T(
"%u"), work[0]);
1094 _value.
SetFromLeft(
reinterpret_cast<LPCTSTR
>(work.
Ref()), length);
1107 INDEX m_Find(
const CColumnIndex& index)
const
1109 if ( index.HasLabel() )
1114 if ( m_bindWorks[i].name.CompareNoCase(index.GetLabel()) == 0 )
1122 INDEX i = index.GetNumber();
1123 if ( m_bindWorks.
GetSize() > i - 1 )
1134 TBindWork& m_Check(
const CColumnIndex& index)
1136 INDEX i = m_Find(index);
1137 TBindWork& B = m_bindWorks[i];
1138 m_isLastNull = (B.length < 0);
1142 bool m_Rst(SQLRETURN rc = 0,
bool isSilent =
false)
1144 m_lastReturnCode = CReturnCode(SQL_HANDLE_STMT, m_hStmt, rc, isSilent);
1151 CReturnCode m_lastReturnCode;
1152 friend class CResultSetTest;
1274 SQLRETURN r = ::SQLGetStmtAttr(
m_hStmt, SQL_ATTR_QUERY_TIMEOUT,
static_cast<SQLPOINTER
>(&tm), SQL_IS_UINTEGER, NULL);
1277 return static_cast<DWORD
>(tm);
1301 SQLHSTMT hStmt = NULL;
1302 SQLRETURN r = ::SQLAllocHandle(SQL_HANDLE_STMT,
m_hDbc, &hStmt);
1310 ::SQLSetStmtAttr(
m_hStmt, SQL_ATTR_QUERY_TIMEOUT,
reinterpret_cast<SQLPOINTER
>(tm), 0);
1366 CPreparedStatement(SQLHDBC hDbc, LPCTSTR lpszSql, DWORD tm = 0) : _super(hDbc, tm), m_sql(lpszSql), m_isPrepared(false)
1385 _super::operator=(other);
1386 m_sql = other.m_sql;
1387 m_isPrepared =
false;
1402 return _super::Execute(lpszSql);
1413 if ( ! m_Prepare() )
1417 SQLRETURN r = ::SQLExecute(
m_hStmt);
1429 return m_BindParam(parameterIndex, SQL_C_NUMERIC, SQL_NUMERIC, SQL_NULL_DATA, NULL);
1441 return m_BindParam(parameterIndex, SQL_C_SLONG, SQL_INTEGER,
sizeof(value), &value);
1453 return m_BindParam(parameterIndex, SQL_C_DOUBLE, SQL_DOUBLE,
sizeof(value), &value);
1464 bool SetBinary(INDEX parameterIndex,
size_t size, LPCVOID P)
1466 SQLLEN l = down_cast<SQLLEN>(size);
1469 return SetNull(parameterIndex);
1471 return m_BindParam(parameterIndex, SQL_C_BINARY, SQL_BINARY, l, P);
1486 return SetNull(parameterIndex);
1488 return m_BindParam(parameterIndex, SQL_C_CHAR, SQL_CHAR, l, lpsz);
1504 return SetNull(parameterIndex);
1506 return m_BindParam(parameterIndex, SQL_C_WCHAR, SQL_WCHAR, l, lpsz);
1518 TIMESTAMP_STRUCT ts;
1520 ts.year = time.
wYear;
1523 ts.hour = time.
wHour;
1526 return m_BindParam(parameterIndex, SQL_C_TIMESTAMP, SQL_C_TIMESTAMP,
sizeof(ts), &ts);
1541 m_isPrepared =
false;
1542 return _super::CloseCursor();
1546 bool Execute(LPCTSTR lpszSql);
1554 bool m_Prepare(
void)
1557 if ( ! m_isPrepared )
1565 m_isPrepared =
true;
1570 bool m_BindParam(INDEX parameterIndex, SQLSMALLINT fCType, SQLSMALLINT fSqlType, SQLLEN len, LPCVOID P)
1572 if ( ! m_Prepare() )
1576 if ( m_bindParams.
GetSize() <= parameterIndex )
1578 m_bindParams.
SetSize(parameterIndex + 1);
1580 TBindWork* W = m_bindParams.
Get(parameterIndex);
1584 m_bindParams.
Set(parameterIndex, W);
1586 else if ( W->length == len )
1588 if ( len > 0 &&
ToInt(W->work.GetSize()) == len )
1590 memcpy(W->work.Ref(), P, len);
1596 if ( fCType == SQL_C_TIMESTAMP )
1598 W->work.Reset(len,
static_cast<const BYTE*
>(P));
1599 r = ::SQLBindParameter(
m_hStmt, down_cast<SQLUSMALLINT>(parameterIndex)
1600 , SQL_PARAM_INPUT, fCType, fSqlType, 23, 0, W->work.Ref(), 0, &W->length);
1602 else if ( len >= 0 )
1604 W->work.Reset(len,
static_cast<const BYTE*
>(P));
1605 r = ::SQLBindParameter(
m_hStmt, down_cast<SQLUSMALLINT>(parameterIndex)
1606 , SQL_PARAM_INPUT, fCType, fSqlType, len, 0, W->work.Ref(), len, &W->length);
1611 r = ::SQLBindParameter(
m_hStmt, down_cast<SQLUSMALLINT>(parameterIndex)
1612 , SQL_PARAM_INPUT, fCType, fSqlType, 13, 6, NULL, 0, &W->length);
1649 return m_hEnv != NULL;
1667 SQLRETURN r = ::SQLFreeHandle(SQL_HANDLE_DBC, m_hDbc);
1668 if ( ! m_Rst(SQL_HANDLE_DBC, m_hDbc, r) )
1674 r = ::SQLFreeHandle(SQL_HANDLE_ENV, m_hEnv);
1675 if ( ! m_Rst(SQL_HANDLE_ENV, m_hEnv, r) )
1694 SQLRETURN r = ::SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &m_hEnv);
1695 if ( ! m_CheckReturnCode(r) )
1702 r = ::SQLSetEnvAttr(m_hEnv, SQL_ATTR_ODBC_VERSION,
reinterpret_cast<SQLPOINTER
>(SQL_OV_ODBC3), 0);
1703 if ( m_CheckReturnCode(r) )
1706 r = ::SQLAllocHandle(SQL_HANDLE_DBC, m_hEnv, &m_hDbc);
1708 if ( ! m_CheckReturnCode(r) )
1710 ::SQLFreeHandle(SQL_HANDLE_ENV, m_hEnv);
1714 return m_Rst(SQL_HANDLE_ENV, m_hEnv, r);
1724 return m_isConnecting;
1741 SQLRETURN r = ::SQLEndTran(SQL_HANDLE_DBC, m_hDbc, SQL_COMMIT);
1743 r = ::SQLDisconnect(m_hDbc);
1744 if ( m_Rst(SQL_HANDLE_DBC, m_hDbc, r) )
1746 m_isConnecting =
false;
1762 bool Connect(LPCTSTR lpszDataBaseName, LPCTSTR lpszUserName, LPCTSTR lpszPassword)
1764 if ( m_PreConnect() )
1767 CStr dn = lpszDataBaseName;
1768 CStr un = lpszUserName;
1769 CStr pw = lpszPassword;
1771 if ( m_Rst(SQL_HANDLE_DBC, m_hDbc, r) )
1773 m_isConnecting =
true;
1789 bool Connect(LPCTSTR lpszConnect, SQLUSMALLINT options = SQL_DRIVER_NOPROMPT)
1791 if ( m_PreConnect() )
1793 CStr cs = lpszConnect;
1795 SQLHWND hWnd = ::GetDesktopWindow();
1797 SQLSMALLINT length = 0;
1798 SQLRETURN r = ::SQLDriverConnect(m_hDbc, hWnd,
GetSqlChar(cs), SQL_NTS,
GetSqlChar(n, 256), 256, &length, options);
1799 if ( m_Rst(SQL_HANDLE_DBC, m_hDbc, r) )
1801 m_isConnecting =
true;
1820 bool Connect(LPCTSTR lpszDriverName, LPCTSTR lpszDataBaseName, LPCTSTR lpszUserName, LPCTSTR lpszPassword, SQLUSMALLINT options = SQL_DRIVER_NOPROMPT)
1824 cs.
Format(_T(
"DRIVER={%s};Database=%s;UID=%s;PWD=%s;"), lpszDriverName, lpszDataBaseName, lpszUserName, lpszPassword);
1864 DWORD l = DWORD_MAX;
1866 SQLRETURN r = ::SQLGetConnectAttr(m_hDbc, SQL_AUTOCOMMIT, &l,
sizeof(l), &len);
1867 if ( m_Rst(SQL_HANDLE_DBC, m_hDbc, r) )
1869 return (l == SQL_AUTOCOMMIT_ON);
1883 DWORD l = isEnable ? SQL_AUTOCOMMIT_ON : SQL_AUTOCOMMIT_OFF;
1884 SQLRETURN r = ::SQLSetConnectAttr(m_hDbc, SQL_AUTOCOMMIT,
reinterpret_cast<SQLPOINTER
>(
static_cast<SQLLEN
>(l)), 0);
1885 return m_Rst(SQL_HANDLE_DBC, m_hDbc, r);
1896 SQLRETURN r = ::SQLEndTran(SQL_HANDLE_DBC, m_hDbc, SQL_COMMIT);
1897 return m_Rst(SQL_HANDLE_DBC, m_hDbc, r);
1908 SQLRETURN r = ::SQLEndTran(SQL_HANDLE_DBC, m_hDbc, SQL_ROLLBACK);
1909 return m_Rst(SQL_HANDLE_DBC, m_hDbc, r);
1918 return m_lastReturnCode;
1947 return reinterpret_cast<SQLCHAR*
>(_s.
GetBuffer(len));
1955 bool m_PreConnect(
void)
1964 bool m_CheckReturnCode(SQLRETURN r)
const
1969 bool m_Rst(SQLSMALLINT type = 0, SQLHANDLE handle = NULL, SQLRETURN rc = 0)
1971 m_lastReturnCode = CReturnCode(type, handle, rc);
1972 return m_CheckReturnCode(rc);
1978 bool m_isConnecting;
1979 CReturnCode m_lastReturnCode;
#define loop(VAR, CNT)
loop構文.
bool IsNull(void) const
[確認] NULLチェック
virtual size_t GetSize(void) const
[取得] 要素数取得
void RemoveAll(void)
[削除] 空化
void SetSize(size_t size)
[操作] サイズ指定
bool Set(INDEX index, TYP *P)
[設定] 要素の設定
static CStrT< TYP > BinaryToHexString(const IConstCollectionT< BYTE > &c)
[作成] バイナリ→HEX文字列
bool IsEmpty(void) const
[確認] 空チェック
void ReleaseBuffer(void)
[操作] 割り当てたバッファを開放.
static CStrT Fmt(const TCHAR *lpszFormat,...)
[作成] 書式付き文字列作成
double ToDouble(INDEX iOffset=0) const
[取得] 数値(double)へ変換
CStrT & SetFromLeft(const TYP *lpText, size_t iLen)
[代入] 文字数制限代入.
void Format(const TYP *lpszFormat,...)
[代入] 書式付き文字列代入.
int ToInt(INDEX iOffset=0, int iBase=10) const
[取得] 数値(int)へ変換
TYP * GetBuffer(size_t iLength=0)
[操作] 書き込みバッファ要求.
bool HasLabel(void) const
[確認] ラベル指定か?
CColumnIndex(LPCTSTR lpszLabel)
コンストラクタ.
LPCTSTR GetLabel(void) const
[取得] ラベル.
CColumnIndex(INDEX number)
コンストラクタ.
INDEX GetNumber(void) const
[取得] 番号.
簡易 SQL アクセサ用プリペアドステートメント.
CPreparedStatement & operator=(const CPreparedStatement &other)
コピーオペレータ.
bool SetBinary(INDEX parameterIndex, size_t size, LPCVOID P)
[設定] バイナリ設定.
bool SetInt(INDEX parameterIndex, int value)
[設定] int 値設定.
bool SetNull(INDEX parameterIndex)
[設定] NULL 値設定.
bool SetString(INDEX parameterIndex, LPCSTR lpsz)
[設定] 文字列設定.
bool SetDouble(INDEX parameterIndex, double value)
[設定] double 値設定.
bool SetTime(INDEX parameterIndex, const SYSTEMTIME &time)
[設定] タイムスタンプ設定.
CPreparedStatement(const CPreparedStatement &other)
コピーコンストラクタ.
bool ExecuteDirect(LPCTSTR lpszSql)
[設定] 実行.
bool SetString(INDEX parameterIndex, LPCWSTR lpsz)
[設定] 文字列設定.
virtual bool CloseCursor(void)
[設定] クローズカーソル.
CPreparedStatement(SQLHDBC hDbc, LPCTSTR lpszSql, DWORD tm=0)
コンストラクタ.
bool Execute(void)
[設定] 実行.
CResultSet(CStmtHandle hStmt)
コンストラクタ.
const TColumnInformation & GetColumnInformation(CColumnIndex index)
[取得] カラム情報取得.
float GetFloat(CColumnIndex index)
[取得] Float 値取得.
int GetInt(CColumnIndex index)
[取得] int 値取得.
CUnicode GetUnicodeString(CColumnIndex index)
[取得] 文字列取得.
CStr GetString(CColumnIndex index)
[取得] 文字列取得.
bool Next(void)
[設定] 次読み出し.
CReturnCode GetLastReturnCode(void) const
[取得] 戻り値詳細取得.
void GetTime(SYSTEMTIME &_v, CColumnIndex index)
[取得] タイムスタンプ値取得.
bool WasNull(void) const
[確認] NULL確認.
bool IsValid(void) const
[確認] 正しい情報?
double GetDouble(CColumnIndex index)
[取得] double 値取得.
INDEX FindColumn(LPCTSTR lpszLabel)
[取得] ラベル名検索.
void Destroy(void)
[設定] 使用不可.
size_t GetColumnCount(void) const
[取得] カラム数取得.
bool Binding(void)
バインド(現在はカラム情報取得のみ)
CAscii GetAsciiString(CColumnIndex index)
[取得] 文字列取得.
void GetBinary(CWorkMem &_v, CColumnIndex index)
[取得] バイナリデータ取得.
CResultSet & operator=(const CResultSet &other)
コピーオペレータ.
CResultSet(const CResultSet &other)
コピーコンストラクタ.
CVectorT< TCodes > CCodeVector
コード群配列管理
CStr GetErrorString(void) const
[取得] エラー文字列取得.
static bool IsReturnCodeSuccess(SQLRETURN r)
[確認] 成功確認.
SQLRETURN GetReturnCode(void) const
[取得] 戻り値取得.
CReturnCode(void)
コンストラクタ.
CCodeVector GetDetialCode(bool withDiagnostics=false) const
[取得] 詳細情報取得.
bool HasError(void) const
[確認] 失敗か?
CReturnCode(SQLSMALLINT type, SQLHANDLE handle, SQLRETURN rc, bool isSilent=false)
コンストラクタ.
CStatement(SQLHDBC hDbc, DWORD tm=0)
コンストラクタ.
CReturnCode m_lastReturnCode
最後の戻り値
CReturnCode GetLastReturnCode(void) const
[取得] 戻り値詳細取得.
bool IsValid(void)
[確認] 有効確認.
CResultSet GetResultSet(void) const
[取得] 結果セット取得.
CStatement & operator=(const CStatement &other)
コピーオペレータ.
bool m_Init(void)
[確認] 準備処理
void Destroy(void)
[設定] 使用不可.
bool m_Rst(SQLRETURN rc=0)
[確認] 戻り値処理
virtual bool CloseCursor(void)
[設定] クローズカーソル.
bool Execute(LPCTSTR lpszSql)
[設定] 実行.
DWORD GetQueryTimeout(void)
[取得] タイムアウト取得
CStmtHandle m_hStmt
ステートメントハンドル
CStatement(const CStatement &other)
コピーコンストラクタ.
bool Disconnect(void)
[設定] 切断.
static SQLTCHAR * GetSqlChar(CStr &_s, size_t len=0)
[変換] 文字列ポインタ取得.
CReturnCode GetLastReturnCode(void) const
[取得] 戻り値詳細取得.
void SetQueryTimeout(DWORD tm)
[設定] タイムアウト設定.
CPreparedStatement PreparedStatement(LPCTSTR lpszSql)
[作成] プリペアドステートメント作成.
bool Connect(LPCTSTR lpszDataBaseName, LPCTSTR lpszUserName, LPCTSTR lpszPassword)
[設定] 接続.
bool Commit(void)
[設定] コミット.
bool IsConnecting(void) const
[確認] 接続中か?
bool IsStarted(void) const
[確認] 開始している?.
CTinySqlAccessor(void)
コンストラクタ.
~CTinySqlAccessor(void)
デストラクタ.
bool Connect(LPCTSTR lpszConnect, SQLUSMALLINT options=SQL_DRIVER_NOPROMPT)
[設定] 接続.
static CStr SystemTimeToString(const SYSTEMTIME &time)
[変換] 時間文字列化.
bool Rollback(void)
[設定] ロールバック.
bool Connect(LPCTSTR lpszDriverName, LPCTSTR lpszDataBaseName, LPCTSTR lpszUserName, LPCTSTR lpszPassword, SQLUSMALLINT options=SQL_DRIVER_NOPROMPT)
[設定] 接続.
@ Type_Short
16bit signed 整数
@ Type_UnicodeString
UNICODE文字列
@ Type_AsciiString
ASCII文字列
@ Type_DoubleFloat
64bit double float 実数
@ Type_Float
32bit float 実数
@ Type_Integer
32bit signed 整数
CStatement CreateStatement(void)
[作成] ステートメント作成.
bool IsAutoCommit(void)
[取得] 自動コミット状態確認
bool SetAutoCommit(bool isEnable)
[設定] 自動コミット設定.
void OnCatch(void) const
[表示] 内容表示
virtual INDEX Add(const TYP &t)
[追加] 要素一つ追加.
size_t GetSize(void) const
[取得] サイズ取得
void Resize(size_t l)
[設定] サイズ再設定
void Reset(size_t l, const TYP *P)
[設定] 再設定
const TYP * Ref(void) const
[取得] ポインタ取得
TNB::CPointerHandleBaseT< SQLHSTMT, TPhFreeStmtHandle > CStmtHandle
簡易 SQL アクセサ用 STMT ハンドルハンドル.
size_t GetLen(LPCSTR lpsz)
[計算] 文字列長計算(ASCII/SJIS用)
int ToInt(LPCSTR lpsz, int iBase=10)
[変換] INT変換(ASCII/SJIS用).
void Zero(V &value)
[設定] ゼロクリア.
CStr ToString(const CSingleSetT< TYP > &v, TCHAR period=_T(','))
[変換] 文字列化.
SQLINTEGER plm_Rownumber
?
CStr errorMessage
エラーメッセージ
SQLINTEGER nativeError
エラー
virtual TYP Get(INDEX index) const
[取得] 要素の取得.