QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 3675|回复: 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%">
& e# p: J) |6 w6 Y3 T1 u7 Z3 f) B" ^, F6 s! K: ]& H# e; p$ i% k1 Y! H
<TR>
9 V1 ]1 c4 a9 Y3 U<TD vAlign=top width=32></TD>
* y; O0 T6 B# g6 N2 z( ^6 w<TD  vAlign=top>5. 记录集的遍历、更新3 g5 b. r# t$ |" e

  M  u' |4 c2 @7 [# ?     根据我们刚才通过执行SQL命令建立好的users表,它包含四个字段:ID,username,old,birthday1 M' ?" {, b9 M* `8 A
以下的代码实现:打开记录集,遍历所有记录,删除第一条记录,添加三条记录,移动光标到第二条记录,
0 z2 [+ [, D( J! J7 P) ~更改其年龄,保存到数据库。
& H; i) y: X# S_variant_t vUsername,vBirthday,vID,vOld;
/ t3 d$ X* a0 Z( c$ W% L0 O_RecordsetPtr m_pRecordset;
8 f1 p& j. [; t9 t* ^6 E0 E7 Mm_pRecordset.CreateInstance("ADODB.Recordset");8 k! K& R$ T$ P( E: g: U: @
m_pRecordset-&gt;Open("SELECT * FROM users",
1 A+ N& e6 F- }/ S; m4 x _variant_t((IDispatch*)m_pConnection,true),8 G- T) X2 u0 I! q9 J0 _
adOpenStatic,* S; K0 _6 Y5 M  A& Z
adLockOptimistic,
  t, @$ N# D; ]5 B; Y3 z  J( Y+ c adCmdText);
0 t9 x: [% E6 Z6 S; gwhile(!m_pRecordset-&gt;adoEOF)6 Z) S) {/ p  R% \: w
{6 F1 o8 q, ~8 j5 p1 o; p
   vID = m_pRecordset-&gt;GetCollect(_variant_t((long)0));///取得第1列的值,从0开始计数,
# J1 |$ m! H% K2 B( F& f5 u   ///你也可以直接给出列的名称,如下一行
& o( H2 {* [: d$ T7 j, c. ~: R% _1 i   vUsername = m_pRecordset-&gt;GetCollect("username");///取得username字段的值
( j- E" W1 V; y( Z) _& s   vOld = m_pRecordset-&gt;GetCollect("old");) \( N! m' ?# ~2 O, E/ }# h
   vBirthday = m_pRecordset-&gt;GetCollect("birthday");+ c9 P, G0 E1 e* U! u# a4 {6 @
   ///在DEBUG方式下的OUTPUT窗口输出记录集中的记录) A* F: B. C$ b9 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)
, ~( t5 a1 s$ k% m) M       TRACE("id:%d,姓名:%s,年龄:%d,生日:%s\r\n",
# U8 T8 P, l4 O vID.lVal,( t5 |5 Q- i0 Z# D
(LPCTSTR)(_bstr_t)vUsername,6 _3 r# W* _. e  C+ f& Q  m8 M
vOld.lVal,, U# y7 n1 p8 u. G3 b
(LPCTSTR)(_bstr_t)vBirthday);
: r# `" z6 d& a6 J; R% j5 d, c   m_pRecordset-&gt;MoveNext();///移到下一条记录
- |6 B' R) u3 ?7 k' c6 {}
: F9 n, {+ A- y8 lm_pRecordset-&gt;MoveFirst();///移到首条记录' I3 t- K8 l' \( m9 Y) a$ W" @
m_pRecordset-&gt;Delete(adAffectCurrent);///删除当前记录2 X4 a5 V) H/ S0 |4 p. c
///添加三条新记录并赋值
# h" j0 }. T/ ~& L+ bfor(int i=0;i&lt;3;i++)
  _4 @) q* [4 {5 u{
1 R- s3 b! C3 {8 k# i5 l   m_pRecordset-&gt;AddNew();///添加新记录, q  _6 b/ f& X; `- G
   m_pRecordset-&gtutCollect("ID",_variant_t((long)(i+10)));
* V( B# o2 I) T% x8 G( a% h& `   m_pRecordset-&gtutCollect("username",_variant_t("叶利钦"));/ v( j) {) y2 h" g. r
   m_pRecordset-&gtutCollect("old",_variant_t((long)71));1 u3 z0 b! m& \8 B; u+ y' r; l
   m_pRecordset-&gtutCollect("birthday",_variant_t("1930-3-15"));
8 H5 e: J8 H) i}: j  j' D& R0 ^2 q9 w8 _
m_pRecordset-&gt;Move(1,_variant_t((long)adBookmarkFirst));///从第一条记录往下移动一条记录,即移动到第二条记录处
7 [8 E$ S7 A9 v6 Em_pRecordset-&gtutCollect(_variant_t("old"),_variant_t((long)45));///修改其年龄% E) P. L. A. o
m_pRecordset-&gt;Update();///保存到库中    ( [/ \+ G% v6 G4 ]) ~: h
备注:多次查询可把查询过程做成一个函数ExecuteSQL让m_pRecordset获得连接指针m_pConnection查询结果
1 G; z( g& Z/ s6 m; Jvoid ExecuteSQL(_ConnectionPtr  m_pConnection, _RecordsetPtr  m_pRecordset,CString strSql)* W- H4 h4 O! T; E) d( p' c
{6 ^  ]0 c4 ~3 C6 }/ P# Q
   //执行Select 语句/ ?1 V- I) V- q
   BSTR bstrSQL = strSql.AllocSysString();           # P5 E6 w& g! X$ i
    try( n* O; C, k8 O. G; x6 ^! B
    {6 a4 B0 \4 V5 j+ ?& u
       m_pRecordset-&gt;Open(bstrSQL,(IDispatch*)m_pConnection,adOpenDynamic,adLockOptimistic,adCmdText);
4 r& }8 W& l! l/ N# c- y  p           //adOpenDynamic:动态  adLockOptimistic乐观封锁法  adCmdText:文本查询语句0 C0 r, E. s8 j" e" v
    }. _$ e& ]$ k& |
    catch(_com_error error)" L5 C; k9 ]" J) P7 T4 l: }' z5 y$ X
    {! z6 n9 J& \7 h) y2 P7 \9 Y7 D3 f0 o
       CString errorMessage;
* m: J' b" L+ U8 W: i       errorMessage.format("%s",(LPTSTR)error.Description());2 B3 K6 k) D: R. h5 y
       AfxMessageBox(errorMessage);
( r2 ]6 p0 \: S. i$ u7 Q    }
) W% |$ X/ ~7 p: e' o! K}        
; \3 `$ A4 g! n; U1 T0 y5 E# t//出错处理:: u, \" k: ]0 Z; f
3127——没有找到目标表
! \1 o9 ~4 p7 ~: _1 b" z- w" B( P3092——目标表已经存在0 U, Z) \" P6 Y# H& G2 ~
例如:0 |5 \* `5 F( d! P2 D; ~$ v. {
catch(const _com_error e)
* Q7 d% E/ s+ b{. O7 v2 z) i5 J1 @; ?3 b+ y$ J7 c
    AfxMessageBox(e.Description());
+ ^% K* {; f; n5 `1 g7 ~  C! f8 t    long errorCode=e.WCode();( a0 Y& W3 g2 p. R8 W6 l4 ^
    if(3127==errorCode) AfxMessageBox("表不存在");4 S& G; i; t$ }7 A1 f7 I
    if(3092==errorCode) AfxMessageBox("表已经存在");
! Z  J4 G/ ?+ @* f3 C1 w    return FALSE;& a9 U4 m. r% y0 ^  S' o
} % s" z) Q! ~4 |5 p

3 G, ^7 x* g6 @& C6 w3 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-9-3 07:47 , Processed in 0.480055 second(s), 59 queries .

回顶部