QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 3367|回复: 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%">
$ H6 n. H/ x5 k5 }
; B% i- J7 e8 _3 Q  M4 o% J<TR>
0 }  c, d( z2 J( T0 l( p/ F<TD vAlign=top width=32></TD>6 K5 D$ L& ~. C
<TD  vAlign=top>5. 记录集的遍历、更新1 a- ]* v* Z1 e
8 y+ i- p3 g7 f6 r- B3 ]0 A4 \
     根据我们刚才通过执行SQL命令建立好的users表,它包含四个字段:ID,username,old,birthday
1 [+ n: Z7 h: j6 w以下的代码实现:打开记录集,遍历所有记录,删除第一条记录,添加三条记录,移动光标到第二条记录,$ k1 s! i$ w1 u% N9 p. ~
更改其年龄,保存到数据库。
2 x/ ?/ h. M2 o1 I4 [- j_variant_t vUsername,vBirthday,vID,vOld;$ ?+ D& o7 }: g' U1 J9 a  l$ o! v
_RecordsetPtr m_pRecordset;  _* t$ `9 A; S- @9 X& H
m_pRecordset.CreateInstance("ADODB.Recordset");
" H! E# J8 u' S6 z5 t9 f1 Rm_pRecordset-&gt;Open("SELECT * FROM users",
; f' q2 F7 D: Z- A6 D/ H; f4 V6 W _variant_t((IDispatch*)m_pConnection,true),
1 {9 G5 j3 j6 e7 S adOpenStatic,
0 M6 y& Q9 `$ S+ Y) {) n adLockOptimistic,
( `. E$ d  N% C. ~- c; f, }- j% l adCmdText);0 X& E/ p  c# I/ c5 g
while(!m_pRecordset-&gt;adoEOF)
* `4 e& P5 \! @2 {3 J5 u; ?9 D{6 H# a8 k9 G" v" B# E
   vID = m_pRecordset-&gt;GetCollect(_variant_t((long)0));///取得第1列的值,从0开始计数,
0 ?1 m; d+ p3 ?. J   ///你也可以直接给出列的名称,如下一行- }( |( `* k  i* o
   vUsername = m_pRecordset-&gt;GetCollect("username");///取得username字段的值
) Q2 p( K( @) B. [6 U+ I! K   vOld = m_pRecordset-&gt;GetCollect("old");
! E6 C1 R0 _/ M% Y   vBirthday = m_pRecordset-&gt;GetCollect("birthday");
% B+ o0 U8 p! H+ }* B   ///在DEBUG方式下的OUTPUT窗口输出记录集中的记录% K, r  z2 V. I1 y# Y
   if(vID.vt != VT_NULL &amp;&amp; vUsername.vt != VT_NULL &amp;&amp; vOld.vt != VT_NULL &amp;&amp; vBirthday.vt != VT_NULL)
3 c. s) y: T8 Z# Q5 S# O       TRACE("id:%d,姓名:%s,年龄:%d,生日:%s\r\n",( l3 T7 |1 ?. X, d, d+ T
vID.lVal,
% w2 `. ]; t3 n% f. M7 y (LPCTSTR)(_bstr_t)vUsername,; _' T* n9 ~( R8 g# x
vOld.lVal,* W" c& B$ F$ s
(LPCTSTR)(_bstr_t)vBirthday);- u' g4 C! k. {( i# S
   m_pRecordset-&gt;MoveNext();///移到下一条记录8 c1 K" b% G3 S7 _' `  R
}, d9 [. Y& D6 y6 E9 M* Y' K) i5 h# j
m_pRecordset-&gt;MoveFirst();///移到首条记录) T! g7 V4 S3 ~2 ~9 A# i' O
m_pRecordset-&gt;Delete(adAffectCurrent);///删除当前记录; f& M+ h9 k6 `; o
///添加三条新记录并赋值
$ {6 M( t- c/ a. Y$ ~: d2 Sfor(int i=0;i&lt;3;i++)
) Y: N8 X3 g+ r" ~# P- N: m{1 B% u& o* u0 f# u# }' R. {6 E
   m_pRecordset-&gt;AddNew();///添加新记录: X' c6 }& H6 l; U: V
   m_pRecordset-&gtutCollect("ID",_variant_t((long)(i+10)));
4 V+ I, p) d0 I% v( N2 P' [   m_pRecordset-&gtutCollect("username",_variant_t("叶利钦"));
8 g$ T# J% Q3 @$ K! j7 S   m_pRecordset-&gtutCollect("old",_variant_t((long)71));
" T7 b" o, A3 J" h$ d$ `   m_pRecordset-&gtutCollect("birthday",_variant_t("1930-3-15"));3 `# s( U* Y. |6 v
}+ N. T6 {0 u$ n3 w+ d
m_pRecordset-&gt;Move(1,_variant_t((long)adBookmarkFirst));///从第一条记录往下移动一条记录,即移动到第二条记录处% a5 y" s9 u, V% G1 ^7 p
m_pRecordset-&gtutCollect(_variant_t("old"),_variant_t((long)45));///修改其年龄
  V2 @/ r) _# s9 a# J: f* }9 O: km_pRecordset-&gt;Update();///保存到库中   
6 J: {+ [; U4 m, m9 S3 U, R( ~9 x备注:多次查询可把查询过程做成一个函数ExecuteSQL让m_pRecordset获得连接指针m_pConnection查询结果
/ E3 P. A0 Z& \void ExecuteSQL(_ConnectionPtr  m_pConnection, _RecordsetPtr  m_pRecordset,CString strSql)
+ b) a; U% i5 X- D3 m1 c. `{
! u' B2 ^- b. d+ ]- \   //执行Select 语句
7 [# x9 E1 D; S8 ]" A9 G+ X   BSTR bstrSQL = strSql.AllocSysString();           
. l9 S0 @9 [( u' r4 H    try
2 H( s& t( v8 w3 f" m' s! c4 Z1 M    {) J( ?% J: j% L+ S% z
       m_pRecordset-&gt;Open(bstrSQL,(IDispatch*)m_pConnection,adOpenDynamic,adLockOptimistic,adCmdText); $ w' a* J& T: k9 B
           //adOpenDynamic:动态  adLockOptimistic乐观封锁法  adCmdText:文本查询语句
0 Y- U' ^$ v6 [$ G% v- b    }0 {& F0 H9 K# F7 L  w8 R1 A( K
    catch(_com_error error), M7 U- ?3 C* t- U( n/ H0 c
    {
1 u) X: ~2 Q% w0 T4 W0 ]3 v2 ^       CString errorMessage;
# T& I) c0 h* o4 X; H' O" n1 y9 b       errorMessage.format("%s",(LPTSTR)error.Description());
1 G' Z$ E* f4 g" Z  O2 P. k1 K# D$ p       AfxMessageBox(errorMessage);( k+ f1 l9 F3 l+ T; h
    }$ T0 c+ N# B7 o$ Z% T9 P; Q
}        * _: e$ O6 g$ T# r
//出错处理:8 [; W* |: |' k! Z2 `. C
3127——没有找到目标表
7 a5 f4 C! _1 d7 @+ Y  r1 N3092——目标表已经存在) y' j  h3 ~8 H: R
例如:
, E" @8 s  ^/ F# Q/ ]catch(const _com_error e), R; e7 b! h( T2 R
{
3 P- p) {  t/ U2 @$ E% n2 B    AfxMessageBox(e.Description());
, ]) R- M$ K& M    long errorCode=e.WCode();. G4 d7 q6 \5 i: q2 q+ d8 I
    if(3127==errorCode) AfxMessageBox("表不存在");$ A( |6 _$ B: b/ \/ s3 s
    if(3092==errorCode) AfxMessageBox("表已经存在");
7 A7 U& j4 q! m/ ^- B    return FALSE;' b" A( l; Y) u, ~
}
# i: N; m7 r8 D  m  f
/ U0 |+ C) b% _0 [' q; e</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-7-27 23:36 , Processed in 1.534413 second(s), 57 queries .

回顶部