VC连接SqlServer,Access,Oracle数据库

#include <windows.h>
#include <stdio.h>

#import   "C:\Program Files\Common Files\System\ado\msado15.dll"  no_namespace  rename( "EOF", "adoEOF ") 

enum DateSourceType {SqlServer,Access,Oracle};

class ADODB
{
public:
    ADODB(void);
    ~ADODB(void);
   
private:
 char * strConnect;
 int  _DateSourceType;
 
 char * _ServerIP;
 char * _DataBase;
 char * _UserID;
 char * _Password;
 
 char  * _DBFilePath;
public:
 _ConnectionPtr m_Connection;
 _RecordsetPtr  m_RecordSet;
 
 void MakeConnectStrSqlServer(char * ServerIP,char * DataBase,char * UserID, char * Password);
 void MakeConnectStrAccess(char  * DBFilePath);
 void MakeConnectStrOracle(char * ServerIP,char * DataBase,char * UserID,char * Password);
 void OpenConnection(); 
    _RecordsetPtr& GetRecordSet(_bstr_t sql);
    BOOL ExecuteSql(_bstr_t sql);
    void ExitConnection();
 void TestADODB(char * TableName);
};


ADODB::ADODB(void)
{
 CoInitialize(NULL);
}

ADODB::~ADODB(void)
{
 CoUninitialize();
}

void ADODB::MakeConnectStrSqlServer(char * ServerIP,char * DataBase,char * UserID, char * Password)
{
 _ServerIP=ServerIP;
 _DataBase=DataBase;
 _UserID=UserID;
 _Password=Password;
 
 _DateSourceType=SqlServer;
 
 //创建connection连接对象
 m_Connection.CreateInstance("ADODB.Connection");      
 //设置连接字符串,使用前需要赋值
 char * strConnect=(char *)calloc(1024,sizeof(char));
 
 sprintf(strConnect,"server=%s,database=%s",ServerIP,DataBase);
 m_Connection->Provider="SQLOLEDB.1";
 m_Connection->Open(strConnect,UserID,Password,adModeUnknown);
}
void ADODB::MakeConnectStrAccess(char * DBFilePath)
{
 _DBFilePath=DBFilePath;
 _DateSourceType=Access;
 
 m_Connection.CreateInstance("ADODB.Connection");   
 char * strConnect=(char *)calloc(1024,sizeof(char));
 //针对Access数据库的连接字符串,请相应修改
    sprintf(strConnect,"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=%s;Mode=ReadWrite;Persist Security Info=False",DBFilePath);
    m_Connection->Open(strConnect,"","",adModeUnknown);
}

void ADODB::MakeConnectStrOracle(char * ServerIP,char * DataBase,char * UserID, char * Password)
{
 _ServerIP=ServerIP;
 _UserID=UserID;
 _Password=Password;
 _DataBase=DataBase;
 
 _DateSourceType=Oracle;
 
    //′创建connection连接对象
 m_Connection.CreateInstance("ADODB.Connection");      
 //设置连接字符串,使用前需要赋值
 char * strConnect=(char *)calloc(1024,sizeof(char));
 
 //没有配置oracle客户端情况下ado连接字符串,通过测试
 sprintf(strConnect,"Provider=OraOLEDB.Oracle.1;User ID=%s;Password=%s;Persist Security Info=True;Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=%s)(PORT=1521))(CONNECT_DATA=(SERVER=default)(SERVICE_NAME=%s)))",_UserID,_Password,_ServerIP,_DataBase);//DataBase为SID
 // 配置好了oracle客户端 情况下ado连接字符串,通过测试
 // sprintf(strConnect,"Provider=OraOLEDB.Oracle.1;User ID=%s;Password=%s;Persist Security Info=True;server=%s;Data Source=%s",UserID,_Password,_ServerIP,_DataBase);//DataBase=本地服务名
 
 m_Connection->Open(strConnect,"","",adConnectUnspecified);
}


void ADODB::OpenConnection()
{
 
 switch(_DateSourceType)
 {
 case SqlServer:
  MakeConnectStrSqlServer(_ServerIP,_DataBase,_UserID,_Password);
  break;
 case Access:
  MakeConnectStrAccess(_DBFilePath);
  break;
 case Oracle://需要安装Oracle Client
  MakeConnectStrOracle(_ServerIP,_DataBase,_UserID,_Password);
  break;
 default:
  break;
 }
}

_RecordsetPtr& ADODB::GetRecordSet(_bstr_t sql)
{
    if(m_Connection == NULL)
    {
        OpenConnection();
    }
   
    try
    {
  m_RecordSet.CreateInstance(__uuidof(Recordset));
  m_RecordSet->Open(sql,m_Connection.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText);
    }
    catch(_com_error e)
    {
  m_RecordSet=NULL;
    }
    return m_RecordSet;
}

BOOL ADODB::ExecuteSql(_bstr_t sql)
{
 bool ExecuteFlag=true;
    _variant_t affect;
   
    if(m_Connection == NULL)
    {
        OpenConnection();
    }
   
    try
    {
        m_Connection->Execute(sql,NULL,adCmdText);
    }
    catch(_com_error e)
    {
        ExecuteFlag= FALSE;
    }
 
 return ExecuteFlag;   
}

void ADODB::ExitConnection()
{
    if(m_RecordSet != NULL)
    {
        m_RecordSet->Close();
    }
   
    m_Connection->Close();
}

void ADODB::TestADODB(char * TableName)
{
 char * Sql=(char *)calloc(256,sizeof(char));
 sprintf(Sql,"select * from  [%s]",TableName);
 
 GetRecordSet(Sql); 
 
 int ColmNum=m_RecordSet->Fields->GetCount();
 for(int j=0;j<ColmNum;j++)
 {
  printf("%s\t",(char *)(_bstr_t)m_RecordSet->Fields->GetItem(long(j))->GetName());
 }
 
 while(m_RecordSet->adoEOF==0)
 {
  printf("\n");
  for(int j=0;j<ColmNum;j++)
  {
   FieldPtr pField=m_RecordSet->Fields->GetItem(long(j));
   DataTypeEnum FieldType=pField->GetType();
   
   _variant_t TheV=m_RecordSet->GetCollect(pField->GetName());
   if(TheV.vt!=VT_NULL)
    
    switch(FieldType)
   {
   case 2:
   case 3:
    printf("%d\t",TheV.lVal);
    break;
   case 129:
    printf("%s\t",(LPCTSTR)(_bstr_t)TheV);
    break;
   default:
    printf("%s\t",(LPCTSTR)(_bstr_t)TheV);
    break;
   }
  } 
  printf("\n");
  
  m_RecordSet->MoveNext();
 }
 ExitConnection();
}

 

void main()
{
 ADODB MyDB;
 
 //测试SqlServer
 //MyDB.MakeConnectStrSqlServer("127.0.0.1","TestDataBase","sa","sa");
 //MyDB.TestADODB("TestTable");
 
 //测试Access数据库
// MyDB.MakeConnectStrAccess("a.mdb");
// MyDB.TestADODB("test");
 
 //测试Oracle
 MyDB.MakeConnectStrOracle("10.0.0.139","orcl","scott","tigger");
 MyDB.TestADODB("salgrade"); 
}

posted @ 2013-03-04 21:06  陈声涛  阅读(242)  评论(0)    收藏  举报