ADO数据库操作

#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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值