数学建模社区-数学中国

标题: [转帖]在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%">
0 l6 }4 \0 R+ s5 P
5 j) W) `5 X$ d3 P# y7 T6 F<TR># K: A" d+ m( t: Z: B1 n2 o
<TD vAlign=top width=32></TD>
7 b! S* s( M0 z' R<TD  vAlign=top>5. 记录集的遍历、更新3 X# {; L# H4 T0 V6 [
+ x, i$ F5 @* ?6 }- S! _: |
     根据我们刚才通过执行SQL命令建立好的users表,它包含四个字段:ID,username,old,birthday- @6 Q9 W" j9 G; y0 s" b1 n! d
以下的代码实现:打开记录集,遍历所有记录,删除第一条记录,添加三条记录,移动光标到第二条记录,
5 N9 g  K7 X* y% I1 {6 e更改其年龄,保存到数据库。   o/ l. S0 h! E9 L4 F
_variant_t vUsername,vBirthday,vID,vOld;
; |  z) h2 [' ^_RecordsetPtr m_pRecordset;
# ~; s2 h0 Y  _2 _8 ]( r5 Cm_pRecordset.CreateInstance("ADODB.Recordset");
1 b2 P; z& J/ o; tm_pRecordset-&gt;Open("SELECT * FROM users",; V5 T' ], ~2 |( p$ d: M
_variant_t((IDispatch*)m_pConnection,true),& _* @8 G3 V( S
adOpenStatic,
, ^% H1 f& ^2 q$ O& U/ x adLockOptimistic,
) c+ e. e2 D- I2 j  ^- S adCmdText);* G) |' o5 D% D. @8 g
while(!m_pRecordset-&gt;adoEOF)) w, T1 x& V1 ~# ^8 i- L
{; `% P/ Z) ]0 \4 j- J
   vID = m_pRecordset-&gt;GetCollect(_variant_t((long)0));///取得第1列的值,从0开始计数,
