QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 3581|回复: 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%">
5 s7 B, o7 }9 H$ T, K
5 p! o' h# C8 ~5 Y<TR>7 _3 N2 o% z& i$ R  R9 L3 T' y
<TD vAlign=top width=32></TD>
! d: Y+ J- E+ B% g% H. H9 O<TD  vAlign=top>5. 记录集的遍历、更新
4 \% d( O4 D7 ]1 ~5 G- F- h( Y# a( y/ A2 O, }: j7 c' U2 o) p
     根据我们刚才通过执行SQL命令建立好的users表,它包含四个字段:ID,username,old,birthday
* M) T/ K. H9 u- h以下的代码实现:打开记录集,遍历所有记录,删除第一条记录,添加三条记录,移动光标到第二条记录,
  X+ S" m4 z: k0 U更改其年龄,保存到数据库。 # ^4 e; Z0 A! G  L" K. Q
_variant_t vUsername,vBirthday,vID,vOld;
+ t! y7 [3 k5 B, a, y+ x_RecordsetPtr m_pRecordset;4 ~% z0 @7 h* e2 U
m_pRecordset.CreateInstance("ADODB.Recordset");, \) R& R! \0 @: R
m_pRecordset-&gt;Open("SELECT * FROM users",
) v' N2 r% \( n4 t: B# U% I7 P _variant_t((IDispatch*)m_pConnection,true),4 j" u: V0 ]9 B8 c8 J, z' @
adOpenStatic,
6 K* C4 V6 a' p& W: A* p adLockOptimistic," G; i# }$ O3 }4 [$ @) v& R6 O
adCmdText);
2 ?6 r0 D* q) x$ w2 [while(!m_pRecordset-&gt;adoEOF)
$ d* [% d( |# |{
! z, B% _5 K1 E* q7 U% X   vID = m_pRecordset-&gt;GetCollect(_variant_t((long)0));///取得第1列的值,从0开始计数,5 h' q" [5 r, O- `' \4 c/ _
   ///你也可以直接给出列的名称,如下一行
3 t/ j' S  J2 P6 j9 z- |  d4 M   vUsername = m_pRecordset-&gt;GetCollect("username");///取得username字段的值
9 K6 x8 g* W+ w- b   vOld = m_pRecordset-&gt;GetCollect("old");0 N/ h$ o+ D& Q$ p' E' R
   vBirthday = m_pRecordset-&gt;GetCollect("birthday");
! [  l9 w+ S$ L( B( j) b+ Q   ///在DEBUG方式下的OUTPUT窗口输出记录集中的记录7 g1 B( k: N2 |. p. q! h
   if(vID.vt != VT_NULL &amp;&amp; vUsername.vt != VT_NULL &amp;&amp; vOld.vt != VT_NULL &amp;&amp; vBirthday.vt != VT_NULL)
% z3 `/ d8 O' o4 D/ [       TRACE("id:%d,姓名:%s,年龄:%d,生日:%s\r\n",9 C, {" Y, C0 Q4 a2 @
vID.lVal,0 b- R0 T9 S7 |  O- e! v
(LPCTSTR)(_bstr_t)vUsername,/ T+ j& b4 R1 o0 z$ C3 d6 b
vOld.lVal,
$ ~" T+ ^; Q6 _! R! o( i (LPCTSTR)(_bstr_t)vBirthday);" q8 z4 Z' b) T9 K' l
   m_pRecordset-&gt;MoveNext();///移到下一条记录2 J6 y" d8 g. q0 @  D8 }
}
: g) |$ `7 A( P9 L: ^6 S: m# pm_pRecordset-&gt;MoveFirst();///移到首条记录
; Q) k7 j) z8 c) N4 b- _m_pRecordset-&gt;Delete(adAffectCurrent);///删除当前记录$ D0 ~$ }& u% e( C( H! w
///添加三条新记录并赋值5 ?% m! l2 ]4 p2 g! i
for(int i=0;i&lt;3;i++)
% N) S8 l, V9 E5 Z" `{; {2 ~% O: D# M2 I) |& {; n# g
   m_pRecordset-&gt;AddNew();///添加新记录1 v+ I/ Z+ L6 j* b
   m_pRecordset-&gtutCollect("ID",_variant_t((long)(i+10)));
6 v7 }  f; d, P& ^# {7 e, @   m_pRecordset-&gtutCollect("username",_variant_t("叶利钦"));) q# k: D# H8 F
   m_pRecordset-&gtutCollect("old",_variant_t((long)71));
1 H( h. I$ z0 g5 I   m_pRecordset-&gtutCollect("birthday",_variant_t("1930-3-15"));, ~" f) x2 F9 g* }* h7 I
}
( F1 @8 o+ S. f& q$ Jm_pRecordset-&gt;Move(1,_variant_t((long)adBookmarkFirst));///从第一条记录往下移动一条记录,即移动到第二条记录处2 d# ]! o, \# |2 L3 E5 q9 r7 d4 G
m_pRecordset-&gtutCollect(_variant_t("old"),_variant_t((long)45));///修改其年龄) f8 |& r% L) ^" v' j3 M
m_pRecordset-&gt;Update();///保存到库中    % v6 B2 j- I5 T3 ?: ^+ g
备注:多次查询可把查询过程做成一个函数ExecuteSQL让m_pRecordset获得连接指针m_pConnection查询结果 % l% {% }% I( ?4 Q; g
void ExecuteSQL(_ConnectionPtr  m_pConnection, _RecordsetPtr  m_pRecordset,CString strSql)
7 [) q% {- l0 q; l6 z{& q0 A0 C' B" s% [
   //执行Select 语句% r# q9 {+ h0 |3 @" A9 u
   BSTR bstrSQL = strSql.AllocSysString();           
+ x8 A5 d& x) @; R0 F% r    try3 O; d% [3 c9 W3 P
    {+ l% R8 @- t, c5 Q: R
       m_pRecordset-&gt;Open(bstrSQL,(IDispatch*)m_pConnection,adOpenDynamic,adLockOptimistic,adCmdText);
/ A! q; b8 c! N           //adOpenDynamic:动态  adLockOptimistic乐观封锁法  adCmdText:文本查询语句2 W2 j, @5 a. u' t7 r
    }) d) H0 p! ?9 U( g# d& U5 J; H
    catch(_com_error error)
+ S2 ^7 O; T( U" D$ {/ W    {
( o) i9 T2 F6 h3 R% J       CString errorMessage;
5 n& c% _7 L. ~       errorMessage.format("%s",(LPTSTR)error.Description());
- h2 Z3 r3 m- [  I       AfxMessageBox(errorMessage);
% B* t0 b" g; M& [- a( v    }
% a- ~% U' Y+ \8 t7 V}        
: `: ]0 U# D! D; j//出错处理:
! o# J) s% k; q3127——没有找到目标表3 K" ]" F' X# u9 ~8 F
3092——目标表已经存在
+ g) P' P4 m* `7 Y例如:
  U0 F' s0 w$ ]" v: I# ?catch(const _com_error e)
9 O3 z7 U  S1 w& m{
2 L+ v, C" z6 o    AfxMessageBox(e.Description());
1 j4 |' S4 B, t) ~1 i* i- J" ]% k  m    long errorCode=e.WCode();: C" ]/ W, \0 L8 F
    if(3127==errorCode) AfxMessageBox("表不存在");
3 @8 R5 n0 M) ?6 Q( Q    if(3092==errorCode) AfxMessageBox("表已经存在");$ ~! A) ]1 R& N7 h& i8 w
    return FALSE;9 L1 B( W/ P2 a" n* t) \
}
* ]5 O1 ]6 B) w0 m  E& x5 B1 n( q1 ^3 K0 {
</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-4-18 06:51 , Processed in 0.401957 second(s), 58 queries .

回顶部