;
帖子
3919 
精华
积分
11710 
鱼币
0 ¥ 
来自
大连 
在线时间
1858 小时 
注册时间
2007-6-11 
最后登录
2009-10-20 

贴图大师勋章新人进步勋章宣传大使勋章论坛元老勋章

3
发表于 2009-1-5 19:48 | 只看该作者
isual C++ ADO鏁版嵁搴撶紪绋嬪叆闂紙涓婏級 - 缂栫▼搴 - Powered by SupeSite

浣犵殑浣嶇疆锛缂栫▼搴 >> 璧勮 >> VC >> 鏁版嵁搴 >> 璇︾粏鍐呭 鍦ㄧ嚎鎶曠ǹ

isual C++ ADO鏁版嵁搴撶紪绋嬪叆闂紙涓婏級

鍙戝竷: 2008-6-26 12:17 |  浣滆: admin |   鏌ョ湅: 135娆

銆ADO 鏄洰鍓嶅湪Windows鐜涓瘮杈冩祦琛岀殑瀹㈡埛绔暟鎹簱缂栫▼鎶鏈侫DO鏄缓绔嬪湪OLE DB搴曞眰鎶鏈箣涓婄殑楂樼骇缂栫▼鎺ュ彛锛屽洜鑰屽畠鍏煎叿鏈夊己澶х殑鏁版嵁澶勭悊鍔熻兘锛堝鐞嗗悇绉嶄笉鍚岀被鍨嬬殑鏁版嵁婧愩佸垎甯冨紡鐨勬暟鎹鐞嗙瓑绛夛級鍜屾瀬鍏剁畝鍗曘佹槗鐢ㄧ殑缂栫▼鎺ュ彛锛屽洜鑰屽緱鍒颁簡骞挎硾鐨勫簲鐢ㄣ傝屼笖鎸夊井杞叕鍙哥殑鎰忓浘锛孫LE DB鍜孉DO灏嗛愭鍙栦唬 ODBC鍜孌AO銆傜幇鍦ㄤ粙缁岮DO鍚勭搴旂敤鐨勬枃绔犲拰涔︾睄鏈夊緢澶氾紝鏈枃鐫閲嶇珯鍦ㄥ垵瀛﹁呯殑瑙掑害锛岀畝瑕佹帰璁ㄤ竴涓嬪湪VC++涓娇鐢ˋDO缂栫▼鏃剁殑涓浜涢棶棰樸傛垜浠笇鏈涢槄璇绘湰鏂囦箣鍓嶏紝鎮ㄥADO鎶鏈殑鍩烘湰鍘熺悊鏈変竴浜涗簡瑙c

銆銆涓銆佸湪VC++涓娇鐢ˋDO缂栫▼

銆銆ADO瀹為檯涓婂氨鏄敱涓缁凙utomation瀵硅薄鏋勬垚鐨勭粍浠讹紝鍥犳鍙互璞′娇鐢ㄥ叾瀹冧换浣旳utomation瀵硅薄涓鏍蜂娇鐢ˋDO銆侫DO涓渶閲嶈鐨勫璞℃湁涓変釜锛 Connection銆丆ommand鍜孯ecordset锛屽畠浠垎鍒〃绀鸿繛鎺ュ璞°佸懡浠ゅ璞″拰璁板綍闆嗗璞°傚鏋滄偍鐔熸倝浣跨敤MFC涓殑ODBC绫伙紙CDatabase銆丆Recordset)缂栫▼锛岄偅涔堝涔燗DO缂栫▼灏卞崄鍒嗗鏄撲簡銆

銆銆浣跨敤ADO缂栫▼鏃跺彲浠ラ噰鐢ㄤ互涓嬩笁绉嶆柟娉曚箣涓锛

銆銆1銆佷娇鐢ㄩ澶勭悊鎸囦护#import

#import "C:\Program Files\Common Files\System\ADO\msado15.dll" \

no_namespace rename("EOF", "EndOfFile")

銆銆浣嗚娉ㄦ剰涓嶈兘鏀惧湪stdAfx.h鏂囦欢鐨勫紑澶达紝鑰屽簲璇ユ斁鍦ㄦ墍鏈塱nclude鎸囦护鐨勫悗闈€傚惁鍒欏湪缂栬瘧鏃朵細鍑洪敊銆

