QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 3642|回复: 1
打印 上一主题 下一主题

[转帖]在Visual C++中用ADO进行数据库编程(下)

[复制链接]
字体大小: 正常 放大
god        

206

主题

2

听众

882

积分

升级  70.5%

该用户从未签到

新人进步奖

跳转到指定楼层
1#
发表于 2005-3-30 22:53 |只看该作者 |正序浏览
|招呼Ta 关注Ta
<TABLE cellPadding=0 cellSpacing=0 height=325 style="TABLE-LAYOUT: fixed" width="100%">
& j* `) i* _" N7 e
; Z0 A3 ?- y) \$ `<TR>7 T6 Q+ y4 h+ K% A
<TD vAlign=top width=32></TD>0 {: y# d) m; T6 ~; |
<TD  vAlign=top>5. 记录集的遍历、更新+ [* a/ y# L" C6 v4 F" l! y

( R& _' D, ~3 j9 @2 b: p     根据我们刚才通过执行SQL命令建立好的users表,它包含四个字段:ID,username,old,birthday
$ [- h3 R2 ~  n: _以下的代码实现:打开记录集,遍历所有记录,删除第一条记录,添加三条记录,移动光标到第二条记录,
0 q$ E+ v# Z' J% R6 p* m& e. c更改其年龄,保存到数据库。
: d9 ]: u1 p0 [$ @9 E$ s0 |6 c5 J" B8 c_variant_t vUsername,vBirthday,vID,vOld;8 N4 [4 M1 Z4 _6 L" _
_RecordsetPtr m_pRecordset;/ s. f' c. F5 K# M- t/ t
m_pRecordset.CreateInstance("ADODB.Recordset");
0 H( @* L3 o9 l4 |" \- U. nm_pRecordset-&gt;Open("SELECT * FROM users",
6 Q( e- ~6 O8 Q0 A9 F _variant_t((IDispatch*)m_pConnection,true),( r5 U) O9 l3 D$ J
adOpenStatic,& D/ f7 j$ f. I. K& m
adLockOptimistic,1 U- T8 i- z* @% U! U% _, q2 |2 g
adCmdText);4 c, N3 S. D+ b- U, W! X/ P
while(!m_pRecordset-&gt;adoEOF)/ M. t; c  u' h! D; H5 b( P
{7 z' f9 ?' a1 m7 M. l
   vID = m_pRecordset-&gt;GetCollect(_variant_t((long)0));///取得第1列的值,从0开始计数,
& d9 w" e# J! m   ///你也可以直接给出列的名称,如下一行* J# s, i4 e) I$ A* e  d! _8 J9 u
   vUsername = m_pRecordset-&gt;GetCollect("username");///取得username字段的值! N" R% s0 p8 k) _% @. l4 ^, l( B
   vOld = m_pRecordset-&gt;GetCollect("old");
4 O' S1 g, M; r. ~1 Y   vBirthday = m_pRecordset-&gt;GetCollect("birthday");
( p2 K9 \9 F/ d( J$ x4 Z8 r   ///在DEBUG方式下的OUTPUT窗口输出记录集中的记录/ h; _  n) ^. o) _9 V2 E+ K
   if(vID.vt != VT_NULL &amp;&amp; vUsername.vt != VT_NULL &amp;&amp; vOld.vt != VT_NULL &amp;&amp; vBirthday.vt != VT_NULL): P! X; p. h( m+ s
       TRACE("id:%d,姓名:%s,年龄:%d,生日:%s\r\n",/ I; u# G* J* e& f
vID.lVal,( y! a8 X- f* g8 x# A
(LPCTSTR)(_bstr_t)vUsername,6 H+ _' K8 K' u
vOld.lVal,: k5 y) e0 v+ i, N/ x' b
(LPCTSTR)(_bstr_t)vBirthday);# n8 Y9 t+ A2 {' I4 g1 x! Y
   m_pRecordset-&gt;MoveNext();///移到下一条记录. J# `; b) _$ R2 U; d* m4 j; Z& y
}
3 P4 n6 }8 a5 f2 y" M% U. jm_pRecordset-&gt;MoveFirst();///移到首条记录4 ~* C# k6 t8 G0 V
m_pRecordset-&gt;Delete(adAffectCurrent);///删除当前记录" h- U" l+ Y# y- y7 _8 P
///添加三条新记录并赋值7 f# l8 O) N8 _9 H2 q. |! M, Z
for(int i=0;i&lt;3;i++)
6 o! ?+ }% e& ^  C6 t0 p& w{7 Q' E/ }+ B: S1 @$ h2 M3 F  ?! y
   m_pRecordset-&gt;AddNew();///添加新记录
6 z3 l; X  e1 h- U   m_pRecordset-&gtutCollect("ID",_variant_t((long)(i+10)));
1 ?- \% o* V. m+ i/ w' d   m_pRecordset-&gtutCollect("username",_variant_t("叶利钦"));
+ ^5 z& T' G% B0 o- P( p; o/ n   m_pRecordset-&gtutCollect("old",_variant_t((long)71));
& O  E" C% u7 G+ V  {) s   m_pRecordset-&gtutCollect("birthday",_variant_t("1930-3-15"));8 n) o* e9 F+ ~/ B( [/ j
}
6 _) X0 A" q% M3 Im_pRecordset-&gt;Move(1,_variant_t((long)adBookmarkFirst));///从第一条记录往下移动一条记录,即移动到第二条记录处/ j3 v  R8 l1 O+ F+ f% h
m_pRecordset-&gtutCollect(_variant_t("old"),_variant_t((long)45));///修改其年龄  ]& m& m' S5 H8 Z! O
m_pRecordset-&gt;Update();///保存到库中    % M  k- H$ l, R' v+ L) p
备注:多次查询可把查询过程做成一个函数ExecuteSQL让m_pRecordset获得连接指针m_pConnection查询结果 ! o) a0 e4 E( w! o
void ExecuteSQL(_ConnectionPtr  m_pConnection, _RecordsetPtr  m_pRecordset,CString strSql)
4 t1 N. V& M" V' Y" R5 a9 q/ c{
1 J7 f. u( w9 q0 s2 z& K0 G* ?   //执行Select 语句8 m8 T; G  I! p
   BSTR bstrSQL = strSql.AllocSysString();           
* s  r0 K3 }; m9 s/ Z0 G    try) H* ^6 ~& \1 e' q$ U4 u9 m
    {
! Y' I2 F4 \2 I' g0 X( Q: k       m_pRecordset-&gt;Open(bstrSQL,(IDispatch*)m_pConnection,adOpenDynamic,adLockOptimistic,adCmdText); 4 z* @, t6 k/ H2 n& J4 H
           //adOpenDynamic:动态  adLockOptimistic乐观封锁法  adCmdText:文本查询语句7 O. a4 W5 I6 n; t0 G3 j, M* X. |  E
    }
$ R( c! n/ r0 V) l) i    catch(_com_error error)
4 E$ ]- ~& v3 {+ x/ @4 W/ a    {
: J. V: c  A0 u: S; q$ w3 c+ n       CString errorMessage;
" o  E! Q+ `7 b5 [1 K- s/ C       errorMessage.format("%s",(LPTSTR)error.Description());
$ U$ ^2 p0 C7 i: x       AfxMessageBox(errorMessage);. I+ _6 j3 U9 u2 }
    }5 J$ r$ c( m9 ]9 ?0 p; F
}        
6 l0 z/ n3 A& z6 r3 K; W- t5 Y//出错处理:
/ D+ D& P' b* \/ s. F' V3127——没有找到目标表# Y2 w- t. r1 V
3092——目标表已经存在* V" \* z  L3 R4 A" ^/ j( d
例如:
7 k* _/ m- m/ M- hcatch(const _com_error e)' k7 ^; A% t0 t* `8 Q
{* T( u& r% u9 u  p, E: Q6 C- Z
    AfxMessageBox(e.Description());
0 W7 L0 ?1 X' [& z7 X2 q    long errorCode=e.WCode();
9 f8 ^1 Z) j- E) s) N; ]4 x    if(3127==errorCode) AfxMessageBox("表不存在");
9 q) ~+ {/ J. k+ d7 @) v6 k, H( Q    if(3092==errorCode) AfxMessageBox("表已经存在");- A2 [. l; `, ]
    return FALSE;
6 x. L8 m$ a- S- d7 g$ X* N2 t$ i* }} - B) D& g( H1 X- k: h
: X& w% J, v' N" _
</TD></TR></TABLE>
zan
转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
如果我没给你翅膀,你要学会用理想去飞翔!!!
wangyu249        

1

主题

3

听众

54

积分

升级  51.58%

该用户从未签到

新人进步奖

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册地址

qq
收缩
  • 电话咨询

  • 04714969085
fastpost

关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

手机版|Archiver| |繁體中文 手机客户端  

蒙公网安备 15010502000194号

Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

GMT+8, 2026-7-19 18:46 , Processed in 0.411652 second(s), 59 queries .

回顶部