以ado方式連結sqlserver資料庫和access資料庫 語言:c++
ADO中最重要的物件有三個:Connection、Recordset和Command,分別表示連線物件、記錄集物件和命令物件。
三個物件對應的智慧指標分別是:_ConnectionPtr、_RecordsetPtr、_CommandPtr。
ADO使用_ConnectionPtr這個指標來操縱Connection物件,類似地,後面用到的_CommandPtr和_RecordsetPtr分別表示命令物件指標和記錄集物件指標。
Connection物件是這三個物件的基礎,它的主要作用是建立與資料庫的連線,建立了與資料庫的連線後,才能進行其它有關資料庫的訪問和操作。也就是說,使用ADO操作資料庫,通常先用Connection物件的Open方法開啟一個庫連線,然後才能進行資料庫的操作。操作完成後,要關閉這個庫連線。
本文只講述Connection物件最常用的Open方法和Execute方法。
注意:在使用ADO進行操作之前,必須使用AfxOleInit()函式來進行初始化;
1. Open()方法
用於開啟一個庫連線,而Execute()方法一般用於執行一條SQL語句。
_ConnectionPtr智慧指標的用法:
首先定義一個Connection型別的指標,然後呼叫CreateInstance()來建立一個連線物件的例項,再呼叫Open()函式建立與資料來源的連線。
在建立連線物件後,可以使用連線物件的Execute()函式來執行SQL命令。
_ConnectionPtr智慧指標Open()方法的原型:
Open(_bstr_t ConnectionString,_bstr_t UserID,_bstr_t Password,long Options)
ConnectionString為連線字串,UserID是使用者名稱,Password是登陸密碼
Options是連線選項,可以是如下幾個常量:
1> adModeUnknown 預設,當前的許可權未設定
2> adModeRead 只讀
3> adModeWrite 只寫
4> adModeReadWrite 可以讀寫
5> adModeShareDenyRead 阻止其它Connection物件以讀許可權開啟連線
6> adModeShareDenyWrite 阻止其它Connection物件以寫許可權開啟連線
7> adModeShareExclusive 阻止其它Connection物件開啟連線
8> adModeShareDenyNone 阻止其它程式或物件以任何許可權建立連線
2. Execute方法
函式原型:
_RecordsetPtr Connection::Execute(_bstr_t CommandText,VARIANT* RecordsAffected,long Options)
引數:
CommandText是命令字串,通常是SQL命令,
RecordsAffected是操作完成後所影響的行數
Options表示CommandText中內容的型別,可以取下列值之一:
1> adCmdText 表明CommandText是文字命令
2>adCmdTable 表明CommandText是一個表名
3>adCmdProc 表明CommandText是一個儲存過程
4>adCmdUnknown 未知
Execute執行完後返回一個指向記錄集的指標(_ResultsetPtr型別)
3. 異常捕獲
出現的異常為:_com_error
例程CREATE_DB_AND_TABLE中已經使用了_ConnectionPtr指標的Open方法和Execute方法,在後面的例程我們將進一步詳細說明。
//使用ado方式連結資料庫需要匯入msado15.dll 模組
#import "c:\program files\common files\system\ado\msado15.dll" no_namespace rename("EOF", "adoEOF") rename("BOF", "adoBOF")
//#import msado15.dll 後在編譯階段會生成 msado15.tlh原始檔,msado15.tlh預設是有namespace ADODB{}所有內容都包在這個名字空間中用了no_namespace則生成的標頭檔案中沒有namespace,所有內容是全域性的。
//rename的意思就是改名了,rename("EOF","adoEOF")改名為adoEOF,以免和C語言裡的EOF重名。
int main()
{
CoInitialize(NULL);//初始化com
_ConnectionPtr m_pConnect = NULL;
HRESULT hr = m_pConnect.CreateInstance(__uuidof(Connection));
if (FAILED(hr))
return -1;
try
{
// Open方法連線字串必須是BSTR或者_bstr_t型別
//Provider的屬性對於access和sqlserver有所不同. access資料庫用"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=./data/studetn.mdb;"這種格式連結資料庫,下面的格式是sqlserver格式
m_pConnect->Open("Provider=SQLOLEDB;Data Source=192.168.1.2;User ID=admin;Password=admin1234;Initial Catalog=student", "", "", NULL);
}
catch (_com_error &e)
{
cout << e.Description() << endl;
}//發生連結錯誤
_RecordsetPtr pRecordset;
if (FAILED(pRecordset.CreateInstance(__uuidof(Recordset))))
{
return -1;
}
try
{
pRecordset = m_pConnect->Execute(_bstr_t("select * from class1"),
NULL, adCmdText);//將查詢資料匯入m_pRecordset資料容器
}
catch (_com_error &e)
{
cout << e.Description() << endl;
}//
_variant_t cls;
string last_pcls;
if (!pRecordset->adoBOF)//有記錄
{
try
{
pRecordset->MoveFirst();//移動到第一條記錄
while (!pRecordset->adoEOF)//還沒到結尾
{
//pcls = pRecordset->GetFields()->GetItem("name")->Value;
cls = pRecordset->GetFields()->GetItem("sex")->Value;
// 取下一條記錄
pRecordset->MoveNext();
}
}
catch (_com_error &e)
{
cout << e.Description() << endl;
}
}
if (pRecordset->GetState() == adStateOpen)
{
pRecordset->Close();
pRecordset = NULL;
}
if (m_pConnect)
{
m_pConnect->Close();
m_pConnect.Release();
}
CoUninitialize();
}