绋嬪簭鍦ㄧ紪璇戣繃绋嬩腑锛孷C++浼氳鍑簃sado15.dll涓殑绫诲瀷搴撲俊鎭紝鑷姩浜х敓涓や釜璇ョ被鍨嬪簱鐨勫ご鏂囦欢鍜屽疄鐜版枃浠秏sado15.tlh鍜 msado15.tli锛堝湪鎮ㄧ殑Debug鎴朢elease鐩綍涓嬶級銆傚湪杩欎袱涓枃浠堕噷瀹氫箟浜咥DO鐨勬墍鏈夊璞″拰鏂规硶锛屼互鍙婁竴浜涙灇涓惧瀷鐨勫父閲忕瓑銆傛垜浠殑绋嬪簭鍙鐩存帴璋冪敤杩欎簺鏂规硶灏辫浜嗭紝涓庝娇鐢∕FC涓殑COleDispatchDriver绫昏皟鐢ˋutomation瀵硅薄鍗佸垎绫讳技銆

銆銆2銆佷娇鐢∕FC涓殑CIDispatchDriver

銆銆灏辨槸閫氳繃璇诲彇msado15.dll涓殑绫诲瀷搴撲俊鎭紝寤虹珛涓涓狢OleDispatchDriver绫荤殑娲剧敓绫伙紝鐒跺悗閫氳繃瀹冭皟鐢ˋDO瀵硅薄銆

銆銆3銆佺洿鎺ョ敤COM鎻愪緵鐨凙PI

銆銆濡備娇鐢ㄥ涓嬩唬鐮侊細

CLSID clsid;

HRESULT hr = ::CLSIDFromProgID(L"ADODB.Connection", &clsid);

if(FAILED(hr))

{...}

::CoCreateInstance(clsid, NULL, CLSCTX_SERVER, IID_IDispatch, (void **)

&pDispatch);

if(FAILED(hr))

{...}

銆銆浠ヤ笂涓夌鏂规硶锛岀涓鍜岀浜岀绫讳技锛屽彲鑳界涓绉嶅ソ鐢ㄤ竴浜涳紝绗笁绉嶇紪绋嬪彲鑳芥渶楹荤儲銆備絾鍙兘绗笁绉嶆柟娉曚篃鏄晥鐜囨渶楂樼殑锛岀▼搴忕殑灏哄涔熸渶灏忥紝骞朵笖瀵笰DO鐨勬帶鍒惰兘鍔涗篃鏈寮恒

銆銆鎹井杞祫鏂欎粙缁嶏紝绗竴绉嶆柟娉曚笉鏀寔鏂规硶璋冪敤涓殑榛樿鍙傛暟锛屽綋鐒剁浜岀鏂规硶涔熸槸杩欐牱锛屼絾绗笁绉嶅氨涓嶆槸杩欐牱浜嗐傞噰鐢ㄧ涓夌鏂规硶鐨勬按骞充篃鏈楂樸傚綋浣犻渶瑕佺粫杩嘇DO鑰岀洿鎺ヨ皟鐢∣LE DB搴曞眰鐨勬柟娉曟椂锛屽氨涓瀹氳浣跨敤绗笁绉嶆柟娉曚簡銆

銆銆ADO缂栫▼鐨勫叧閿紝灏辨槸鐔熺粌鍦拌繍鐢ˋDO鎻愪緵鐨勫悇绉嶅璞(object)銆佹柟娉(method)銆佸睘鎬(property)鍜屽鍣紙collection锛夈傚彟澶栵紝濡傛灉鏄湪MS SQL鎴朞racle绛夊ぇ鍨嬫暟鎹簱涓婄紪绋嬶紝杩樿鑳界啛缁冧娇鐢⊿QL璇█銆

銆銆浜屻佷娇鐢#import鏂规硶鐨勭紪绋嬫楠

銆銆杩欓噷寤鸿鎮ㄤ娇鐢#import鐨勬柟娉曪紝鍥犱负瀹冩槗瀛︺佹槗鐢紝浠g爜涔熸瘮杈冪畝娲併

銆銆1銆 娣诲姞#import鎸囦护

銆銆鎵撳紑stdafx.h鏂囦欢锛屽皢涓嬪垪鍐呭娣诲姞鍒版墍鏈夌殑include鎸囦护涔嬪悗锛

#include //Include support for VC++ Extensions

#import "C:\Program Files\Common Files\System\ADO\msado15.dll" \

no_namespace rename("EOF", "adoEOF")

銆銆鍏朵腑icrsint.h鏂囦欢鍖呭惈浜哣C++鎵╁睍鐨勪竴浜涢澶勭悊鎸囦护銆佸畯绛夌殑瀹氫箟锛岀敤浜嶤OM缂栫▼鏃朵娇鐢ㄣ

銆銆2銆佸畾涔塤ConnectionPtr鍨嬪彉閲忥紝骞跺缓绔嬫暟鎹簱杩炴帴

