QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 3377|回复: 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%">; L! ]" e' C2 @5 m
0 q3 D6 {. g9 v+ W
<TR>- d& N4 f8 ]* a7 C
<TD vAlign=top width=32></TD>
3 W- S5 R, c, k9 E<TD  vAlign=top>5. 记录集的遍历、更新" V. `6 ^' {8 }( {4 ^( s8 T9 q

$ W- h4 Q0 ^. `* ~* r; @     根据我们刚才通过执行SQL命令建立好的users表,它包含四个字段:ID,username,old,birthday' _5 O& o$ b* k6 |
以下的代码实现:打开记录集,遍历所有记录,删除第一条记录,添加三条记录,移动光标到第二条记录,
  c3 i/ y1 \0 g/ c' P更改其年龄,保存到数据库。 % T6 u' K" A9 _. W* ^) [
_variant_t vUsername,vBirthday,vID,vOld;
8 \6 y. m  K- Q& x' N/ n; u/ i_RecordsetPtr m_pRecordset;
- g8 q& ^1 G+ s7 C" j  a* um_pRecordset.CreateInstance("ADODB.Recordset");) h$ J1 d; `  h) \" a" _# F. O8 i
m_pRecordset-&gt;Open("SELECT * FROM users",' f, q- l% K7 |7 f, `* g
_variant_t((IDispatch*)m_pConnection,true),
/ r) g' K4 Y3 _6 h adOpenStatic,) n( b/ e8 V5 R6 O
adLockOptimistic,
7 E/ O0 t! e4 U, \" L4 t0 z adCmdText);
, T) d% W/ b) e5 t, @while(!m_pRecordset-&gt;adoEOF)! l# D9 j8 b+ V9 I' a
{" m$ p7 Z5 [# h
   vID = m_pRecordset-&gt;GetCollect(_variant_t((long)0));///取得第1列的值,从0开始计数,- [& \( Z& d! \* T4 F  D/ k
   ///你也可以直接给出列的名称,如下一行
8 V" f+ r- E! X   vUsername = m_pRecordset-&gt;GetCollect("username");///取得username字段的值
% P: A% M* C9 Z( a   vOld = m_pRecordset-&gt;GetCollect("old");/ s* x$ ]! }% a, e% n5 x
   vBirthday = m_pRecordset-&gt;GetCollect("birthday");( `( `+ E- \4 W! Z9 v
   ///在DEBUG方式下的OUTPUT窗口输出记录集中的记录+ V) W' i4 |2 b* C2 m+ h4 P
   if(vID.vt != VT_NULL &amp;&amp; vUsername.vt != VT_NULL &amp;&amp; vOld.vt != VT_NULL &amp;&amp; vBirthday.vt != VT_NULL)
4 E# U* d- h' M6 h% V5 M       TRACE("id:%d,姓名:%s,年龄:%d,生日:%s\r\n",
5 ?# ?7 K; b% u$ b vID.lVal,
& y! @6 i7 N( J: m* t, q3 k (LPCTSTR)(_bstr_t)vUsername,
6 L* z3 u1 W4 r$ C" d; ]2 x vOld.lVal,
9 W, ^6 u6 _, h$ Y7 _ (LPCTSTR)(_bstr_t)vBirthday);
+ {% \; H0 k$ \' _6 G   m_pRecordset-&gt;MoveNext();///移到下一条记录
+ Z* Y, R7 n" h2 @, v2 I* Y* `}
  a, C% C! e- N, l0 vm_pRecordset-&gt;MoveFirst();///移到首条记录* }0 b. T) M$ ~7 g2 [
m_pRecordset-&gt;Delete(adAffectCurrent);///删除当前记录
* L" |$ r. x7 y2 m1 @- f2 \///添加三条新记录并赋值
; @6 w( d( T6 a  j+ c  W0 sfor(int i=0;i&lt;3;i++), u  O& h. p; x
{# ~6 j* F+ K0 W. q9 E
   m_pRecordset-&gt;AddNew();///添加新记录
, X% l  F( H3 F   m_pRecordset-&gtutCollect("ID",_variant_t((long)(i+10)));
. v5 y. G, S. x6 m, B9 f/ Y8 h   m_pRecordset-&gtutCollect("username",_variant_t("叶利钦"));# i! s/ n% L  F+ w. u/ {" i
   m_pRecordset-&gtutCollect("old",_variant_t((long)71));
! F) F& v% `9 C) J: k/ ?8 j: D9 ?8 l   m_pRecordset-&gtutCollect("birthday",_variant_t("1930-3-15"));
( J; m, a- Z. Q( O% E}: d( @  o) [  F; f4 \# |: J
m_pRecordset-&gt;Move(1,_variant_t((long)adBookmarkFirst));///从第一条记录往下移动一条记录,即移动到第二条记录处: J4 ]+ \( L3 v9 b1 ?8 ^
m_pRecordset-&gtutCollect(_variant_t("old"),_variant_t((long)45));///修改其年龄
* S( c" p6 v, E3 R# Fm_pRecordset-&gt;Update();///保存到库中    ! ~( R- k% W, y
备注:多次查询可把查询过程做成一个函数ExecuteSQL让m_pRecordset获得连接指针m_pConnection查询结果
  Q: Q( t: k, Fvoid ExecuteSQL(_ConnectionPtr  m_pConnection, _RecordsetPtr  m_pRecordset,CString strSql)/ Q" H' {! f) y( P  n6 M) v  T; w
{5 C8 U! ^: ~8 D1 ]6 A, c, h
   //执行Select 语句6 y' M' o0 t3 @1 h7 [
   BSTR bstrSQL = strSql.AllocSysString();           ! O) i6 F$ F. {  B# a) f( ^2 D
    try
2 l. _7 G+ j2 S" p. g0 \- e    {9 p1 P6 k$ X3 K- @8 X+ z
       m_pRecordset-&gt;Open(bstrSQL,(IDispatch*)m_pConnection,adOpenDynamic,adLockOptimistic,adCmdText);
; I5 d8 {- R5 u) _4 e1 D4 x$ x0 b% n& \           //adOpenDynamic:动态  adLockOptimistic乐观封锁法  adCmdText:文本查询语句
% s! \* P" N: W    }7 }6 P* O5 Y2 w; X
    catch(_com_error error); t- Q7 \* B4 ~9 F+ ^5 E
    {& W5 [! {, ]: J7 ?& D
       CString errorMessage;
. K5 T+ u# C0 }/ J( L6 L. s% R       errorMessage.format("%s",(LPTSTR)error.Description());
/ q1 {% u2 {/ [: J2 Y/ k, q6 z; W       AfxMessageBox(errorMessage);
0 z$ u) F6 J$ V$ w6 w) q) [    }
3 U) Q2 V% I. S; s& Y1 Z}        ! B; H! s- ^& F) M9 S. n
//出错处理:
, i( \  C9 [2 x  n3127——没有找到目标表
9 M- }3 @/ A5 {9 I2 `- |3092——目标表已经存在# l% p% m! Z6 k: ~5 g- h
例如:! ]+ N. N* M; i( u& ~8 e8 t) G
catch(const _com_error e)
+ C4 L6 ]! @  e9 y# z6 Z{9 N  o; |4 `# T) s: D
    AfxMessageBox(e.Description());2 U% A7 `' w2 `! q* B2 @+ y( M5 ]* d# x
    long errorCode=e.WCode();
) e, j. f% [( i- ~# I    if(3127==errorCode) AfxMessageBox("表不存在");
. Q9 y5 J9 n; G0 o0 x    if(3092==errorCode) AfxMessageBox("表已经存在");! w, i  v, G2 m# L2 B# h* T
    return FALSE;
3 Q! c1 b7 M; U, `} ! T3 B- K9 x$ z  _

  Y* S- d! X+ o: G! F  m4 I</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, 2025-8-2 08:15 , Processed in 0.524438 second(s), 57 queries .

回顶部