数学建模社区-数学中国

标题: [转帖]在Visual C++中用ADO进行数据库编程(下) [打印本页]

作者: god    时间: 2005-3-30 22:53
标题: [转帖]在Visual C++中用ADO进行数据库编程(下)
<TABLE cellPadding=0 cellSpacing=0 height=325 style="TABLE-LAYOUT: fixed" width="100%">
; q8 b: A6 f7 k, t0 m+ U0 u( `
0 n' L* a% Q  I: q1 n; x9 C: ?! s: G<TR>
  V/ K/ w- [/ |6 H4 Y5 A<TD vAlign=top width=32></TD>1 G% C1 G6 b& |& w* t5 G
<TD  vAlign=top>5. 记录集的遍历、更新' n- s- p  H  r: i
. g* U- d! {' D  r, A
     根据我们刚才通过执行SQL命令建立好的users表,它包含四个字段:ID,username,old,birthday; j# I3 q. _( x4 `7 b4 d
以下的代码实现:打开记录集,遍历所有记录,删除第一条记录,添加三条记录,移动光标到第二条记录,* g, J# o: L1 Z% J
更改其年龄,保存到数据库。
/ T9 ?2 ~# D4 G0 P" a_variant_t vUsername,vBirthday,vID,vOld;$ x* v2 R+ k7 }( n8 D* }
_RecordsetPtr m_pRecordset;
4 H: J+ e4 ?9 f0 `/ R/ j! Bm_pRecordset.CreateInstance("ADODB.Recordset");
6 L5 ~8 O4 g0 L2 |m_pRecordset-&gt;Open("SELECT * FROM users",2 S# ]2 ^4 e0 [. j: R6 Q3 H
_variant_t((IDispatch*)m_pConnection,true),3 T: F+ p9 P) z7 o/ K
adOpenStatic,
. H7 d) Y% n4 v8 [+ h+ l adLockOptimistic,
; g5 p! L$ K4 K6 ]0 ` adCmdText);
* u# m1 N% |' |9 |" \" Wwhile(!m_pRecordset-&gt;adoEOF)* p2 O6 ~# o" B
{9 q  J- X6 e* U# O2 I3 ?* P- w
   vID = m_pRecordset-&gt;GetCollect(_variant_t((long)0));///取得第1列的值,从0开始计数,
+ r$ M6 K( r/ A: b$ ^. `   ///你也可以直接给出列的名称,如下一行; F# |+ b* n2 H" n: b( p  o
   vUsername = m_pRecordset-&gt;GetCollect("username");///取得username字段的值
1 V3 _: T/ Y* S5 y; @   vOld = m_pRecordset-&gt;GetCollect("old");
: S8 }3 v. E6 r* E; S- [   vBirthday = m_pRecordset-&gt;GetCollect("birthday");
7 D$ E* ]+ n3 ^7 T; Z! W; ~   ///在DEBUG方式下的OUTPUT窗口输出记录集中的记录
3 C1 s% G; v$ p. ]4 [. e0 x   if(vID.vt != VT_NULL &amp;&amp; vUsername.vt != VT_NULL &amp;&amp; vOld.vt != VT_NULL &amp;&amp; vBirthday.vt != VT_NULL)- `. b: N1 T9 p2 X# A
       TRACE("id:%d,姓名:%s,年龄:%d,生日:%s\r\n",
3 i; F/ r' X/ X+ q vID.lVal,: r) G! u- U( F  v
(LPCTSTR)(_bstr_t)vUsername,
2 k, }, l! }3 | vOld.lVal,
; R6 z8 I* P( f) V6 |* a) A (LPCTSTR)(_bstr_t)vBirthday);. i$ `4 C4 A, y8 y
   m_pRecordset-&gt;MoveNext();///移到下一条记录" b, ?2 u) ]) |% X6 r2 q
}
+ \" [9 l* E9 x! l" N0 H+ Pm_pRecordset-&gt;MoveFirst();///移到首条记录! i! }* b  s; z/ I) @# ?
m_pRecordset-&gt;Delete(adAffectCurrent);///删除当前记录! {; C. U" v* b8 R; k. v: l
///添加三条新记录并赋值3 ~5 [1 f; Y7 X9 N  A9 x. t
for(int i=0;i&lt;3;i++)+ B2 G) o9 k/ k7 L& H' ^
{# l8 t. {$ f$ G& s) @2 Q+ G5 h7 E
   m_pRecordset-&gt;AddNew();///添加新记录
% N5 ], {( V3 J* b! m   m_pRecordset-&gtutCollect("ID",_variant_t((long)(i+10)));
% N/ c4 S4 l' @. h: e   m_pRecordset-&gtutCollect("username",_variant_t("叶利钦"));
6 Z) ]& H, N5 _+ K) U3 U" U  W; _   m_pRecordset-&gtutCollect("old",_variant_t((long)71));
0 }3 _2 \9 s* K8 R   m_pRecordset-&gtutCollect("birthday",_variant_t("1930-3-15"));
) n( p  v( ^& q7 p2 l0 B2 Z# W}
/ S& X9 g- L$ n" q+ M  em_pRecordset-&gt;Move(1,_variant_t((long)adBookmarkFirst));///从第一条记录往下移动一条记录,即移动到第二条记录处2 S; p) J- O3 E; j- r
m_pRecordset-&gtutCollect(_variant_t("old"),_variant_t((long)45));///修改其年龄' i( l: I# @1 S: Y7 f* O
m_pRecordset-&gt;Update();///保存到库中   
; I, ?- F. \! G, r$ x备注:多次查询可把查询过程做成一个函数ExecuteSQL让m_pRecordset获得连接指针m_pConnection查询结果 / j6 b0 J4 b1 H3 y
void ExecuteSQL(_ConnectionPtr  m_pConnection, _RecordsetPtr  m_pRecordset,CString strSql)
' k; Z& P+ A; V; o3 k# Q{* K. k# b4 L8 O" r+ @
   //执行Select 语句$ F& }- ~1 h  G2 \* y' ~2 a
   BSTR bstrSQL = strSql.AllocSysString();           
4 `* ?: [9 H- z( }. F+ W" c. F. e    try
0 \. G4 v9 T9 v% M- k& J    {+ q! ?6 X( f! ~8 s. x
       m_pRecordset-&gt;Open(bstrSQL,(IDispatch*)m_pConnection,adOpenDynamic,adLockOptimistic,adCmdText);
1 C% _8 x$ J' |           //adOpenDynamic:动态  adLockOptimistic乐观封锁法  adCmdText:文本查询语句" Q& V6 W1 k) o1 d
    }
7 [& f% n) @! z) L4 ]    catch(_com_error error)5 y+ A/ r( C; f# @; o0 J
    {
+ ?3 |* \& [- R7 [& ?5 E! x       CString errorMessage;
! f; Q9 p5 {7 |1 m       errorMessage.format("%s",(LPTSTR)error.Description());1 n. |' E6 P0 V
       AfxMessageBox(errorMessage);
& S% m/ P/ s) J- l    }
- m) K0 w; `, A  K& f* e2 U0 l% \. U}        
' a8 K; N  M0 w, u$ x# w! ~$ f& H//出错处理:
% |: o! R$ P/ P3127——没有找到目标表' W, `! ]9 g# E4 Y) B& w2 a
3092——目标表已经存在
! x, P2 w# y0 w2 |例如:* j. \) @: a4 x4 {( B$ l
catch(const _com_error e)) d. ?: q( E- f3 a" Q, s) K
{
2 A" M# }1 A. k3 [: h1 |    AfxMessageBox(e.Description());+ j; F- u* u' D1 |. m) |
    long errorCode=e.WCode();
0 ~9 `7 ~$ c1 n- v8 {    if(3127==errorCode) AfxMessageBox("表不存在");
2 h7 u3 P+ e5 N  M    if(3092==errorCode) AfxMessageBox("表已经存在");
  ^3 _8 [# O2 d- f5 ^- H    return FALSE;, r- D- d* a$ J5 D5 A$ P
} # k% t- i$ L5 a

. s1 Z5 u. v# e6 B4 l& T. [</TD></TR></TABLE>
作者: wangyu249    时间: 2006-11-21 15:14
<p>不错</p>




欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) Powered by Discuz! X2.5