1. 程式人生 > >以ado方式連結sqlserver資料庫和access資料庫 語言:c++

以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();
}