#ifndef DATABASE_CONTROL_H
#define DATABASE_CONTROL_H
#pragma once
/*******************************************
文件名: ADO数据库操作
创建人: 陈泽丹
创建时间: 09-6-27
版本号: 1.0
描述: 实现一些基础操作
*******************************************/
class DataBase_Control
{
public:
static DataBase_Control* Get_DataBaseControlPoint()
{
if( NULL == pDataBase_Control)
{
pDataBase_Control = new DataBase_Control();
}
return pDataBase_Control;
}
bool OpenADO( char* str = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=Note.mdb");
void CloseADO();
// 判断是否有打开数据库
// 返回: true/false
bool IsOpen();
// 获取指定列的列名
// 输入: strCmd - 执行指令
// 输入: Return_LineNum - 数据库受影响的行数
// 返回: 返回结果记录集
// 备注: 如果只是读指令,受影响的行数将为0
_RecordsetPtr ExecuteSQLCmd(LPCWSTR strCmd, int& Return_LineNum);
// 获得记录集记录的数目
// 输入: pResultTable - 结果记录集的记录指针
// 返回: 记录的数目
int GetRecordCount(_RecordsetPtr pResultTable);
// 返回上一次指向的记录
// 输入: pResultTable - 结果记录集的记录指针
// 返回: true/false
bool MovePrevious(_RecordsetPtr pResultTable);
// 获得列的数目
// 输入: pResultTable - 结果记录集的记录指针
// 返回: 字段数目
int GetFieldCount(_RecordsetPtr pResultTable);
// 获取指定列的列名
// 输入: pResultTable - 结果记录集的记录指针
// 输入: nNumber - 记录指针的列ID(从0开始)
// 返回: 动态分配下的字符指针,记录查询结果
// 备注: 返回的指针需释放
char* GetFieldName(_RecordsetPtr pResultTable, long nNumber);
// 获取指定列的值
// 输入: pResultTable - 结果记录集的记录指针
// 输入: nNumber - 记录指针的列ID(从0开始)
// 返回: 指定列的值
_variant_t GetValue(_RecordsetPtr pResultTable, long nNumber);
private:
DataBase_Control();
~DataBase_Control(void);
static _ConnectionPtr pTheConn;
static DataBase_Control* pDataBase_Control;
};
#endif
////////////////////////////////////////////////////////////
#include "StdAfx.h"
#include "DataBase_Control.h"
DataBase_Control* DataBase_Control::pDataBase_Control = NULL;
_ConnectionPtr DataBase_Control::pTheConn = NULL;
using namespace std;
DataBase_Control::DataBase_Control(void)
{
::CoInitialize(NULL);
pTheConn.CreateInstance( _uuidof( Connection));
}
DataBase_Control::~DataBase_Control(void)
{
if( adStateOpen == pTheConn->GetState())
pTheConn->Close();
pTheConn->Release();
::CoUninitialize;
}
bool DataBase_Control::OpenADO(char* str)
{
if( adStateClosed == pTheConn->GetState())
pTheConn->Open(str,"","",adOpenUnspecified);
return IsOpen();
}
void DataBase_Control::CloseADO()
{
pTheConn->Close();
}
bool DataBase_Control::IsOpen()
{
if( adStateOpen == pTheConn->GetState())
return true;
return false;
}
_RecordsetPtr DataBase_Control::ExecuteSQLCmd(LPCWSTR strCmd, int& Return_LineNum)
{
try
{
//_RecordsetPtr Connection15::Execute ( _bstr_t CommandText, VARIANT * RecordsAffected, long Options )
//其中CommandText是命令字串,通常是SQL命令。
//参数RecordsAffected是操作完成后所影响的行数,
//参数Options表示CommandText中内容的类型,Options可以取如下值之一:
//adCmdText:表明CommandText是文本命令
//adCmdTable:表明CommandText是一个表名
//adCmdProc:表明CommandText是一个存储过程
//adCmdUnknown:未知
_variant_t RsAffected;
_RecordsetPtr pResultTable = pTheConn->Execute(strCmd,&RsAffected,adCmdText);
Return_LineNum = (int)RsAffected;
return pResultTable;
}
catch( _com_error &e)
{
}
}
int DataBase_Control::GetRecordCount(_RecordsetPtr pResultTable)
{
if( NULL == pResultTable)
return 0;
int nCount=0;
try
{
pResultTable->MoveFirst();
}
catch( _com_error &e)
{
return 0;
}
if( pResultTable->adoEOF)
return 0;
while( !pResultTable->adoEOF)
{
pResultTable->MoveNext();
nCount=nCount+1;
}
pResultTable->MoveFirst();
return nCount;
}
bool DataBase_Control::MovePrevious(_RecordsetPtr pResultTable)
{
try
{
pResultTable->MovePrevious();
}
catch( _com_error &e)
{
return false;
}
return true;
}
int DataBase_Control::GetFieldCount(_RecordsetPtr pResultTable)
{
int iCount;
try
{
iCount = pResultTable->GetFields()->GetCount();
}
catch( _com_error &e)
{
return 0;
}
return iCount;
}
char* DataBase_Control::GetFieldName(_RecordsetPtr pResultTable, long nNumber)
{
_bstr_t* vName = new _bstr_t[1];
try
{
*vName = pResultTable->GetFields()->GetItem(nNumber)->GetName();
}
catch(_com_error &e)
{
return NULL;
}
int len = strlen(*vName);
char* str = new char[len+1];
strcpy(str, (const char*)(*vName));
delete[] vName;
return str;
}
_variant_t DataBase_Control::GetValue(_RecordsetPtr pResultTable, long nNumber)
{
char* pstrName = GetFieldName(pResultTable, nNumber);
_variant_t v_value = pResultTable->Fields->GetItem(pstrName)->Value;
delete pstrName;
pstrName = NULL;
return v_value;
}
2万+

被折叠的 条评论
为什么被折叠?



