?? cpingdatabase.h
字號(hào):
//版權(quán)有所:李巧平 2003年1月份 電子郵件:liqiaoping@163.com 個(gè)人主頁:http://mengyuworkroom.y365.com QQ:5542376
//封裝類CPingDatabase是操作數(shù)據(jù)庫的類,能插入、修改、查看、刪除ACCESS數(shù)據(jù)庫、SQLSERVER及所有的ODBC得用數(shù)據(jù)源來連接的數(shù)據(jù)庫。
//以下代碼在VC++6.0 ON WINDOWS2000 Professional上測(cè)試通過
//使用來類時(shí)出現(xiàn)一個(gè)警告,不用管它,那是微軟的一個(gè)動(dòng)態(tài)的原因。
//說明,以下方法返回值都為int型,具體含義如下列表:
// 正常:操作的實(shí)際記錄數(shù)
// -1 :成功
// -10 :失敗
// -5 :參數(shù)類型不符合要求
// -6 :未初始化
// -7 :數(shù)據(jù)庫未連接
#import "c:\program files\common files\system\ado\msado15.dll" no_namespace rename("EOF","adoEOF")
class CPingDatabase{
public:
_ConnectionPtr m_pConnection;
//初始化組件,成功為1,失敗為-5
//只能初始化一次,否敗會(huì)出錯(cuò)。
int _init()
{
return AfxOleInit()>0 ? -1:-10;
}
//連接數(shù)據(jù)庫,type支持file和odbc和sqlserver,且為小寫。為sqlserver時(shí),message項(xiàng)傳遞ip地址,source為庫
int _connectDatabase(char* type, char* source, char* user, char* password, char* message)
{
//先關(guān)閉連接
_closeDatabase();
try{ HRESULT hr;
CString sql;
if( strcmp( type, "file") == 0)
sql.Format("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=%s" ,source);
else if( strcmp( type, "odbc")==0 )
sql.Format("Data Source=%s;UID=%s;PWD=%s;",source, user, password);
else if( strcmp( type, "sqlserver") == 0)
sql.Format("driver={SQL Server};Server=%s;DATABASE=%s;UID=%s;PWD=%s", message, source, user, password);
else
{
strcpy( message, "類型應(yīng)該為type,odbc,sqlserver其中一種。");
return -5;
}
hr = this->m_pConnection.CreateInstance("ADODB.Connection");
if(SUCCEEDED(hr))
{
if( strcmp( type, "file") == 0)
hr = this->m_pConnection->Open( (_bstr_t)sql, "", "",adModeUnknown);//hr = this->m_pConnection->Open( (_bstr_t)sql, (_bstr_t)user, (_bstr_t)password,adModeUnknown);
else
hr = this->m_pConnection->Open( (_bstr_t)sql,"","",adModeUnknown);
}
else
{
strcpy( message, "為初始化組件");
return -6;
}
}catch(_com_error e)
{
strcpy( message, e.ErrorMessage() );
return -10;
}
strcpy( message, "成功連接數(shù)據(jù)庫!");
return -1;
}
//通過到指定的表table中讀出符合條件wide,指定的字段Fields到Values中,返回操作記錄數(shù)
int _selectDataFromDatabase(char* tablename, char* wide, CStringArray* Fields, CStringArray* Values, int counts, char* message)
{
//檢查是否已經(jīng)連接
if( !_checkDatabase() )
{
strcpy(message,"數(shù)據(jù)庫還沒有連接好,無效的數(shù)據(jù)操作!");
return -7;
}
int i=0;
try{ _RecordsetPtr m_pRecordset;
_variant_t vTemp;
//生成SQL語句
CString sql,temp;
temp.Format("select ");
for(i=0; i<Fields->GetSize(); i++)
temp = temp + Fields->GetAt(i) +",";
temp.TrimRight(",");
sql.Format("%s from %s %s", temp, tablename, wide);
m_pRecordset.CreateInstance("ADODB.Recordset");
m_pRecordset->Open( (_variant_t)sql,_variant_t((IDispatch*)this->m_pConnection,true),adOpenStatic,adLockOptimistic,adCmdText);
i=0;
while( (!m_pRecordset->adoEOF) && (i < counts))
{
for(int j=0; j<Fields->GetSize(); j++)
{
vTemp = m_pRecordset->GetCollect(_variant_t( Fields->GetAt(j) ));
if(vTemp.vt == VT_NULL)
(Values+i)->Add("");
else
(Values+i)->Add((LPCTSTR)(_bstr_t)vTemp);
}
i++;
m_pRecordset->MoveNext();
}
m_pRecordset->Close();
}catch(_com_error e)
{
strcpy( message, e.ErrorMessage());
return -10;
}
return i;
}
//成功插入,返回實(shí)際插入條數(shù)
int _insertDataToDatabase(char* tablename, CStringArray* Fields, CStringArray* Values, int counts, char* message)
{
//檢查是否已經(jīng)連接
if( !_checkDatabase() )
{
strcpy(message,"數(shù)據(jù)庫還沒有連接好,無效的數(shù)據(jù)操作!");
return -7;
}
int i=0;
try{ _RecordsetPtr m_pRecordset;
_variant_t vTemp;
//生成SQL語句
CString sql;
sql.Format("select * from %s",tablename);
m_pRecordset.CreateInstance("ADODB.Recordset");
m_pRecordset->Open( (_variant_t)sql,_variant_t((IDispatch*)this->m_pConnection,true),adOpenStatic,adLockOptimistic,adCmdText);
for(i=0; i<counts; i++)
{
m_pRecordset->AddNew();
for(int j=0; j<Fields->GetSize(); j++)
{
if( (Values+i)->GetAt(j).IsEmpty() || (Values+i)->GetAt(j)=="")
vTemp.vt = VT_NULL;
else
vTemp = (_variant_t)(Values+i)->GetAt(j);
m_pRecordset->PutCollect( (_variant_t)Fields->GetAt(j), vTemp);
}
}
m_pRecordset->AddNew();
// m_pRecordset->Close();
}catch(_com_error e)
{
strcpy( message, e.ErrorMessage());
return -10;
}
return i;
}
//修改一組符合條件的數(shù)據(jù),成功則返回修改的數(shù)目,失敗為0,出錯(cuò)為-1,不支持修改數(shù)組型
int _updateRecord(char* tablename,char* wide, CStringArray *Fields, CStringArray *Values, int counts, char* message)
{
//檢查是否已經(jīng)連接
if( !_checkDatabase() )
{
strcpy(message,"數(shù)據(jù)庫還沒有連接好,無效的數(shù)據(jù)操作!");
return -7;
}
int i=0;
try
{ CString sql,temp;
temp = "select ";
for(int j=0;j< Fields->GetSize() ;j++)
temp = temp + Fields->GetAt(j) + ",";
temp.TrimRight(",");
sql.Format("%s from %s %s", temp, tablename, wide);
_RecordsetPtr m_pRecordset;
m_pRecordset.CreateInstance("ADODB.Recordset");
m_pRecordset->Open( (_variant_t)sql,_variant_t((IDispatch*)this->m_pConnection,true),adOpenStatic,adLockOptimistic,adCmdText);
while( (!m_pRecordset->adoEOF) && (i < counts))///這里為什么是adoEOF而不是EOF呢?還記得rename("EOF","adoEOF")這一句嗎?
{
for(int j=0; j<Fields->GetSize(); j++)
m_pRecordset->PutCollect(_variant_t( Fields->GetAt(j) ),_variant_t( Values->GetAt(j) ));//修改
m_pRecordset->Update();///保存到庫中
m_pRecordset->MoveNext();///移到下一條記錄
i++;
}
m_pRecordset->Close();
}catch(_com_error e)///捕捉異常
{
strcpy( message, e.ErrorMessage());
return -10;
}
return i;
}
//刪除一組合條件的數(shù)據(jù),成功返回刪除的數(shù)目,失敗為0,出錯(cuò)為-1
int _deleteRecord(char* tablename, char* wide, int counts, char* message)
{
//檢查是否已經(jīng)連接
if( !_checkDatabase() )
{
strcpy( message,"數(shù)據(jù)庫還沒有連接好,無效的數(shù)據(jù)操作!");
return -7;
}
int i=0;
try
{ CString sql;
sql.Format("select * from %s %s",tablename,wide);
_RecordsetPtr m_pRecordset;
m_pRecordset.CreateInstance("ADODB.Recordset");
m_pRecordset->Open( (_variant_t)sql,_variant_t((IDispatch*)this->m_pConnection,true),adOpenStatic,adLockOptimistic,adCmdText);
while( (!m_pRecordset->adoEOF) && (i < counts))///這里為什么是adoEOF而不是EOF呢?還記得rename("EOF","adoEOF")這一句嗎?
{
m_pRecordset->Delete(adAffectCurrent);///刪除當(dāng)前記錄
m_pRecordset->MoveNext();
i++;
}
m_pRecordset->Close();
}catch(_com_error e)///捕捉異常
{
strcpy( message,e.ErrorMessage());
return -10;
}
return i;
}
//生存ID,若成功,則ID在message中,Field為數(shù)據(jù)插入日期字段
int _selectRecordId(char* tablename, char* Field, char* message)
{
//檢查是否已經(jīng)連接
if( !_checkDatabase() )
{
strcpy(message,"數(shù)據(jù)庫還沒有連接好,無效的數(shù)據(jù)操作!");
return -7;
}
CTime nowtime = CTime::GetCurrentTime();
CString temp = nowtime.Format(_T("%Y-%m-%d"));
try{ _RecordsetPtr m_pRecordset;
_variant_t vTemp;
CString sql;
sql.Format("select count(*) from %s where %s like '%s%%'", tablename, Field, temp);
m_pRecordset.CreateInstance("ADODB.Recordset");
m_pRecordset->Open( (_variant_t)sql,_variant_t((IDispatch*)this->m_pConnection,true),adOpenStatic,adLockOptimistic,adCmdText);
if(!m_pRecordset->adoEOF)
{
vTemp = m_pRecordset->GetCollect(_variant_t((long)0));
if(vTemp.vt == VT_NULL)
temp = "0";
else
temp = (LPCTSTR)(_bstr_t)vTemp;
}
m_pRecordset->Close();
sql.Format("%6d",atoi(temp)+1);
temp = nowtime.Format(_T("%Y%m%d"));
temp = temp + sql;
temp.Replace(" ","0");
}catch(_com_error e)
{
strcpy( message, e.ErrorMessage());
return -10;
}
strcpy( message, temp);
return -1;
}
//讀出符合條件的記錄數(shù)
int _selectCountsFromDatabase(char* tablename, char* wide, char* message)
{
//檢查是否已經(jīng)連接
if( !_checkDatabase() )
{
strcpy(message,"數(shù)據(jù)庫還沒有連接好,無效的數(shù)據(jù)操作!");
return -7;
}
int i=0;
try{ _RecordsetPtr m_pRecordset;
_variant_t vTemp;
CString sql;
sql.Format("select count(*) from %s %s", tablename, wide);
m_pRecordset.CreateInstance("ADODB.Recordset");
m_pRecordset->Open( (_variant_t)sql,_variant_t((IDispatch*)this->m_pConnection,true),adOpenStatic,adLockOptimistic,adCmdText);
if(!m_pRecordset->adoEOF)
{
vTemp = m_pRecordset->GetCollect(_variant_t((long)0));
if(vTemp.vt == VT_NULL)
i = 0;
else
i = atoi( (LPCTSTR)(_bstr_t)vTemp);
}
m_pRecordset->Close();
}catch(_com_error e)
{
strcpy( message, e.ErrorMessage());
return -10;
}
return i;
}
//檢查數(shù)據(jù)庫是否已經(jīng)連接好
bool _checkDatabase()
{
//檢查是否已經(jīng)連接
try
{
if((this->m_pConnection)->State)
return true;
}catch(...){;}
return false;
}
//關(guān)閉數(shù)據(jù)庫
void _closeDatabase()
{
try
{
if((this->m_pConnection)->State)
this->m_pConnection->Close(); ///如果已經(jīng)打開了連接則關(guān)閉它
}catch(...){;}
}
};
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -