一個用功能強大的ODBC API 函式訪問資料庫類 (轉)
/*-- 專項技術學習 -訪問技術之OC
這個類 透過ODBC API 訪問ODBC 資料來源的資料表
功能簡介:能夠幫定一個臨時指定表,類的函式即可對該表
插入、增加、修改、簡單統計等等操作(注:透過動態改變表的資訊:表名字、
表欄位總數、欄位名字、欄位型別、欄位是否為數值、欄位是否為主鍵。這樣
就可以訪問ODBC 資料來源的所有表了)
另外提供一個函式 可以對該資料來源的其他表(包括幫定的表)進行
刪除、修改功能
LSZ 2001.08.25 */
/*頭*/
#ifndef _WDC_DATABASE_H
#define _WDC_DATABASE_H
#include <.h>
#include
#define MAX_FIELDS 500
#define MAX_ERROR_MSG 1024
#define MAX_DATA 500
class CWdcDatabase
{
public:
CWdcDatabase();
virtual ~CWdcDatabase();
BOOL Open(const CString& sDSN,
const CString& sTable,
const CString& sUserId,
const CString& sPass) ; /*開啟一個ODBC資料來源資料庫*/
public:
BOOL m_bOpen; /*標誌資料庫是否開啟*/
BOOL m_bBrackets; /*標識表名、欄位名是否用方擴號擴起來*/
int m_nError; /*ODBC錯誤返回程式碼*/
CString m_sQuery; /*操作ODBC 資料來源公用的語句,用於方便構造*/
CString m_sErrMsg; /*ODBC錯誤返回資訊*/
CString m_sDSN; /*ODBC 資料來源的 DSN*/
CString m_sTable; /*臨時繫結的表名*/
public:
void DropHstmt(); /*確保公共查詢的語句控制程式碼釋放*/
long GetRecordCount(CString &sSel); /*取得符合條件的記錄數*/
BOOL NextMatchingRecord(); /*查詢符合條件的下一條記錄*/
int SelectMatchingRecords(CString& sWhereContext); /*查詢符合條件的記錄*/
BOOL UpdateRecord(); /*臨時繫結的表的一條記錄*/
BOOL AddRecord(); /*增加臨時繫結表一條新記錄*/
BOOL DeleteRecord(CString &sWhereDelete); /*刪除臨時繫結表符合條件記錄*/
BOOL Execute(const CString &sText); /*一個SQL語句,注:可以執行過程*/
void Close(); /*關閉資料庫*/
public:
int m_nFields; /*臨時繫結表欄位的總數*/
CString m_ieldName[MAX_FIELDS]; /*臨時繫結表欄位名字*/
CString m_sFieldValue[MAX_FIELDS];/*臨時繫結表欄位值*/
BOOL m_bKeyField[MAX_FIELDS];/*臨時繫結表欄位是否為主鍵*/
BOOL m_bNumeric[MAX_FIELDS];/*臨時繫結表欄位是否為數值型別*/
private:
CString Quote(CString &sQuote); /*字串替換*/
RETCODE rc; /*ODBC API 涵數執行返回碼*/
HSTMT hstmt, hstmt_select; /*公共語句控制程式碼*/
unsigned char szDSN[200]; /*連線資料來源的 DSN */
unsigned char szID[200]; /*連線資料來源的 UID */
unsigned char szPassword[200]; /*連線資料來源的 PWD*/
unsigned char szQuery[3000]; /*公共執行的語句控制程式碼*/
unsigned char szTemp[1000]; /*公共使用的字串*/
CString sTemp ; /*公共使用的字串*/
HENV henv; /*環境控制程式碼*/
HDBC hdbc; /*ODBC 連線控制程式碼*/
};
#endif
/*實現檔案*/
#include "stdafx.h"
#include "WdcDatabase.h"
#include
#include
#ifdef _DE
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
CWdcDatabase::CWdcDatabase()
{
m_nError = 0;
m_bOpen = false;
m_nFields = 0;
m_bBrackets = false;
}
CWdcDatabase::~CWdcDatabase()
{
if(m_bOpen)
{
Close() ;
}
}
BOOL CWdcDatabase::Open(const CString& sDSN,
const CString& sTable,
const CString& sUserId,
const CString& sPassword)
{
if(m_bOpen)
{
Close() ;
}
hstmt_select = NULL ;
RETCODE rc ;
CString stemp ;
memset(szDSN,0x00,200) ;
memset(szID,0x00,200) ;
memset(szPassword,0x00,200) ;
/*Open Database */
SQLAllocEnv(&henv) ;
SQLAllocConnect(henv,&hdbc) ;
strcpy((char*)szDSN,sDSN) ;
stemp = sUserId ;
strcpy((char*)szID,stemp) ;
stemp = sPassword ;
strcpy((char*)szPassword,stemp) ;
m_sDSN = sDSN ;
m_sTable = sTable ;
rc = SQLConnect(hdbc,
szDSN,
SQL_NTS,
szID,
SQL_NTS,
szPassword,
SQL_NTS);
m_nError = (int) rc ;
if((rc == SQL_SUCCESS ) ||(rc == SQL_SUCCESS_WITH_INFO))
{
m_bOpen = TRUE ;
TRACE0("Open database Succeed !n") ;
return TRUE ;
}
else
{
m_bOpen = FALSE ;
TRACE0("Open Database Failed !n") ;
return FALSE ;
}
}
void CWdcDatabase::Close()
{
if(m_bOpen)
{
if(hstmt_select)
{
SQLFreeStmt(hstmt_select,SQL_DROP) ;
hstmt_select = NULL ;
}
SQLDinnect(hdbc) ; /*Dis hdbc*/
SQLFreeConnect(hdbc) ; /*Free Odbc*/
SQLFreeEnv(henv) ; /*Free henv*/
m_bOpen = false;
TRACE0("Close database Succeed !n") ;
}
}
BOOL CWdcDatabase::Execute(const CString &sSQL)
{
RETCODE rc ;
unsigned char szSQLSTATE[6] ;
SDWORD nErr ;
unsigned char msg[MAX_ERROR_MSG + 1] ;
SWORD cbmsg ;
m_sErrMsg = "" ;
m_sQuery = sSQL ;
if(!m_bOpen)
return FALSE ;
SQLAllocStmt(hdbc,&hstmt) ;
memset((char*)szQuery,0x00,sizeof(szQuery)) ;
strcpy((char*)szQuery,m_sQuery) ;
rc = SQLExecDirect(hstmt,
szQuery,
SQL_NTS) ;
m_nError = (int) rc ;
if(rc == SQL_SUCCESS || rc == SQL_SUCCESS_WITH_INFO)
{
SQLTransact(henv,hdbc,SQL_COMMIT);
SQLFreeStmt(hstmt,SQL_DROP) ;
return TRUE ;
}
else
{
m_sErrMsg = "" ;
while(SQLError(0,
0,
hstmt,
szSQLSTATE,
&nErr,
msg,
sizeof(msg),
&cbmsg) == SQL_SUCCESS)
m_sErrMsg = "tt" + (CString)msg + "n" ;
SQLFreeStmt(hstmt,SQL_DROP) ;
return FALSE ;
}
}
/*帶入條件為 Where 以後的條件*/
BOOL CWdcDatabase::DeleteRecord(CString &sWhereDelete)
{
RETCODE rc ;
unsigned char szSQLSTATE[6] ;
SDWORD nErr ;
unsigned char msg[MAX_ERROR_MSG+1] ;
SWORD cbmsg ;
CString sTemp ;
if(!m_bOpen)
return FALSE ;
m_sQuery = "" ;
m_sErrMsg = "" ;
/*開始構造刪除語句*/
m_sQuery.Format("Delete From %s ",m_sTable) ;
/* int ff =0 ;
for(int f= 0 ;f
if(m_bKeyField[f]) /*如果是表的主鍵
{
if(ff>0) /*如果主鍵超過2個,要把條件連線起來
m_sQuery += " AND " ;
ff++ ;
if (m_bNumeric[f])
sTemp.Format("%s=%s",m_sFieldName[f],m_sFieldValue[f]) ;
else
sTemp.Format("%s=%s",m_sFieldName[f],Quote(m_sFieldValue[f])) ;
m_sQuery += sTemp ;
}
}
*/
if(sWhereDelete !="")
m_sQuery +=" Where " + sWhereDelete ;
TRACE0(m_sQuery) ;
memset((char*)szQuery,0x00,sizeof(szQuery)) ;
strcpy((char*)szQuery,m_sQuery) ;
SQLAllocStmt(hdbc,&hstmt) ;
rc = SQLExecDirect(hstmt,
szQuery,
SQL_NTS) ;
m_nError = (int) rc ;
if(rc ==SQL_SUCCESS || rc == SQL_SUCCESS_WITH_INFO)
{ /*如果執行成功*/
SQLTransact(henv,hdbc,SQL_COMMIT);
SQLFreeStmt(hstmt,SQL_DROP) ;
return TRUE ;
}
else
{
m_sErrMsg = "" ;
while(SQLError(0,
0,
hstmt,
szSQLSTATE,
&nErr,
msg,
sizeof(msg),
&cbmsg) == SQL_SUCCESS)
m_sErrMsg = "tt" + (CString) msg + "n" ;
SQLFreeStmt(hstmt,SQL_DROP) ;
return FALSE ;
}
}
CString CWdcDatabase::Quote(CString &sText)
{
CString sResult="" ;
CString sChar ;
int iTextLen = sText.GetLength() ;
for(int p= 0 ;pos
sChar = sText.Mid(pos,1) ;
if (sChar == "'")
sChar = "''" ;
sResult += sChar ;
}
return CString("'" + sResult + "'") ;
}
BOOL CWdcDatabase::AddRecord()
{
unsigned char szSQLSTATE[6] ;
SDWORD nErr ;
unsigned char msg[MAX_ERROR_MSG+1] ;
SWORD cbmsg ;
CString sTemp ;
if(!m_bOpen)
return FALSE ;
m_sQuery.Format("Insert Into %s(",m_sTable) ;
int ff=0 ;
for(int f=0 ;f
if(ff>0)
m_sQuery += "," ;
ff ++ ;
m_sQuery += m_sFieldName[f] ;
}
m_sQuery += ") values(" ;
ff = 0 ;
for(f=0 ;f
if(ff>0)
m_sQuery += "," ;
ff ++ ;
/*---如果資料不為空*/
if(m_sFieldValue[f]!="")
{
if(m_bNumeric[f])
sTemp.Format("%s",m_sFieldValue[f]) ;
else
sTemp.Format("%s",Quote(m_sFieldValue[f])) ;
}
else
{ /*如果資料為空*/
sTemp.Format("%s","NULL") ;
}
m_sQuery += sTemp ;
}
m_sQuery += ")" ;
memset((char*)szQuery,0x00,sizeof(szQuery)) ;
strcpy((char*)szQuery,m_sQuery) ;
SQLAllocStmt(hdbc,&hstmt) ;
rc = SQLExecDirect(hstmt,
szQuery,
SQL_NTS) ;
m_nError = (int) rc ;
if(rc == SQL_SUCCESS || rc == SQL_SUCCESS_WITH_INFO)
{
SQLTransact(henv,hdbc,SQL_COMMIT);
SQLFreeStmt(hstmt,SQL_DROP) ;
hstmt=NULL ;
return TRUE ;
}
else
{
m_sErrMsg = "" ;
while(SQLError(0,
0,
hstmt,
szSQLSTATE,
&nErr,
msg,
sizeof(msg),
&cbmsg) == SQL_SUCCESS )
m_sErrMsg += "tt" + (CString) msg +"n" ;
SQLFreeStmt(hstmt,SQL_DROP) ;
return FALSE ;
}
}
/*更新表的指定紀錄*/
BOOL CWdcDatabase::UpdateRecord()
{
unsigned char szSQLSTATE[6] ;
SDWORD nErr ;
unsigned char msg[MAX_ERROR_MSG + 1] ;
SWORD cbmsg ;
RETCODE rc ;
CString sTemp ;
if(!m_bOpen)
return FALSE ;
m_sQuery.Format("Update %s Set ",m_sTable) ;
int ff = 0 ;
for(int f= 0 ;f
if (ff>0)
m_sQuery += "," ;
ff ++ ;
if(m_sFieldValue[f]!="") /*資料為空*/
{
if(m_bNumeric[f])
sTemp.Format("%s=%s",m_sFieldName[f],m_sFieldValue[f]) ;
else
sTemp.Format("%s=%s",m_sFieldName[f],Quote(m_sFieldValue[f])) ;
}
else
sTemp.Format("%s=%s",m_sFieldName[f],NULL) ;
m_sQuery += sTemp ;
}
m_sQuery += " Where " ;
ff = 0 ;
for(f=0 ;f
if(m_bKeyField[f]) /*如果為主鍵*/
{
if(ff>0)
m_sQuery += "," ;
ff ++ ;
if(m_bNumeric[f])
sTemp.Format("%s=%s",m_sFieldName[f],m_sFieldValue[f]) ;
else
sTemp.Format("%s=%s",m_sFieldName[f],Quote(m_sFieldValue[f])) ;
m_sQuery += sTemp ;
}
}
memset((char*)szQuery,0x00,sizeof(szQuery)) ;
strcpy((char*)szQuery,m_sQuery) ;
SQLAllocStmt(hdbc,
&hstmt) ;
rc = SQLExecDirect(hstmt,
szQuery,
SQL_NTS) ;
m_nError = (int) rc ;
if(rc == SQL_SUCCESS || rc == SQL_SUCCESS_WITH_INFO)
{
SQLTransact(henv,hdbc,SQL_COMMIT);
SQLFreeStmt(hstmt,SQL_DROP) ;
return TRUE ;
}
else
{
m_sErrMsg = "" ;
while(SQLError(0,
0,
hstmt,
szSQLSTATE,
&nErr,
msg,
sizeof(msg) ,
&cbmsg ) == SQL_SUCCESS )
m_sErrMsg += "tt" +(CString) msg + "n" ;
SQLFreeStmt(hstmt,SQL_DROP) ;
return FALSE ;
}
}
/* 查詢紀錄---
返回值
1: 即沒有錯誤發生的找到紀錄
-1: 在查詢過程中出現錯誤
0: 查詢過程當中沒有錯誤出現,但是沒有找到適合條件的紀錄,即沒有返回紀錄 */
int CWdcDatabase::SelectMatchingRecords(CString &sWhereContext)
{
unsigned char szSQLSTATE[6];
SDWORD nErr ;
unsigned char msg[MAX_ERROR_MSG+1] ;
SWORD cbmsg ;
CString sTemp ;
char szData[MAX_DATA] ;
SDWORD cbData ;
RETCODE rc ;
if(!m_bOpen)
return -1 ;
sTemp="" ;
int ff=0 ;
for(int j=0;j
if(ff>0)
sTemp += "," ;
ff ++ ;
sTemp += m_sFieldName[j] ;
}
if(sWhereContext == "")
m_sQuery.Format("Select %s from %s",sTemp,m_sTable) ;
else
m_sQuery.Format("Select %s From %s Where %s",sTemp,m_sTable,sWhereContext) ;
SQLAllocStmt(hdbc,&hstmt_select) ;
memset((char*)szQuery,0x00,sizeof(szQuery)) ;
strcpy((char*)szQuery,m_sQuery) ;
rc = SQLExecDirect(hstmt_select,
szQuery,
SQL_NTS) ;
m_nError = (int) rc ;
if(rc == SQL_SUCCESS || rc == SQL_SUCCESS_WITH_INFO)
{
rc = SQLFetch(hstmt_select );
if(rc == SQL_SUCCESS || rc == SQL_SUCCESS_WITH_INFO)
{ /*執行成功,並且有資料*/
for(int f = 0 ; f
rc = SQLGetData(hstmt_select,
f+1 ,
SQL_C_CHAR,
szData,
sizeof(szData) ,
&cbData ) ;
if(cbData != SQL_NULL_DATA)
{ /*如果資料不為空*/
if(rc == SQL_SUCCESS || rc == SQL_SUCCESS_WITH_INFO)
m_sFieldValue[f] = CString(szData) ;
else
m_sFieldValue[f] = "" ;
}
else
m_sFieldValue[f] = "" ;
}
return 1 ; /*執行成功,並且有資料*/
}
else if(rc == 100)
{ /*查詢成功,但是沒有資料*/
return 0 ;
}
}
m_sErrMsg = "" ;
while(SQLError(0,
0,
hstmt_select,
szSQLSTATE,
&nErr,
msg,
sizeof(msg),
&cbmsg) == SQL_SUCCESS )
m_sErrMsg += "tt" +CString(msg) + "n" ;
SQLFreeStmt(hstmt_select,SQL_DROP) ;
hstmt_select = NULL ;
return -1 ;
}
BOOL CWdcDatabase::NextMatchingRecord()
{
unsigned char szSQLSTATE[6] ;
SDWORD nErr ;
unsigned char msg[MAX_ERROR_MSG+1] ;
SWORD cbmsg ;
char szData[MAX_DATA] ;
SDWORD cbData ;
RETCODE rc ;
if(!m_bOpen)
return FALSE ;
rc = SQLFetch(hstmt_select) ;
if(rc == SQL_SUCCESS || rc == SQL_SUCCESS_WITH_INFO)
{
for(int f =0 ;f
rc = SQLGetData(hstmt_select,
f+1 ,
SQL_C_CHAR,
szData,
sizeof(szData),
&cbData) ;
if(cbData !=SQL_NULL_DATA)
{ /*如果資料不為空*/
if(rc == SQL_SUCCESS || rc == SQL_SUCCESS_WITH_INFO)
m_sFieldValue[f] = (CString) szData ;
else
m_sFieldValue[f] = "" ;
}
else
m_sFieldValue[f] = "" ;
}
return TRUE ;
}
m_sErrMsg = "" ;
while(SQLError(0,
0,
hstmt_select,
szSQLSTATE,
&nErr,
msg,
sizeof(msg),
&cbmsg )==SQL_SUCCESS )
m_sErrMsg += "tt" +CString (msg) + "n" ;
SQLFreeStmt(hstmt_select,SQL_DROP) ;
hstmt_select = NULL ;
return FALSE ;
}
/*統計符合條件的紀錄總數
返回值
-1: 執行出錯
>0: 執行成功,並且返回統計結果 */
long CWdcDatabase::GetRecordCount(CString &sSel)
{
unsigned char szSQLSTATE[6] ;
SDWORD nErr ;
unsigned char ErrMsg[500] ;
SWORD cbmsg;
long lRet ; /*返回值*/
unsigned char lpSelect[1000];
memset((char*)lpSelect,0x00,sizeof(lpSelect)) ;
if(sSel=="")
sTemp.Format("Select count(*) from %s ",m_sTable) ;
else
sTemp.Format("Select Count(*) From %s Where %s",m_sTable,sSel) ;
if(!m_bOpen)
return -1 ;
strcpy((char*)lpSelect,sTemp) ;
SQLAllocStmt(hdbc,&hstmt_select) ;
rc=SQLExecDirect(hstmt_select,
lpSelect,
SQL_NTS) ;
if(rc==SQL_SUCCESS || rc == SQL_SUCCESS_WITH_INFO)
{ /* SQLExecDirect True*/
SQLBindCol(hstmt_select,1,SQL_INTEGER,&lRet,sizeof(int),NULL) ;
rc = SQLFetch(hstmt_select) ;
if(rc == SQL_SUCCESS || rc == SQL_SUCCESS_WITH_INFO)
{ /*有資料*/
SQLFreeStmt(hstmt_select,SQL_DROP) ;
hstmt_select = NULL ;
return lRet ;
}
else if (rc == 100)
{ /*沒有資料*/
SQLFreeStmt(hstmt_select,SQL_DROP) ;
hstmt_select = NULL ;
return 0 ;
}
else if (rc < 0)
{ /*出錯*/
goto end ;
}
}
else
{ /* SQLExecDirect FALSE */
goto end ;
}
end:
{
m_sErrMsg = "" ;
while(SQLError(0,
0,
hstmt_select,
szSQLSTATE,
&nErr,
ErrMsg,
sizeof(ErrMsg),
&cbmsg)==SQL_SUCCESS)
m_sErrMsg += "tt" + CString(ErrMsg) +"n" ;
SQLFreeStmt(hstmt_select,SQL_DROP) ;
hstmt_select = NULL ;
return -1 ;
}
}
/*非常有用函式,用在確保語句控制程式碼釋放*/
void CWdcDatabase::DropHstmtSelect()
{
if(hstmt_select !=NULL)
{
SQLFreeStmt(hstmt_select,SQL_DROP) ;
hstmt_select = NULL ;
}
}
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-991456/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 直接透過ODBC API訪問SQL資料庫 (轉)APISQL資料庫
- 用JDBC訪問一個資料庫(轉)JDBC資料庫
- 用JDBC訪問一個資料庫JDBC資料庫
- 釋出一個.NET資料庫訪問類資料庫
- 封裝ADO訪問資料庫的兩個類 (轉)封裝資料庫
- 採用ODBC介面訪問MySQL指南 (轉)MySql
- 強大的拉姆表示式轉Sql 類庫 - SqlSugar 隱藏功能之LambdaSqlSugar
- 用perl訪問mysql資料庫(轉)MySql資料庫
- RazorSQL Mac—一個功能非常強大資料庫查詢工具SQLMac大資料資料庫
- PHP轉Go系列 | 推薦一個強大的Go語言工具函式庫PHPGo函式
- Mysql資料庫學習(四):常用Mysql C API 介紹和使用、封裝一個訪問Mysql資料庫的類MysqlDBMySql資料庫API封裝
- sql內建函式pivot強大的行轉列功能SQL函式
- 【資料庫】MFC ODBC(一)資料庫
- Step by Step TimesTen-- 使用ODBC訪問TimesTen資料庫C++篇(一個例子)(1)資料庫C++
- Step by Step TimesTen-- 使用ODBC訪問TimesTen資料庫C++篇(一個例子)(2)資料庫C++
- Serverless 解惑——函式計算如何訪問 Mongo 資料庫Server函式Go資料庫
- Serverless 解惑——函式計算如何訪問 Redis 資料庫Server函式Redis資料庫
- Serverless 解惑——函式計算如何訪問 MySQL 資料庫Server函式MySql資料庫
- Serverless 解惑——函式計算如何訪問 PostgreSQL 資料庫Server函式SQL資料庫
- 構建一個類jq的函式庫函式
- 寫一個通用資料訪問元件 (轉)元件
- Oracle,SqlServer,Access資料庫通用訪問類設計(轉)OracleSQLServer資料庫
- 遠端資料庫的訪問 (轉)資料庫
- Serverless 解惑——函式計算如何訪問 SQL Server 資料庫Server函式SQL資料庫
- 使用設計模式構建通用資料庫訪問類 (轉)設計模式資料庫
- 資料庫如何處理大資料訪問資料庫大資料
- PHP Oracle 資料庫函式庫(轉)PHPOracle資料庫函式
- 用連線池提高Servlet訪問資料庫的效率 (轉)Servlet資料庫
- 使用Visual Basic訪問資料庫幾個注意的問題 (轉)資料庫
- jdbc-odbc連線資料庫 (轉)JDBC資料庫
- 利用ODBC實現Domino和關聯式資料庫的互操作 (轉)資料庫
- 透過socket訪問資料庫(轉)資料庫
- JSP訪問資料庫大全(轉)JS資料庫
- MySql資料庫C++訪問(轉)MySql資料庫C++
- C# SQLite資料庫 訪問封裝類C#SQLite資料庫封裝
- 一款強大的資料庫提取資料工具資料庫
- 使用MyBatis搭建一個訪問mysql資料庫的簡單示例MyBatisMySql資料庫
- 用VC訪問Sybase資料庫(用Sybase提供的ct-library介面) (轉)資料庫