銆銆寤虹珛浜嗕笌鏁版嵁搴撴湇鍔″櫒鐨勮繛鎺ュ悗锛屾墠鑳借繘琛屽叾浠栨湁鍏虫暟鎹簱鐨勮闂拰鎿嶄綔銆侫DO浣跨敤Connection瀵硅薄鏉ュ缓绔嬩笌鏁版嵁搴撴湇鍔″櫒鐨勮繛鎺ワ紝鎵浠ュ畠鐩稿綋浜 MFC涓殑CDatabase绫汇傚拰CDatabase绫讳竴鏍凤紝璋冪敤Connection瀵硅薄鐨凮pen鏂规硶鍗冲彲寤虹珛涓庢湇鍔″櫒鐨勮繛鎺ャ

銆銆鏁版嵁绫诲瀷 _ConnectionPtr瀹為檯涓婂氨鏄敱绫绘ā鏉縚com_ptr_t鑰屽緱鍒扮殑涓涓叿浣撶殑瀹炰緥绫伙紝鍏跺畾涔夊彲浠ュ埌msado15.tlh銆乧omdef.h 鍜宑omip.h杩欎笁涓枃浠朵腑鎵惧埌銆傚湪msado15.tlh涓湁锛

_COM_SMARTPTR_TYPEDEF(_Collection, __uuidof(_Collection));

銆銆缁忓畯鎵╁睍鍚庡氨寰楀埌浜哶ConnectionPtr绫汇俖ConnectionPtr绫诲皝瑁呬簡Connection瀵硅薄鐨処dispatch鎺ュ彛鎸囬拡锛屽強涓浜涘繀瑕佺殑鎿嶄綔銆傛垜浠氨鏄氳繃杩欎釜鎸囬拡鏉ユ搷绾礐onnection瀵硅薄銆傜被浼煎湴锛屽悗闈㈢敤鍒扮殑_CommandPtr鍜宊RecordsetPtr绫诲瀷涔熸槸杩欐牱寰楀埌鐨勶紝瀹冧滑鍒嗗埆琛ㄧず鍛戒护瀵硅薄鎸囬拡鍜岃褰曢泦瀵硅薄鐨勬寚閽堛

銆銆锛1锛夈佽繛鎺ュ埌MS SQL Server

銆銆娉ㄦ剰杩炴帴瀛楃涓茬殑鏍煎紡锛屾彁渚涙纭殑杩炴帴瀛楃涓叉槸鎴愬姛杩炴帴鍒版暟鎹簱鏈嶅姟鍣ㄧ殑绗竴姝ワ紝鏈夊叧杩炴帴瀛楃涓茬殑璇︾粏淇℃伅鍙傝寰蒋MSDN Library鍏夌洏銆

銆銆鏈緥杩炴帴瀛楃涓蹭腑鐨剆erver_name锛宒atabase_name锛寀ser_name鍜宲assword鍦ㄧ紪绋嬫椂閮藉簲璇ユ浛鎹㈡垚瀹為檯鐨勫唴瀹广

_ConnectionPtr pMyConnect=NULL;

HRESULT hr=pMyConnect.CreateInstance(__uuidof(Connection)));

if(FAILED(hr))return;

_bstr_t strConnect="Provider=SQLOLEDB; Server=server_name;"

"Database=database_name; uid=user_name; pwd=password;";

//connecting to the database server now:

try{pMyConnect->Open(strConnect,"","",NULL);}

catch (_com_error &e)

{

::MessageBox(NULL,e.Description(),"璀﹀憡",MB_OK 鈹 MB_ICONWARNING);

}

銆銆娉ㄦ剰Connection瀵硅薄鐨凮pen鏂规硶涓殑杩炴帴瀛楃涓插弬鏁板繀椤绘槸BSTR鎴朹bstr_t绫诲瀷銆傚彟澶栵紝鏈緥鏄洿鎺ラ氳繃OLE DB Provider寤虹珛杩炴帴锛屾墍浠ユ棤闇寤虹珛鏁版嵁婧愩

銆銆锛2锛夈侀氳繃ODBC Driver杩炴帴鍒癉atabase Server杩炴帴瀛楃涓叉牸寮忎笌鐩存帴鐢∣DBC缂栫▼鏃剁殑宸笉澶氾細

_bstr_t strConnect="DSN=datasource_name; Database=database_name; uid=user_name; pwd=password;";

銆銆姝ゆ椂涓嶰DBC缂栫▼涓鏍凤紝蹇呴』鍏堝缓绔嬫暟鎹簮銆

