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

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

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

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

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銆

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

璇勫垎锛0

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