天天看點

VS2008(VC++)使用Ado讀取SQL Server和Access資料庫

.建立一個對話框工程

在stdafx.h檔案中加入下面一句話引用

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

2.建立一個普通類,這裡類名字是AdoDBControl

3.在AdoDBControl.h文檔中添加以下變量和函數聲明

private:

 _ConnectionPtr   m_pConnection;

public:

 bool Open(_bstr_t ConnectionString, long Options );

 void Close(void);

 vector< vector< _variant_t> > Select(BSTR strSql) ;

4.因為使用了vector是以要包含vector還用引用命名空間std:vector

#include <vector>

using std::vector;

5.在AdoDBControl.cpp文檔中實作函數

AdoDBControl::AdoDBControl(void)

{

 ::CoInitialize(NULL); //初始化OLE/COM庫環境 

 m_pConnection=NULL;

}

AdoDBControl::~AdoDBControl(void)

{

 if(m_pConnection) 

  m_pConnection->Close(); 

 m_pConnection=NULL; 

 ::CoUninitialize(); //釋放程式占用的COM 資源

}

bool AdoDBControl::Open(_bstr_t ConnectionString, long Options )

{

 if( FAILED( m_pConnection.CreateInstance(__uuidof(Connection)) ) ) //初始化Connection指針

  return false;

 try{

  m_pConnection->Open(ConnectionString, "", "", Options);

 }catch(_com_error e)

 {

  AfxMessageBox(e.Description());

  return false;

 }

 return true;

}

// 關閉資料庫連接配接 

void AdoDBControl::Close(void) 

 if(m_pConnection) 

  m_pConnection->Close(); 

 m_pConnection=NULL; 

}

// 查詢 

//strSql:查詢語句 

//strName:要傳回的記錄集内的列名 

vector<vector<_variant_t>> AdoDBControl::Select(BSTR strSql) 

 _RecordsetPtr pRecordset; //定義資料集對象 

 vector<vector<_variant_t>> vRecord; //這是C++0x新标準,不是VS2010或者不支援新标準的, 

 //要寫成vector< vector<_variant_t> >,因為>>會被認為是右移操作符 

 if( FAILED( pRecordset.CreateInstance(__uuidof(Recordset)) ) ) //初始化Recordset指針 

  return vector<vector<_variant_t>>(); 

 try{ 

  pRecordset->Open(strSql, (IDispatch*)m_pConnection, adOpenDynamic, adLockOptimistic, adCmdText);//adOpenDynamic:動态 adLockOptimistic樂觀封鎖法 adCmdText:文本查詢語句

  pRecordset->MoveFirst(); 

  while(!pRecordset->adoEOF)//周遊所有記錄 

  { 

   //取記錄字段值 

   vector<_variant_t> vTheValue; //VARIANT資料類型的泛型 

   for(long i=0; i<pRecordset->GetFields()->Count; i++){

    _variant_t v = pRecordset->GetFields()->GetItem(i)->Value;

    vTheValue.push_back(v);

   }

    vRecord.push_back(vTheValue); 

   pRecordset->MoveNext(); //移動到下一條記錄 

  } 

  pRecordset->Close(); //關閉連接配接 

  pRecordset = NULL; 

 }catch( _com_error e) 

 { 

  AfxMessageBox(e.Description()); 

 } 

 return vRecord; 

}

 6.調用這個簡單的類

AdoDBControl myAdoControl;//對象聲明

myAdoControl.Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=F:\\1.mdb", "", "", adModeUnknown);//這個是access資料庫

 myAdoControl.Select(L"SELECT * from table1");

 myAdoControl.Close();

//本地服務是(local),local兩邊括号也是要的

 myAdoControl.Open("Provider=SQLOLEDB;Data Source=192.168.1.1;Initial Catalog=databasename;User ID=login;Password=password;", adModeUnknown);

 vector<vector<_variant_t>> vvv = myAdoControl.Select(L"SELECT * FROM table1");

 myAdoControl.Close();

7.有了這個簡單的類,剩下的就可以自己去慢慢啃了