銆銆3銆佸畾涔塤RecordsetPtr鍨嬪彉閲忥紝骞舵墦寮鏁版嵁闆

銆銆瀹氫箟_RecordsetPtr鍨嬪彉閲忥紝鐒跺悗閫氳繃瀹冭皟鐢≧ecordset瀵硅薄鐨凮pen鏂规硶锛屽嵆鍙墦寮涓涓暟鎹泦銆傛墍浠ecordset瀵硅薄涓嶮FC涓殑CRecordset绫荤被浼硷紝瀹冧篃鏈夊綋鍓嶈褰曘佸綋鍓嶈褰曟寚閽堢殑姒傚康銆傚锛

_RecordsetPtr m_pRecordset;

if(!FAILED(m_pRecordset.CreateInstance( __uuidof( Recordset )))

{

m_pDoc->m_initialized=FALSE;

return;

}

try{

m_pRecordset->Open(_variant_t("mytable"),

_variant_t((IDispatch *)pMyConnect,true), adOpenKeyset,

adLockOptimistic, adCmdTable);

}

catch (_com_error &e)

{

::MessageBox(NULL,"鏃犳硶鎵撳紑mytable琛ㄣ","鎻愮ず",

MB_OK 鈹 MB_ICONWARNING);

}

銆銆Recordset瀵硅薄鐨凮pen鏂规硶闈炲父閲嶈锛屽畠鐨勭涓涓弬鏁板彲浠ユ槸涓涓猄QL璇彞銆佷竴涓〃鐨勫悕瀛楁垨涓涓懡浠ゅ璞$瓑绛夛紱绗簩涓弬鏁板氨鏄墠闈㈠缓绔嬬殑杩炴帴瀵硅薄鐨勬寚閽堛傛澶栵紝鐢–onnection鍜孋ommand瀵硅薄鐨凟xecute鏂规硶涔熻兘寰楀埌璁板綍闆嗭紝浣嗘槸鍙鐨勩

銆銆4銆佽鍙栧綋鍓嶈褰曠殑鏁版嵁

銆銆鎴戣涓鸿鍙栨暟鎹殑鏈鏂逛究鐨勬柟娉曞涓嬶細

try{

m_pRecordset->MoveFirst();

while(m_pRecordset->adoEOF==VARIANT_FALSE)

{

//Retrieve column's value:

CString sName=(char*)(_bstr_t)(m_pRecordset->Fields->GetItem

(_variant_t("name"))->Value);

short cAge=(short)(m_pRecordset->Fields->GetItem

(_variant_t("age"))->Value);

//Do something what you want to do:

......

m_pRecordset->MoveNext();

}

}//try

catch (_com_error &e)

{

CString str=(char*)e.Description();

::MessageBox(NULL,str+"\n鍙堝嚭姣涚梾浜嗐","鎻愮ず",

MB_OK 鈹 MB_ICONWARNING);

}

銆銆鏈緥涓殑name鍜宎ge閮芥槸瀛楁鍚嶏紝璇诲彇鐨勫瓧娈靛煎垎鍒繚瀛樺湪sName鍜宑Age鍙橀噺鍐呫備緥涓殑Fields鏄疪ecordset瀵硅薄鐨勫鍣紝 GetItem鏂规硶杩斿洖鐨勬槸Field瀵硅薄锛岃孷alue鍒欐槸Field瀵硅薄鐨勪竴涓睘鎬э紙鍗宠瀛楁鐨勫硷級銆傞氳繃姝や緥锛屽簲鎺屾彙鎿嶇旱瀵硅薄灞炴х殑鏂规硶銆備緥濡傦紝瑕佽幏寰桭ield 瀵硅薄鐨刅alue灞炴х殑鍊煎彲浠ョ洿鎺ョ敤灞炴у悕Value鏉ュ紩鐢ㄥ畠锛堝涓婁緥锛夛紝浣嗕篃鍙互璋冪敤Get鏂规硶锛屼緥濡傦細

CString sName=(char*)(_bstr_t)(m_pRecordset->Fields->GetItem

(_variant_t("name"))->GetValue());

銆銆浠庢渚嬭繕鍙互鐪嬪埌锛屽垽鏂槸鍚﹀埌杈捐褰曢泦鐨勬湯灏撅紝浣跨敤璁板綍闆嗙殑adoEOF灞炴э紝鍏跺艰嫢涓虹湡鍗冲埌浜嗙粨灏撅紝鍙嶄箣鍒欐湭鍒般傚垽鏂槸鍚﹀埌杈捐褰曢泦寮澶达紝鍒欏彲鐢˙OF灞炴с

銆銆鍙﹀锛岃鍙栨暟鎹繕鏈変竴涓柟娉曪紝灏辨槸瀹氫箟涓涓粦瀹氱殑绫伙紝鐒跺悗閫氳繃缁戝畾鐨勫彉閲忓緱鍒板瓧娈靛硷紙璇﹁鍚庨潰鐨勪粙缁嶏級銆

銆銆5銆佷慨鏀规暟鎹

銆銆鏂规硶涓锛

try{

m_pRecordset->MoveFirst();

while(m_pRecordset->adoEOF==VARIANT_FALSE)

{

m_pRecordset->Fields->GetItem

(_variant_t("濮撳悕"))->Value=_bstr_t("璧佃枃");

......

m_pRecordset->Update();

m_pRecordset->MoveNext();

}

}//try

銆銆鏀瑰彉浜哣alue灞炴х殑鍊硷紝鍗虫敼鍙樹簡瀛楁鐨勫笺

銆銆鏂规硶浜岋細

m_pRecordset->Fields->GetItem

(_variant_t("濮撳悕"))->PutValue(_bstr_t("璧佃枃"));

銆銆鏂规硶涓夛細灏辨槸鐢ㄥ畾涔夌粦瀹氱被鐨勬柟娉曪紙璇﹁鍚庨潰鐨勪粙缁嶏級銆

銆銆6銆佹坊鍔犺褰

銆銆鏂拌褰曟坊鍔犳垚鍔熷悗锛屽嵆鑷姩鎴愪负褰撳墠璁板綍銆侫ddNew鏂规硶鏈変袱绉嶅舰寮忥紝涓涓惈鏈夊弬鏁帮紝鑰屽彟涓涓垯涓嶅甫鍙傛暟銆

銆銆鏂规硶涓锛堜笉甯﹀弬鏁帮級锛

// Add new record into this table:

try{

if(!m_pRecordset->Supports(adAddNew)) return;

m_pRecordset->AddNew();

m_pRecordset->Fields->GetItem

(_variant_t("濮撳悕"))->Value=_bstr_t("璧佃枃");

m_pRecordset->Fields->GetItem

(_variant_t("鎬у埆"))->Value=_bstr_t("濂");

m_pRecordset->Fields->GetItem

(_variant_t("age"))->Value=_variant_t((short)20);

m_pRecordset->Fields->GetItem

(_variant_t("marry"))->Value=_bstr_t("鏈");

m_pRecordset->Update();

}//try

catch (_com_error &e)

{

::MessageBox(NULL, "鍙堝嚭姣涚梾浜嗐","鎻愮ず",MB_OK 鈹 MB_ICONWARNING);

}

銆銆杩欑鏂规硶寮勫畬浜嗚繕瑕佽皟鐢║pdate()銆

銆銆鏂规硶浜岋紙甯﹀弬鏁帮級锛

_variant_t varName ,narValue ;

varName[0] = L"濮撳悕";

varName = L"鎬у埆";

varName = L"age";

varName = L"marry";

narValue[0]=_bstr_t("璧佃枃");

narValue =_bstr_t("濂");

narValue =_variant_t((short)20);

narValue =_bstr_t("鏈");

const int nCrit = sizeof varName / sizeof varName[0];

// Create SafeArray Bounds and initialize the array

SAFEARRAYBOUND rgsaName ,rgsaValue ;

rgsaName[0].lLbound = 0;

rgsaName[0].cElements = nCrit;

SAFEARRAY *psaName = SafeArrayCreate( VT_VARIANT, 1, rgsaName );

rgsaValue[0].lLbound = 0;

rgsaValue[0].cElements = nCrit;

SAFEARRAY *psaValue = SafeArrayCreate( VT_VARIANT, 1, rgsaValue );

// Set the values for each element of the array

HRESULT hr1=S_OK.hr2=S_OK;

for( long i = 0 ; i < nCrit && SUCCEEDED( hr1 ) && SUCCEEDED( hr2 );i++)

{

hr1=SafeArrayPutElement(psaName, &i,&varName[i]);

hr2=SafeArrayPutElement(psaValue, &i,&narValue[i]); }

// Initialize and fill the SafeArray

VARIANT vsaName,vsaValue;

vsaName.vt = VT_VARIANT 鈹 VT_ARRAY;

vsaValue.vt = VT_VARIANT 鈹 VT_ARRAY;

V_ARRAY(&vsaName) = psaName;//&vsaName->parray=psaName;

//see definition in oleauto.h file.

V_ARRAY(&vsaValue) = psaValue;

// Add a new record:

m_pRecordset->AddNew(vsaName,vsaValue);

銆銆杩欑鏂规硶涓嶉渶瑕佽皟鐢║pdate锛屽洜涓烘坊鍔犲悗锛孉DO浼氳嚜鍔ㄨ皟鐢ㄥ畠銆傛鏂规硶涓昏鏄娇鐢⊿afeArray鎸洪夯鐑︺

銆銆鏂规硶涓夛細灏辨槸鐢ㄥ畾涔夌粦瀹氱被鐨勬柟娉曪紙璇﹁鍚庨潰鐨勪粙缁嶏級銆

銆7銆佸垹闄よ褰

銆銆璋冪敤Recordset鐨凞elete鏂规硶灏辫浜嗭紝鍒犻櫎鐨勬槸褰撳墠璁板綍銆傝浜嗚ВDelete鐨勫叾瀹冪敤娉曡鏌ラ槄鍙傝冩枃鐚

try{

m_pRecordset->MoveFirst();

while(m_pRecordset->adoEOF==VARIANT_FALSE)

{

CString sName=(char*)(_bstr_t)(m_pRecordset->Fields->GetItem

(_variant_t("濮撳悕"))->Value);

if(::MessageBox(NULL,"濮撳悕="+sName+"\n鍒犻櫎濂瑰悧锛",

"鎻愮ず",MB_YESNO 鈹 MB_ICONWARNING)==IDYES)

{

m_pRecordset->Delete(adAffectCurrent);

m_pRecordset->Update();

}

m_pRecordset->MoveNext();

}

}//try

catch (_com_error &e)

{

::MessageBox(NULL,"鍙堝嚭姣涚梾浜嗐","鎻愮ず",MB_OK 鈹 MB_ICONWARNING);

}

銆銆8銆佷娇鐢ㄥ甫鍙傛暟鐨勫懡浠

銆銆Command瀵硅薄鎵浠h〃鐨勫氨鏄竴涓狿rovider鑳藉鐞嗚В鐨勫懡浠わ紝濡係QL璇彞绛夈備娇鐢–ommand瀵硅薄鐨勫叧閿氨鏄妸琛ㄧず鍛戒护鐨勮鍙ヨ缃埌 CommandText灞炴т腑锛岀劧鍚庤皟鐢–ommand瀵硅薄鐨凟xecute鏂规硶灏辫浜嗐備竴鑸儏鍐典笅鍦ㄥ懡浠や腑鏃犻渶浣跨敤鍙傛暟锛屼絾鏈夋椂浣跨敤鍙傛暟锛屽彲浠ュ鍔犲叾鐏垫椿鎬у拰鏁堢巼銆

銆銆(1). 寤虹珛杩炴帴銆佸懡浠ゅ璞″拰璁板綍闆嗗璞

銆銆鏈緥涓〃绀哄懡浠ょ殑璇彞灏辨槸涓涓猄QL璇彞锛圫ELECT璇彞锛夈係ELECT璇彞涓殑闂彿?灏变唬琛ㄥ弬鏁帮紝濡傛灉瑕佸涓弬鏁帮紝灏卞鏀惧嚑涓棶鍙凤紝姣忎釜闂彿浠h〃涓涓弬鏁般

_ConnectionPtr Conn1;

_CommandPtr Cmd1;

ParametersPtr *Params1 = NULL; // Not an instance of a smart pointer.

_ParameterPtr Param1;

_RecordsetPtr Rs1;

try

{

// Create Connection Object (1.5 Version)

Conn1.CreateInstance( __uuidof( Connection ) );

Conn1->ConnectionString = bstrConnect;

Conn1->Open( bstrEmpty, bstrEmpty, bstrEmpty, -1 );

// Create Command Object

Cmd1.CreateInstance( __uuidof( Command ) );

Cmd1->ActiveConnection = Conn1;

Cmd1->CommandText = _bstr_t("SELECT * FROM mytable WHERE age< ?");

}//try

銆銆瑕佹敞鎰忓懡浠ゅ璞″繀椤讳笌杩炴帴瀵硅薄鍏宠仈璧锋潵鎵嶈兘璧蜂綔鐢紝鏈緥涓皢鍛戒护瀵硅薄鐨凙ctiveConnection灞炴ц缃负杩炴帴瀵硅薄鐨勬寚閽堬紝鍗充负姝ょ洰鐨勶細

Cmd1->ActiveConnection = Conn1;

銆銆(2). 鍒涘缓鍙傛暟瀵硅薄锛屽苟缁欏弬鏁拌祴鍊

// Create Parameter Object

Param1 = Cmd1->CreateParameter( _bstr_t(bstrEmpty),

adInteger,

adParamInput,

-1,

_variant_t( (long) 5) );

Param1->Value = _variant_t( (long) 5 );

Cmd1->Parameters->Append( Param1 );

銆銆鐢ㄥ懡浠ゅ璞$殑鏂规硶鏉ュ垱寤轰竴涓弬鏁板璞★紝鍏朵腑鐨勯暱搴﹀弬鏁帮紙绗笁涓級濡傛灉鏄浐瀹氶暱搴︾殑绫诲瀷锛屽氨濉-1锛屽鏋滄槸瀛楃涓茬瓑鍙彉闀垮害鐨勫氨濉叾瀹為檯闀垮害銆 Parameters鏄懡浠ゅ璞$殑涓涓鍣紝瀹冪殑Append鏂规硶灏辨槸鎶婂垱寤虹殑鍙傛暟瀵硅薄杩藉姞鍒拌瀹瑰櫒閲屻侫ppend杩涘幓鐨勫弬鏁版寜鍏堝悗椤哄簭涓嶴QL璇彞涓殑闂彿浠庡乏鑷冲彸涓涓瀵瑰簲銆

銆銆(3). 鎵ц鍛戒护鎵撳紑璁板綍闆

// Open Recordset Object

Rs1 = Cmd1->Execute( &vtEmpty, &vtEmpty2, adCmdText );

銆銆浣嗚娉ㄦ剰锛岀敤Command鍜孋onnection瀵硅薄鐨凟xecute鏂规硶寰楀埌鐨凴ecordset鏄彧璇荤殑銆傚洜涓哄湪鎵撳紑Recordset涔嬪墠锛屾垜浠棤娉曡缃畠鐨凩ockType灞炴э紙鍏堕粯璁ゅ间负鍙锛夈傝屽湪鎵撳紑涔嬪悗璁剧疆LockType涓嶈捣浣滅敤銆

銆銆鎴戝彂鐜扮敤涓婅堪鏂规硶寰楀埌璁板綍闆哛s1鍚庯紝涓嶄絾Rs1涓殑璁板綍鏃犳硶淇敼锛屽嵆浣跨洿鎺ョ敤SQL璇彞淇敼鍚屼竴琛ㄤ腑浠讳綍璁板綍閮戒笉琛屻

銆銆瑕佹兂鑳戒慨鏀规暟鎹紝杩樻槸瑕佺敤Recordset鑷繁鐨凮pen鏂规硶鎵嶈锛屽锛

try{

m_pRecordset->Open((IDispatch *) Cmd1, vtMissing,

adOpenStatic, adLockOptimistic, adCmdUnspecified);

}

catch (_com_error &e)

{

::MessageBox(NULL,"mytable琛ㄤ笉瀛樺湪銆","鎻愮ず",MB_OK 鈹 MB_ICONWARNING);

}

銆銆Recordset瀵硅薄鐨凮pen鏂规硶鐪熸槸澶ソ浜嗭紝鍏剁涓涓弬鏁板彲浠ユ槸SQL璇彞銆佽〃鍚嶅瓧銆佸懡浠ゅ璞℃寚閽堢瓑绛夈

銆銆9銆佸搷搴擜DO鐨勯氱煡浜嬩欢

銆銆閫氱煡浜嬩欢灏辨槸褰撴煇涓壒瀹氫簨浠跺彂鐢熸椂锛岀敱Provider閫氱煡瀹㈡埛绋嬪簭锛屾崲鍙ヨ瘽璇达紝灏辨槸鐢盤rovider璋冪敤瀹㈡埛绋嬪簭涓殑涓涓壒瀹氱殑鏂规硶锛堝嵆浜嬩欢鐨勫鐞嗗嚱鏁帮級銆傛墍浠ヤ负浜嗗搷搴斾竴涓簨浠讹紝鏈鍏抽敭鐨勫氨鏄瀹炵幇浜嬩欢鐨勫鐞嗗嚱鏁般

銆銆(1). 浠嶤onnectionEventsVt鎺ュ彛娲剧敓鍑轰竴涓被

銆銆涓轰簡鍝嶅簲_Connection鐨勯氱煡浜嬩欢锛屽簲璇ヤ粠ConnectionEventsVt鎺ュ彛娲剧敓鍑轰竴涓被锛

class CConnEvent : public ConnectionEventsVt

{

private:

ULONG m_cRef;

public:

CConnEvent() { m_cRef = 0; };

~CConnEvent() {};

STDMETHODIMP QueryInterface(REFIID riid, void ** ppv);

STDMETHODIMP_(ULONG) AddRef(void);

STDMETHODIMP_(ULONG) Release(void);

STDMETHODIMP raw_InfoMessage(

struct Error *pError,

EventStatusEnum *adStatus,

struct _Connection *pConnection);

STDMETHODIMP raw_BeginTransComplete(

LONG TransactionLevel,

struct Error *pError,

EventStatusEnum *adStatus,

struct _Connection *pConnection);

......

};

銆銆銆(2). 瀹炵幇姣忎竴涓簨浠剁殑澶勭悊鍑芥暟(鍑℃槸甯aw_鍓嶇紑鐨勬柟娉曢兘鎶婂畠瀹炵幇浜)锛

STDMETHODIMP CConnEvent::raw_InfoMessage(

struct Error *pError,

EventStatusEnum *adStatus,

struct _Connection *pConnection)

{

*adStatus = adStatusUnwantedEvent;

return S_OK;

};

銆銆鏈変簺鏂规硶铏界劧浣犲苟涓嶉渶瑕侊紝浣嗕篃蹇呴』瀹炵幇瀹冿紝鍙渶绠鍗曞湴杩斿洖涓涓猄_OK鍗冲彲銆備絾濡傛灉瑕侀伩鍏嶇粡甯歌璋冪敤锛岃繕搴斿湪鍏朵腑灏哸dStatus鍙傛暟璁剧疆涓篴dStatusUnwantedEvent锛屽垯鍦ㄦ湰娆¤皟鐢ㄥ悗锛屼互鍚庡氨涓嶄細琚皟鐢ㄤ簡銆

鍙﹀杩樺繀椤诲疄鐜癚ueryInterface, AddRef, 鍜孯elease涓変釜鏂规硶:

STDMETHODIMP CConnEvent::QueryInterface(REFIID riid, void ** ppv)

{

*ppv = NULL;

if (riid == __uuidof(IUnknown) 鈹傗攤

riid == __uuidof(ConnectionEventsVt)) *ppv = this;

if (*ppv == NULL)

return ResultFromScode(E_NOINTERFACE);

AddRef();

return NOERROR;

}

STDMETHODIMP_(ULONG) CConnEvent::AddRef() { return ++m_cRef; };

STDMETHODIMP_(ULONG) CConnEvent::Release()

{

if (0 != --m_cRef) return m_cRef;

delete this;

return 0;

}

銆銆(3). 寮濮嬪搷搴旈氱煡浜嬩欢

// Start using the Connection events

IConnectionPointContainer *pCPC = NULL;

IConnectionPoint *pCP = NULL;

hr = pConn.CreateInstance(__uuidof(Connection));

if (FAILED(hr)) return;

hr = pConn->QueryInterface(__uuidof(IConnectionPointContainer),

(void **)&pCPC);

if (FAILED(hr)) return;

hr = pCPC->FindConnectionPoint(__uuidof(ConnectionEvents), &pCP);

pCPC->Release();

if (FAILED(hr)) return;

pConnEvent = new CConnEvent();

hr = pConnEvent->QueryInterface(__uuidof(IUnknown), (void **) &pUnk);

if (FAILED(hr)) return rc;

hr = pCP->Advise(pUnk, &dwConnEvt);

pCP->Release();

if (FAILED(hr)) return;

pConn->Open("dsn=Pubs;", "sa", "", adConnectUnspecified);

銆銆涔熷氨鏄鍦ㄨ繛鎺(Open)涔嬪墠灏卞仛杩欎簺浜嬨

銆銆(4). 鍋滄鍝嶅簲閫氱煡浜嬩欢

pConn->Close();

// Stop using the Connection events

hr = pConn->QueryInterface(__uuidof(IConnectionPointContainer),

(void **) &pCPC);

if (FAILED(hr)) return;

hr = pCPC->FindConnectionPoint(__uuidof(ConnectionEvents), &pCP);

pCPC->Release();

if (FAILED(hr)) return rc;

hr = pCP->Unadvise( dwConnEvt );

pCP->Release();

if (FAILED(hr)) return;

銆銆鍦ㄨ繛鎺ュ叧闂箣鍚庡仛杩欎欢浜嬨

鎵撳嵃 | 鏀惰棌姝ら〉 |  鎺ㄨ崘缁欏ソ鍙 | 涓炬姤
涓婁竴绡 涓嬩竴绡
 

璇勫垎锛0

鍙戣〃璇勮
鏌ョ湅鍏ㄩ儴鍥炲銆愬凡鏈0浣嶇綉鍙嬪彂琛ㄤ簡鐪嬫硶銆