Visual C++ ADO鏁版嵁搴撶紪绋嬪叆闂紙涓嬶級
鍙戝竷: 2008-6-26 12:17 | 浣滆: admin | 鏌ョ湅: 98娆
10銆侀偊瀹氭暟鎹
銆銆瀹氫箟涓涓粦瀹氱被锛屽皢鍏舵垚鍛樺彉閲忕粦瀹氬埌涓涓寚瀹氱殑璁板綍闆嗭紝浠ユ柟渚夸簬璁块棶璁板綍闆嗙殑瀛楁鍊笺
銆銆(1). 浠嶤ADORecordBinding娲剧敓鍑轰竴涓被锛
class CCustomRs : public CADORecordBinding
{
BEGIN_ADO_BINDING(CCustomRs)
ADO_VARIABLE_LENGTH_ENTRY2(3, adVarChar, m_szau_fname,
sizeof(m_szau_fname), lau_fnameStatus, false)
ADO_VARIABLE_LENGTH_ENTRY2(2, adVarChar, m_szau_lname,
sizeof(m_szau_lname), lau_lnameStatus, false)
ADO_VARIABLE_LENGTH_ENTRY2(4, adVarChar, m_szphone,
sizeof(m_szphone), lphoneStatus, true)
END_ADO_BINDING()
public:
CHAR m_szau_fname[22];
ULONG lau_fnameStatus;
CHAR m_szau_lname[42];
ULONG lau_lnameStatus;
CHAR m_szphone[14];
ULONG lphoneStatus;
};
銆銆鍏朵腑灏嗚缁戝畾鐨勫瓧娈典笌鍙橀噺鍚嶇敤BEGIN_ADO_BINDING瀹忓叧鑱旇捣鏉ャ傛瘡涓瓧娈靛搴斾簬涓や釜鍙橀噺锛屼竴涓瓨鏀惧瓧娈电殑鍊硷紝鍙︿竴涓瓨鏀惧瓧娈电殑鐘舵併傚瓧娈电敤浠1寮濮嬬殑搴忓彿琛ㄧず锛屽1锛2锛3绛夌瓑銆
銆銆鐗瑰埆瑕佹敞鎰忕殑鏄細濡傛灉瑕佺粦瀹氱殑瀛楁鏄瓧绗︿覆绫诲瀷锛屽垯瀵瑰簲鐨勫瓧绗︽暟缁勭殑鍏冪礌涓暟涓瀹氳姣斿瓧娈甸暱搴﹀ぇ2锛堟瘮濡俶_szau_fname[22]锛屽叾缁戝畾鐨勫瓧娈礱u_fname鐨勯暱搴﹀疄闄呮槸20锛夛紝涓嶈繖鏍风粦瀹氬氨浼氬け璐ャ傛垜鍒嗘瀽澶氬嚭鐨2鍙兘鏄负浜嗗瓨鏀惧瓧绗︿覆缁撳熬鐨勭┖瀛楃null鍜孊STR瀛楃涓插紑澶寸殑涓涓瓧锛堣〃绀築STR鐨勯暱搴︼級銆傝繖涓棶棰樺浜庡垵瀛﹁呮潵璇村彲鑳芥槸涓涓剰鎯充笉鍒扮殑闂銆
銆銆CADORecordBinding绫荤殑瀹氫箟鍦╥crsint.h鏂囦欢閲岋紝鍐呭鏄細
class CADORecordBinding
{
public:
STDMETHOD_(const ADO_BINDING_ENTRY*, GetADOBindingEntries) (VOID) PURE;
};
BEGIN_ADO_BINDING瀹忕殑瀹氫箟涔熷湪icrsint.h鏂囦欢閲岋紝鍐呭鏄細
#define BEGIN_ADO_BINDING(cls) public: \
typedef cls ADORowClass; \
const ADO_BINDING_ENTRY* STDMETHODCALLTYPE GetADOBindingEntries() { \
static const ADO_BINDING_ENTRY rgADOBindingEntries[] = {
ADO_VARIABLE_LENGTH_ENTRY2瀹忕殑瀹氫箟涔熷湪icrsint.h鏂囦欢閲岋細
#define ADO_VARIABLE_LENGTH_ENTRY2(Ordinal, DataType, Buffer, Size, Status, Modify)\
{Ordinal, \
DataType, \
0, \
0, \
Size, \
offsetof(ADORowClass, Buffer), \
offsetof(ADORowClass, Status), \
0, \
classoffset(CADORecordBinding, ADORowClass), \
Modify},
#define END_ADO_BINDING瀹忕殑瀹氫箟涔熷湪icrsint.h鏂囦欢閲岋細
#define END_ADO_BINDING() {0, adEmpty, 0, 0, 0, 0, 0, 0, 0, FALSE}};\
return rgADOBindingEntries;}
銆銆銆(2). 缁戝畾
_RecordsetPtr Rs1;
IADORecordBinding *picRs=NULL;
CCustomRs rs;
......
Rs1->QueryInterface(__uuidof(IADORecordBinding),
(LPVOID*)&picRs));
picRs->BindToRecordset(&rs);
銆銆娲剧敓鍑虹殑绫诲繀椤婚氳繃IADORecordBinding鎺ュ彛鎵嶈兘缁戝畾锛岃皟鐢ㄥ畠鐨凚indToRecordset鏂规硶灏辫浜嗐
銆銆(3). rs涓殑鍙橀噺鍗虫槸褰撳墠璁板綍瀛楁鐨勫
//Set sort and filter condition:
// Step 4: Manipulate the data
Rs1->Fields->GetItem("au_lname")->Properties->GetItem("Optimize")->Value = true;
Rs1->Sort = "au_lname ASC";
Rs1->Filter = "phone LIKE '415 5*'";
Rs1->MoveFirst();
while (VARIANT_FALSE == Rs1->EndOfFile)
{
printf("Name: %s\t %s\tPhone: %s\n",
(rs.lau_fnameStatus == adFldOK ? rs.m_szau_fname : ""),
(rs.lau_lnameStatus == adFldOK ? rs.m_szau_lname : ""),
(rs.lphoneStatus == adFldOK ? rs.m_szphone : ""));
if (rs.lphoneStatus == adFldOK)
strcpy(rs.m_szphone, "777");
TESTHR(picRs->Update(&rs)); // Add change to the batch
Rs1->MoveNext();
}
Rs1->Filter = (long) adFilterNone;
......
if (picRs) picRs->Release();
Rs1->Close();
pConn->Close();
銆銆鍙瀛楁鐨勭姸鎬佹槸adFldOK锛屽氨鍙互璁块棶銆傚鏋滀慨鏀逛簡瀛楁锛屼笉瑕佸繕浜嗗厛璋冪敤picRs鐨刄pdate锛堟敞鎰忎笉鏄疪ecordset鐨刄pdate锛夛紝鐒跺悗鎵嶅叧闂紝涔熶笉瑕佸繕浜嗛噴鏀緋icRs锛堝嵆picRs->Release();锛夈
銆銆(4). 姝ゆ椂杩樺彲浠ョ敤IADORecordBinding鎺ュ彛娣诲姞鏂扮邯褰
if(FAILED(picRs->AddNew(&rs)))
......
銆銆11. 璁块棶闀挎暟鎹
銆銆鍦∕icrosoft SQL涓殑闀挎暟鎹寘鎷瑃ext銆乮mage绛夎繖鏍烽暱绫诲瀷鐨勬暟鎹紝浣滀负浜岃繘鍒跺瓧鑺傛潵瀵瑰緟銆
銆銆鍙互鐢‵ield瀵硅薄鐨凣etChunk鍜孉ppendChunk鏂规硶鏉ヨ闂傛瘡娆″彲浠ヨ鍑烘垨鍐欏叆鍏ㄩ儴鏁版嵁鐨勪竴閮ㄥ垎锛屽畠浼氳浣忎笂娆¤闂殑浣嶇疆銆備絾鏄鏋滀腑闂磋闂簡鍒殑瀛楁鍚庯紝灏卞張寰椾粠澶存潵浜嗐
銆銆璇风湅涓嬮潰鐨勪緥瀛愶細
//鍐欏叆涓寮犵収鐗囧埌鏁版嵁搴擄細
VARIANT varChunk;
SAFEARRAY *psa;
SAFEARRAYBOUND rgsabound ;
//VT_ARRAY 鈹 VT_UI1
CFile f("h:\\aaa.jpg",Cfile::modeRead);
BYTE bVal[ChunkSize+1];
UINT uIsRead=0;
//Create a safe array to store the array of BYTES
while(1)
{
uIsRead=f.Read(bVal,ChunkSize);
if(uIsRead==0)break;
rgsabound[0].cElements =uIsRead;
rgsabound[0].lLbound = 0;
psa = SafeArrayCreate(VT_UI1,1,rgsabound);
for(long index=0;index { if(FAILED(SafeArrayPutElement(psa,&index,&bVal[index]))) ::MessageBox(NULL,"鍟婏紝鍙堝嚭姣涚梾浜嗐","鎻愮ず",MB_OK 鈹 MB_ICONWARNING); } varChunk.vt = VT_ARRAY鈹俈T_UI1; varChunk.parray = psa; try{ m_pRecordset->Fields->GetItem("photo")->AppendChunk(varChunk); } catch (_com_error &e) { CString str=(char*)e.Description(); ::MessageBox(NULL,str+"\n鍙堝嚭姣涚梾浜嗐","鎻愮ず",MB_OK 鈹 MB_ICONWARNING); } ::VariantClear(&varChunk); ::SafeArrayDestroyData( psa); if(uIsRead }//while(1) f.Close(); //浠庢暟鎹簱璇讳竴寮犵収鐗囷細 CFile f; f.Open("h:\\bbb.jpg",Cfile::modeWrite鈹侰file::modeCreate); long lPhotoSize = m_pRecordset->Fields->Item["photo"]->ActualSize; long lIsRead=0; _variant_t varChunk; BYTE buf[ChunkSize]; while(lPhotoSize>0) { lIsRead=lPhotoSize>=ChunkSize? ChunkSize:lPhotoSize; varChunk = m_pRecordset->Fields-> Item["photo"]->GetChunk(lIsRead); for(long index=0;index { ::SafeArrayGetElement(varChunk.parray,&index,buf+index); } f.Write(buf,lIsRead); lPhotoSize-=lIsRead; }//while() f.Close(); 銆銆12. 浣跨敤SafeArray闂 銆銆瀛︿細浣跨敤SafeArray涔熸槸寰堥噸瑕佺殑锛屽洜涓哄湪ADO缂栫▼涓粡甯歌鐢ㄣ傚畠鐨勪富瑕佺洰鐨勬槸鐢ㄤ簬automation涓殑鏁扮粍鍨嬪弬鏁扮殑浼犻掋傚洜涓哄湪缃戠粶鐜涓紝鏁扮粍鏄笉鑳界洿鎺ヤ紶閫掔殑锛岃屽繀椤诲皢鍏跺寘瑁呮垚SafeArray銆傚疄璐ㄤ笂SafeArray灏辨槸灏嗛氬父鐨勬暟缁勫鍔犱竴涓弿杩扮锛岃鏄庡叾缁存暟銆侀暱搴︺佽竟鐣屻佸厓绱犵被鍨嬬瓑淇℃伅銆係afeArray涔熷苟涓嶅崟鐙娇鐢紝鑰屾槸灏嗗叾鍐嶅寘瑁呭埌VARIANT绫诲瀷鐨勫彉閲忎腑锛岀劧鍚庢墠浣滀负鍙傛暟浼犻佸嚭鍘汇傚湪VARIANT鐨剉t鎴愬憳鐨勫煎鏋滃寘鍚玍T_ARRAY鈹...,閭d箞瀹冩墍灏佽鐨勫氨鏄竴涓猄afeArray锛屽畠鐨刾array鎴愬憳鍗虫槸鎸囧悜SafeArray鐨勬寚閽堛 SafeArray涓厓绱犵殑绫诲瀷鍙互鏄疺ARIANT鑳藉皝瑁呯殑浠讳綍绫诲瀷锛屽寘鎷琕ARIANT绫诲瀷鏈韩銆 銆銆浣跨敤SafeArray鐨勫叿浣撴楠わ細 銆銆鏂规硶涓锛 銆銆鍖呰涓涓猄afeArray锛 銆銆(1). 瀹氫箟鍙橀噺锛屽锛 VARIANT varChunk; SAFEARRAY *psa; SAFEARRAYBOUND rgsabound ; 銆銆(2). 鍒涘缓SafeArray鎻忚堪绗︼細 uIsRead=f.Read(bVal,ChunkSize);//read array from a file. if(uIsRead==0)break; rgsabound[0].cElements =uIsRead; rgsabound[0].lLbound = 0; psa = SafeArrayCreate(VT_UI1,1,rgsabound); 銆銆(3). 鏀剧疆鏁版嵁鍏冪礌鍒癝afeArray锛 for(long index=0;index { if(FAILED(SafeArrayPutElement(psa,&index,&bVal[index]))) ::MessageBox(NULL,"鍑烘瘺鐥呬簡銆","鎻愮ず",MB_OK 鈹 MB_ICONWARNING); } 銆銆涓涓竴涓湴鏀撅紝鎸洪夯鐑︾殑銆 銆銆(4). 灏佽鍒癡ARIANT鍐咃細 varChunk.vt = VT_ARRAY鈹俈T_UI1; varChunk.parray = psa; 銆銆杩欐牱灏卞彲浠ュ皢varChunk浣滀负鍙傛暟浼犻佸嚭鍘讳簡銆 銆銆璇诲彇SafeArray涓殑鏁版嵁鐨勬楠わ細 銆銆(1). 鐢⊿afeArrayGetElement涓涓竴涓湴璇 BYTE buf[lIsRead]; for(long index=0;index { ::SafeArrayGetElement(varChunk.parray,&index,buf+index); } 銆銆灏辫鍒扮紦鍐插尯buf閲屼簡銆 銆銆鏂规硶浜岋細 銆銆浣跨敤SafeArrayAccessData鐩存帴璇诲啓SafeArray鐨勭紦鍐插尯锛 銆銆(1). 璇荤紦鍐插尯锛 BYTE *buf; SafeArrayAccessData(varChunk.parray, (void **)&buf); f.Write(buf,lIsRead); SafeArrayUnaccessData(varChunk.parray); 銆銆(2). 鍐欑紦鍐插尯锛 BYTE *buf; ::SafeArrayAccessData(psa, (void **)&buf); for(long index=0;index { buf[index]=bVal[index]; } ::SafeArrayUnaccessData(psa); varChunk.vt = VT_ARRAY鈹俈T_UI1; varChunk.parray = psa; 銆銆杩欑鏂规硶璇诲啓SafeArray閮藉彲浠ワ紝瀹冪洿鎺ユ搷绾礢afeArray鐨勬暟鎹紦鍐插尯锛屾瘮鐢⊿afeArrayGetElement鍜 SafeArrayPutElement閫熷害蹇傜壒鍒傚悎浜庤鍙栨暟鎹備絾鐢ㄥ畬涔嬪悗涓嶈蹇樹簡璋冪敤::SafeArrayUnaccessData (psa)锛屽惁鍒欎細鍑洪敊鐨勩 銆銆13. 浣跨敤涔︾( bookmark ) 銆銆涔︾鍙互鍞竴鏍囪瘑璁板綍闆嗕腑鐨勪竴涓褰曪紝鐢ㄤ簬蹇熷湴灏嗗綋鍓嶈褰曠Щ鍥炲埌宸茶闂繃鐨勮褰曪紝浠ュ強杩涜杩囨护绛夌瓑銆侾rovider浼氳嚜鍔ㄤ负璁板綍闆嗕腑鐨勬瘡涓鏉¤褰曚骇鐢熶竴涓功绛撅紝鎴戜滑鍙渶瑕佷娇鐢ㄥ畠灏辫浜嗐傛垜浠笉鑳借瘯鍥炬樉绀恒佷慨鏀规垨姣旇緝涔︾銆侫DO鐢ㄨ褰曢泦鐨凚ookmark灞炴ц〃绀哄綋鍓嶈褰曠殑涔︾銆 銆銆鐢ㄦ硶姝ラ锛 銆銆(1). 寤虹珛涓涓猇ARIANT绫诲瀷鐨勫彉閲 _variant_t VarBookmark; 銆銆(2). 灏嗗綋鍓嶈褰曠殑涔︾鍊煎瓨鍏ヨ鍙橀噺 銆銆涔熷氨鏄褰曢泦鐨凚ookmark灞炴х殑褰撳墠鍊笺 VarBookmark = rst->Bookmark; 銆銆(3). 杩斿洖鍒板厛鍓嶇殑璁板綍 銆銆灏嗕繚瀛樼殑涔︾鍊艰缃埌璁板綍闆嗙殑涔︾灞炴т腑锛 // Check for whether bookmark set for a record if (VarBookmark.vt == VT_EMPTY) printf("No Bookmark set!\n"); else rst->Bookmark = VarBookmark; 銆銆璁剧疆瀹屽悗锛屽綋鍓嶈褰曞嵆浼氱Щ鍔ㄥ埌璇ヤ功绛炬寚鍚戠殑璁板綍銆 銆銆14銆佽缃繃婊ゆ潯浠 銆銆Recordset瀵硅薄鐨凢ilter灞炴ц〃绀轰簡褰撳墠鐨勮繃婊ゆ潯浠躲傚畠鐨勫煎彲浠ユ槸浠ND鎴朞R杩炴帴璧锋潵鐨勬潯浠惰〃杈惧紡锛堜笉鍚玏HERE鍏抽敭瀛楋級銆佺敱涔︾缁勬垚鐨勬暟缁勬垨ADO鎻愪緵鐨凢ilterGroupEnum鏋氫妇鍊笺備负Filter灞炴ц缃柊鍊煎悗Recordset鐨勫綋鍓嶈褰曟寚閽堜細鑷姩绉诲姩鍒版弧瓒宠繃婊ゆ潯浠剁殑绗竴涓褰曘備緥濡傦細 rst->Filter = _bstr_t ("濮撳悕='璧佃枃' AND 鎬у埆=鈥欏コ鈥"); 銆銆鍦ㄤ娇鐢ㄦ潯浠惰〃杈惧紡鏃跺簲娉ㄦ剰涓嬪垪闂锛 銆銆锛1锛夈佸彲浠ョ敤鍦嗘嫭鍙风粍鎴愬鏉傜殑琛ㄨ揪寮 銆銆渚嬪锛 rst->Filter = _bstr_t ("(濮撳悕='璧佃枃' AND 鎬у埆=鈥欏コ鈥) OR AGE<25"); 銆銆浣嗘槸寰蒋涓嶅厑璁稿湪鎷彿鍐呯敤OR锛岀劧鍚庡湪鎷彿澶栫敤AND锛屼緥濡傦細 rst->Filter = _bstr_t ("(濮撳悕='璧佃枃' OR 鎬у埆=鈥欏コ鈥) AND AGE<25"); 銆銆蹇呴』淇敼涓猴細 rst->Filter = _bstr_t ("(濮撳悕='璧佃枃' AND AGE<25) OR (鎬у埆=鈥欏コ鈥 AND AGE<25)"); 銆銆锛2锛夈佽〃杈惧紡涓殑姣旇緝杩愮畻绗﹀彲浠ユ槸LIKE 銆銆LIKE鍚庤姣旇緝鐨勬槸涓涓惈鏈夐氶厤绗*鐨勫瓧绗︿覆锛屾槦鍙疯〃绀鸿嫢骞蹭釜浠绘剰鐨勫瓧绗︺ 銆銆瀛楃涓茬殑棣栭儴鍜屽熬閮ㄥ彲浠ュ悓鏃跺甫鏄熷彿* rst->Filter = _bstr_t ("濮撳悕 LIKE '*璧*' "); 銆銆涔熷彲浠ュ彧鏄熬閮ㄥ甫鏄熷彿锛 rst->Filter = _bstr_t ("濮撳悕 LIKE '璧*' "); 銆銆Filter灞炴у肩殑绫诲瀷鏄疺ariant锛屽鏋滆繃婊ゆ潯浠舵槸鐢变功绛剧粍鎴愮殑鏁扮粍锛屽垯闇灏嗚鏁扮粍杞崲涓篠afeArray锛岀劧鍚庡啀灏佽鍒颁竴涓猇ARIANT鎴朹variant_t鍨嬬殑鍙橀噺涓紝鍐嶈祴缁橣ilter灞炴с 銆銆15銆佺储寮曚笌鎺掑簭 銆銆锛1锛夈佸缓绔嬬储寮 銆銆褰撲互鏌愪釜瀛楁涓哄叧閿瓧鐢‵ind鏂规硶鏌ユ壘鏃讹紝涓轰簡鍔犲揩閫熷害鍙互浠ヨ瀛楁涓哄叧閿瓧鍦ㄨ褰曢泦鍐呴儴涓存椂寤虹珛绱㈠紩銆傚彧瑕佸皢璇ュ瓧娈电殑Optimize灞炴ц缃负true鍗冲彲锛屼緥濡傦細 pRst->Fields->GetItem("濮撳悕")->Properties-> GetItem("Optimize")->PutValue("True"); pRst->Find("濮撳悕 = '璧佃枃'",1,adSearchForward); ...... pRst->Fields->GetItem("濮撳悕")->Properties-> GetItem("Optimize")->PutValue("False"); pRst->Close(); 銆銆璇存槑锛歄ptimize灞炴ф槸鐢盤rovider鎻愪緵鐨勫睘鎬э紙鍦ˋDO涓О涓哄姩鎬佸睘鎬э級锛孉DO鏈韩娌℃湁姝ゅ睘鎬с 銆銆锛2锛夈佹帓搴 銆銆瑕佹帓搴忎篃寰堢畝鍗曪紝鍙鎶婅鎺掑簭鐨勫叧閿瓧鍒楄〃璁剧疆鍒癛ecordset瀵硅薄鐨凷ort灞炴ч噷鍗冲彲锛屼緥濡傦細 pRstAuthors->CursorLocation = adUseClient; pRstAuthors->Open("SELECT * FROM mytable", _variant_t((IDispatch *) pConnection), adOpenStatic, adLockReadOnly, adCmdText); ...... pRst->Sort = "濮撳悕 DESC, 骞撮緞 ASC"; 銆銆鍏抽敭瀛楋紙鍗冲瓧娈靛悕锛変箣闂寸敤閫楀彿闅斿紑锛屽鏋滆浠ユ煇鍏抽敭瀛楅檷搴忔帓搴忥紝鍒欏簲鍦ㄨ鍏抽敭瀛楀悗鍔犱竴绌烘牸锛屽啀鍔燚ESC锛堝涓婁緥锛夈傚崌搴忔椂ASC鍔犱笉鍔犳棤鎵璋撱傛湰鎿嶄綔鏄埄鐢ㄧ储寮曡繘琛岀殑锛屽苟鏈繘琛岀墿鐞嗘帓搴忥紝鎵浠ユ晥鐜囪緝楂樸 浣嗚娉ㄦ剰锛屽湪鎵撳紑璁板綍闆嗕箣鍓嶅繀椤诲皢璁板綍闆嗙殑CursorLocation灞炴ц缃负adUseClient锛屽涓婁緥鎵绀恒係ort灞炴у煎湪闇瑕佹椂闅忔椂鍙互淇敼銆 銆銆16銆佷簨鍔″鐞 銆銆ADO涓殑浜嬪姟澶勭悊涔熷緢绠鍗曪紝鍙渶鍒嗗埆鍦ㄩ傚綋鐨勪綅缃皟鐢–onnection瀵硅薄鐨勪笁涓柟娉曞嵆鍙紝杩欎笁涓柟娉曟槸锛 銆銆锛1锛夈佸湪浜嬪姟寮濮嬫椂璋冪敤 pCnn->BeginTrans(); 銆銆锛2锛夈佸湪浜嬪姟缁撴潫骞舵垚鍔熸椂璋冪敤 pCnn->CommitTrans (); 銆銆锛3锛夈佸湪浜嬪姟缁撴潫骞跺け璐ユ椂璋冪敤 pCnn->RollbackTrans (); 銆銆鍦ㄤ娇鐢ㄤ簨鍔″鐞嗘椂锛屽簲灏介噺鍑忓皬浜嬪姟鐨勮寖鍥达紝鍗冲噺灏忎粠浜嬪姟寮濮嬪埌缁撴潫锛堟彁浜ゆ垨鍥炴粴锛変箣闂寸殑鏃堕棿闂撮殧锛屼互渚挎彁楂樼郴缁熸晥鐜囥傞渶瑕佹椂涔熷彲鍦ㄨ皟鐢˙eginTrans()鏂规硶涔嬪墠锛屽厛璁剧疆Connection瀵硅薄鐨処solationLevel灞炴у硷紝璇︾粏鍐呭鍙傝MSDN涓湁鍏矨DO鐨勬妧鏈祫鏂欍 銆銆涓夈佷娇鐢ˋDO缂栫▼甯歌闂瑙g瓟 銆銆浠ヤ笅鍧囨槸閽堝MS SQL 7.0缂栫▼鏃舵墍閬囬棶棰樿繘琛岃璁恒 銆銆1銆佽繛鎺ュけ璐ュ彲鑳藉師鍥 銆銆Enterprise Managemer鍐咃紝鎵撳紑灏嗘湇鍔″櫒鐨勫睘鎬у璇濇锛屽湪Security閫夐」鍗′腑锛屾湁涓涓夐」Authentication銆 銆銆濡傛灉璇ラ夐」鏄疻indows NT only锛屽垯浣犵殑绋嬪簭鎵鐢ㄧ殑杩炴帴瀛楃涓插氨涓瀹氳鍖呭惈Trusted_Connection鍙傛暟锛屽苟涓斿叾鍊煎繀椤讳负yes锛屽锛 "Provider=SQLOLEDB;Server=888;Trusted_Connection=yes" ";Database=master;uid=lad;"; 銆銆濡傛灉涓嶆寜涓婅堪鎿嶄綔锛岀▼搴忚繍琛屾椂杩炴帴蹇呯劧澶辫触銆 銆銆濡傛灉Authentication閫夐」鏄疭QL Server and Windows NT锛屽垯浣犵殑绋嬪簭鎵鐢ㄧ殑杩炴帴瀛楃涓插彲浠ヤ笉鍖呭惈Trusted_Connection鍙傛暟锛屽锛 "Provider=SQLOLEDB;Server=888;Database=master;uid=lad;pwd=111;"; 銆銆鍥犱负ADO缁欒鍙傛暟鍙栫殑榛樿鍊煎氨鏄痭o锛屾墍浠ュ彲浠ョ渷鐣ャ傛垜璁や负杩樻槸鍙栭粯璁ゅ兼瘮杈冨畨鍏ㄤ竴浜涖 銆銆2銆佹敼鍙樺綋鍓嶆暟鎹簱鐨勬柟娉 銆銆浣跨敤Tansct-SQL涓殑USE璇彞鍗冲彲銆 銆銆3銆佸浣曞垽鏂竴涓暟鎹簱鏄惁瀛樺湪 銆銆(1)銆佸彲鎵撳紑master鏁版嵁搴撲腑涓涓彨鍋歋CHEMATA鐨勮鍥撅紝鍏跺唴瀹瑰垪鍑轰簡璇ユ湇鍔″櫒涓婃墍鏈夌殑鏁版嵁搴撳悕绉般 銆銆(2) 銆佹洿绠渚跨殑鏂规硶鏄娇鐢║SE璇彞锛屾垚鍔熶簡灏卞瓨鍦紱涓嶆垚鍔燂紝灏变笉瀛樺湪銆備緥濡傦細 try{ m_pConnect->Execute ( _bstr_t("USE INSURANCE_2002"),NULL, adCmdText鈹俛dExecuteNoRecords ); } catch (_com_error &e) { blSuccess=FALSE; CString str="鏁版嵁搴揑NSURANCE_2002涓嶅瓨鍦紒\n"; str+=e.Description(); ::MessageBox(NULL,str,"璀﹀憡",MB_OK 鈹 MB_ICONWARNING); } 銆銆4銆佸垽鏂竴涓〃鏄惁瀛樺湪 銆銆锛1锛夈佸悓鏍峰垽鏂竴涓〃鏄惁瀛樺湪锛屼篃鍙互鐢ㄦ槸鍚︽垚鍔熷湴鎵撳紑瀹冩潵鍒ゆ柇锛屽崄鍒嗘柟渚匡紝渚嬪锛 try{ m_pRecordset->Open(_variant_t("mytable"), _variant_t((IDispatch *)m_pConnection,true), adOpenKeyset, adLockOptimistic, adCmdTable); } catch (_com_error &e) { ::MessageBox(NULL,"璇ヨ〃涓嶅瓨鍦ㄣ","鎻愮ず",MB_OK 鈹 MB_ICONWARNING); } 銆銆(2)銆佽涓嶇劧鍙互閲囩敤楹荤儲涓鐐圭殑鍔炴硶锛屽氨鏄湪MS-SQL鏈嶅姟鍣ㄤ笂鐨勬瘡涓暟鎹簱涓兘鏈変竴涓悕涓簊ysobjects鐨勮〃锛屾煡鐪嬫琛ㄧ殑鍐呭鍗崇煡鎸囧畾鐨勮〃鏄惁鍦ㄨ鏁版嵁搴撲腑銆 銆銆(3)銆佸悓鏍凤紝姣忎釜鏁版嵁搴撲腑閮芥湁涓涓悕涓篢ABLES鐨勮鍥(View)锛屾煡鐪嬫瑙嗗浘鐨勫唴瀹瑰嵆鐭ユ寚瀹氱殑琛ㄦ槸鍚﹀湪璇ユ暟鎹簱涓 銆銆5銆佺被鍨嬭浆鎹㈤棶棰 銆銆锛1锛夈佺被鍨媀ARIANT_BOOL 銆銆绫诲瀷VARIANT_BOOL绛変环浜巗hort绫诲瀷銆俆he VARIANT_BOOL is equivalent to short. see it's definition below: typdef short VARIANT_BOOL 銆銆锛2锛夈乢com_ptr_t绫荤殑绫诲瀷杞崲 銆銆_ConnectionPtr鍙互鑷姩杞崲鎴怚Dspatch*绫诲瀷锛岃繖鏄洜涓篲ConnectionPtr瀹為檯涓婃槸_com_ptr_t绫荤殑涓涓疄渚嬶紝鑰岃繖涓被鏈夋绫诲瀷杞崲鍑芥暟銆 銆銆鍚岀悊锛宊RecordsetPtr鍜宊CommandPtr涔熼兘鍙互杩欐牱杞崲銆 銆銆锛3锛夈乢bstr_t鍜宊variant_t绫 銆銆鍦ˋDO缂栫▼鏃讹紝_bstr_t鍜宊variant_t杩欎袱涓被寰堟湁鐢紝鐪佸幓浜嗚澶欱STR鍜孷ARIANT绫诲瀷杞崲鐨勯夯鐑︺ 銆銆6銆佹墦寮璁板綍闆嗘椂鐨勯棶棰 銆銆鍦ㄦ墦寮璁板綍闆嗘椂锛屽湪璋冪敤Recordset鐨凮pen鏂规硶鏃讹紝鍏舵渶鍚庝竴涓弬鏁伴噷涓瀹氫笉鑳藉寘鍚玜dAsyncExecute锛屽惁鍒欏皢鍥犱负鏄紓姝ユ搷浣滐紝鍦ㄨ鍙栨暟鎹椂鏃犳硶璇诲埌鏁版嵁銆 銆銆7銆佸紓甯稿鐞嗛棶棰 銆銆瀵规墍鏈夎皟鐢ˋDO鐨勮鍙ヤ竴瀹氳鐢╰ry鍜宑atch璇彞鎹曟崏寮傚父锛屽惁鍒欏湪鍙戠敓寮傚父鏃讹紝绋嬪簭浼氬紓甯搁鍑恒 銆銆8銆佷娇鐢⊿afeArray闂 銆銆鍦ㄥ垵瀛︿娇鐢ㄤ腑锛屾垜鏇鹃亣鍒颁竴涓激鑴戠瓔鐨勯棶棰橈紝涓瀹氳娉ㄦ剰锛 銆銆鍦ㄥ畾涔変簡SAFEARRAY鐨勬寚閽堝悗锛屽鏋滄墦绠楅噸澶嶄娇鐢ㄥ娆★紝鍒欏湪涓棿鍙互璋冪敤::SafeArrayDestroyData閲婃斁鏁版嵁锛屼絾鍐充笉鑳借皟鐢::SafeArrayDestroyDescriptor锛屽惁鍒欏繀鐒跺嚭閿欙紝鍗充娇璋冪敤SafeArrayCreate涔熶笉琛屻備緥濡傦細 SAFEARRAY *psa; ...... //When the data are no longer to be used: ::SafeArrayDestroyData( psa); 銆銆鎴戝垎鏋愬湪瀹氫箟psa鎸囬拡鏃讹紝涓涓猄AFEARRAY鐨勫疄渚嬶紙涔熷氨鏄疭AFEARRAY鎻忚堪绗︼級涔熷悓鏃惰鑷姩寤虹珛浜嗐備絾鏄彧瑕佷竴璋冪敤::SafeArrayDestroyDescriptor锛屾弿杩扮灏辫閿姣佷簡銆 銆銆鎵浠ユ垜璁や负::SafeArrayDestroyDescriptor鍙互鏍规湰灏变笉璋冪敤锛屽嵆浣胯皟鐢ㄤ篃蹇呴』鍦ㄦ渶鍚庤皟鐢ㄣ 銆銆9銆侀噸澶嶄娇鐢ㄥ懡浠ゅ璞¢棶棰 銆銆涓涓懡浠ゅ璞″鏋滆閲嶅浣跨敤澶氭锛堝挨鍏舵槸甯﹀弬鏁扮殑鍛戒护锛夛紝鍒欏湪绗竴娆℃墽琛屼箣鍓嶏紝搴斿皢瀹冪殑Prepared灞炴ц缃负TRUE銆傝繖鏍蜂細浣跨涓娆℃墽琛屽噺鎱紝浣嗗嵈鍙互浣夸互鍚庣殑鎵ц鍏ㄩ儴鍔犲揩銆 銆銆10銆佺粦瀹氬瓧绗︿覆鍨嬪瓧娈甸棶棰 銆銆濡傛灉瑕佺粦瀹氱殑瀛楁鏄瓧绗︿覆绫诲瀷锛屽垯瀵瑰簲鐨勫瓧绗︽暟缁勭殑鍏冪礌涓暟涓瀹氳姣斿瓧娈甸暱搴﹀ぇ2锛堟瘮濡俶_szau_fname[22]锛屽叾缁戝畾鐨勫瓧娈礱u_fname鐨勯暱搴﹀疄闄呮槸20锛夛紝涓嶈繖鏍风粦瀹氬氨浼氬け璐ャ 銆銆11銆佷娇鐢ˋppendChunk鐨勯棶棰 銆銆褰撶敤AddNew鏂规硶鍒氬垰鍚戣褰曢泦鍐呮坊鍔犱竴涓柊璁板綍涔嬪悗锛屼笉鑳介鍏堝悜涓涓暱鏁版嵁瀛楁锛坕mage绫诲瀷锛夊啓鍏ユ暟鎹紝蹇呴』鍏堝悜鍏朵粬瀛楁鍐欏叆杩囨暟鎹箣鍚庯紝鎵嶈兘璋冪敤AppendChunk鍐欒瀛楁锛屽惁鍒欏嚭閿欍備篃灏辨槸璇达紝AppendChunk涓嶈兘绱ф帴鍦ˋddNew涔嬪悗銆傚彟澶栵紝鍐欏叆鍏朵粬瀛楁鍚庤繕蹇呴』绱ф帴鐫璋冪敤 AppendChunk锛岃屼笉鑳借皟鐢ㄨ褰曢泦鐨刄pdate鏂规硶鍚庯紝鎵嶈皟鐢ˋppendChunk锛屽惁鍒欒皟鐢ˋppendChunk鏃朵篃浼氬嚭閿欍傛崲鍙ヨ瘽璇达紝灏辨槸蹇呴』AppendChunk鍦ㄥ墠锛孶pdate鍦ㄥ悗銆傚洜鑰岃繖涓椂鍊欏氨涓嶈兘浣跨敤甯﹀弬鏁扮殑AddNew浜嗭紝鍥犱负甯﹀弬鏁扮殑AddNew浼氳嚜鍔ㄨ皟鐢ㄨ褰曢泦鐨 Update锛屾墍浠ppendChunk灏辫窇鍒癠pdate鐨勫悗闈簡锛屽氨鍙湁鍑洪敊浜嗭紒鍥犳锛岃繖鏃跺簲璇ョ敤涓嶅甫鍙傛暟鐨凙ddNew銆 銆銆鎴戞帹娴嬭繖鍙兘鏄疢S SQL 7.0鐨勯棶棰橈紝鍦∕S SQL 2000涓垯涓嶅瓨鍦ㄨ繖浜涢棶棰橈紝浣嗘槸AppendChunk浠嶇劧涓嶈兘鍦║pdate涔嬪悗銆 銆銆鍥涖佸皬缁 銆銆涓鑸儏鍐典笅锛孋onnection鍜孋ommand鐨凟xecute鐢ㄤ簬鎵ц涓嶄骇鐢熻褰曢泦鐨勫懡浠わ紝鑰孯ecordset鐨凮pen鐢ㄤ簬浜х敓涓涓褰曢泦锛屽綋鐒朵篃涓嶆槸缁濆鐨勩傜壒鍒獵ommand涓昏鏄敤浜庢墽琛屽弬鏁板寲鐨勫懡浠わ紝鍙互鐩存帴鐢盋ommand瀵硅薄鎵ц锛屼篃鍙互灏咰ommand瀵硅薄浼犻掔粰 Recordset鐨凮pen銆




发表于 2009-1-5 19:48
| 