5 _$ R$ B% D$ @! s   ///你也可以直接给出列的名称,如下一行
7 t3 M) A& R4 C4 [/ @$ p+ t$ B* f   vUsername = m_pRecordset-&gt;GetCollect("username");///取得username字段的值. }* W/ x+ ^9 b! p
   vOld = m_pRecordset-&gt;GetCollect("old");
. p% W6 d: e4 N1 ]/ ^; N7 X, ]   vBirthday = m_pRecordset-&gt;GetCollect("birthday");
+ ~/ R  h1 Z8 K: ^: a; Y   ///在DEBUG方式下的OUTPUT窗口输出记录集中的记录
/ I7 k) V5 u6 B+ }7 M# ^   if(vID.vt != VT_NULL &amp;&amp; vUsername.vt != VT_NULL &amp;&amp; vOld.vt != VT_NULL &amp;&amp; vBirthday.vt != VT_NULL)
- Y, i" g/ {) U  V       TRACE("id:%d,姓名:%s,年龄:%d,生日:%s\r\n",: A7 G% x: r/ ?2 k# P! U
vID.lVal,- H8 \/ {+ ~  M, ^4 F. W# F, P
(LPCTSTR)(_bstr_t)vUsername,
: L! T; O6 z8 }/ _: u# p vOld.lVal,
) b8 p. E1 n+ A' p9 r  d (LPCTSTR)(_bstr_t)vBirthday);
5 s* @9 o7 f. S   m_pRecordset-&gt;MoveNext();///移到下一条记录( Y3 ?' O/ c" D. R) [2 y0 @: b
}
4 Z+ e! Q: {: v* g6 O" c, \m_pRecordset-&gt;MoveFirst();///移到首条记录. ], w" r. N( R- E; |& L7 Q
m_pRecordset-&gt;Delete(adAffectCurrent);///删除当前记录3 Y: P1 D) x) I
///添加三条新记录并赋值
: Q, T" U9 M" C% xfor(int i=0;i&lt;3;i++)
! w5 n' B5 z! A* C6 q{% c& x* A6 B! x- i. j7 U
   m_pRecordset-&gt;AddNew();///添加新记录5 a! ^2 d( h/ |% d9 C8 z& W
   m_pRecordset-&gtutCollect("ID",_variant_t((long)(i+10)));
# P- c+ l7 ^2 H3 r' @   m_pRecordset-&gtutCollect("username",_variant_t("叶利钦"));3 z' X' e: ^. f; M, ?
   m_pRecordset-&gtutCollect("old",_variant_t((long)71));1 s  p( |4 W% d4 p8 ]
   m_pRecordset-&gtutCollect("birthday",_variant_t("1930-3-15"));2 U% `/ R2 f& Q3 c4 q
}, J4 j! }" m2 R0 s
m_pRecordset-&gt;Move(1,_variant_t((long)adBookmarkFirst));///从第一条记录往下移动一条记录,即移动到第二条记录处% ^. Y2 A5 `+ L& H6 ^  B. Q
m_pRecordset-&gtutCollect(_variant_t("old"),_variant_t((long)45));///修改其年龄
0 P; C( W3 \2 ]3 ^$ `m_pRecordset-&gt;Update();///保存到库中    5 Z' b  h4 z0 N+ k6 C0 J% y: ~7 o2 ~
备注:多次查询可把查询过程做成一个函数ExecuteSQL让m_pRecordset获得连接指针m_pConnection查询结果
8 f* P3 g- J5 F6 f  Z# W" Fvoid ExecuteSQL(_ConnectionPtr  m_pConnection, _RecordsetPtr  m_pRecordset,CString strSql)
$ }% \& g# E. v. {7 f6 D* \{2 E/ e  v$ `$ X% L1 }
   //执行Select 语句
8 w. d7 G+ D: V$ v1 S   BSTR bstrSQL = strSql.AllocSysString();           
- U/ b' ^7 U" a% f    try
% n; J+ L+ W6 S5 h( l    {
* A$ D" o. b. I( v% M6 s       m_pRecordset-&gt;Open(bstrSQL,(IDispatch*)m_pConnection,adOpenDynamic,adLockOptimistic,adCmdText);
/ g0 Q4 |) Q  C; T9 U: y/ W& H0 s8 C: s           //adOpenDynamic:动态  adLockOptimistic乐观封锁法  adCmdText:文本查询语句
8 _+ y5 |( Y5 V" z8 I5 f4 K; o    }
+ F% }3 j7 N, E! \, ~3 l    catch(_com_error error)
9 B" y( E* F: m3 U: d: S    {
* }3 M$ f3 A; }" A7 \' ^7 ^/ U/ X+ n       CString errorMessage;  j% u: f# u2 J0 Y& W: N- f+ K
       errorMessage.format("%s",(LPTSTR)error.Description());5 p: `* ]+ i; G3 @( B& E) i0 R
       AfxMessageBox(errorMessage);
4 b( O/ _- Z& A: e    }
1 t2 B3 x: s' b}        4 {4 F: y3 {' B: d: H
//出错处理:& X, G7 x* e7 j" j
3127——没有找到目标表- l0 a. F4 h4 K3 K1 L
3092——目标表已经存在
3 a  W& a5 H7 B- t1 _# O例如:) t; h4 l% B, C+ N
catch(const _com_error e)
$ y3 B; m) E! L% R* n  x! y+ {; S{/ z9 @/ Q; q& V/ J) n- s, u3 `
    AfxMessageBox(e.Description());
  C2 r" a- j* n, x    long errorCode=e.WCode();7 v3 Z' y! b8 j) D5 l. p* d5 G
    if(3127==errorCode) AfxMessageBox("表不存在");. N. s" ^) R& N; X4 Q- [
    if(3092==errorCode) AfxMessageBox("表已经存在");! Y# v& Z7 i5 H9 }& a
    return FALSE;
1 G( r: @" A) W; G/ v; |} / x( X( r7 `' n. O, }# G

; p! @" E  e3 k0 s! F</TD></TR></TABLE>
作者: wangyu249    时间: 2006-11-21 15:14
<p>不错</p>




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