QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 3609|回复: 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%">
6 P$ h1 N5 \5 z0 L! J5 O( L2 T8 g7 _1 [& h' H3 [
<TR>: t  T" N9 Y' b% b& b
<TD vAlign=top width=32></TD>
9 C- @6 Y( A, X4 }) O<TD  vAlign=top>5. 记录集的遍历、更新, D  e- L- Z0 ?0 d  x- N% }
9 \5 s: s. h9 ]* }) a, t
     根据我们刚才通过执行SQL命令建立好的users表,它包含四个字段:ID,username,old,birthday
+ {6 }2 v: I6 Q以下的代码实现:打开记录集,遍历所有记录,删除第一条记录,添加三条记录,移动光标到第二条记录,0 C. I2 s5 f, h1 {+ k
更改其年龄,保存到数据库。 # Y$ I/ y4 A8 }* x
_variant_t vUsername,vBirthday,vID,vOld;, K2 r9 Y+ Q8 j* l# C
_RecordsetPtr m_pRecordset;
9 r  N, n# t6 V5 W+ Sm_pRecordset.CreateInstance("ADODB.Recordset");
- k( I" R) l0 x# w$ N' b( _. sm_pRecordset-&gt;Open("SELECT * FROM users",4 F( D0 s7 V) F& a
_variant_t((IDispatch*)m_pConnection,true),0 X# i+ u7 g% b- ^& f/ N, X  K
adOpenStatic,0 ?6 N; K8 r' C6 e* ~9 B
adLockOptimistic,
2 e2 p  E1 r& D  ^& c. v/ i adCmdText);
# `( k+ m: ]7 j, O# A1 Gwhile(!m_pRecordset-&gt;adoEOF)" }+ G( g$ A, l+ g
{
/ @5 n2 {$ A7 ?# h( f   vID = m_pRecordset-&gt;GetCollect(_variant_t((long)0));///取得第1列的值,从0开始计数,
$ ?6 C" f* P, H* p- K   ///你也可以直接给出列的名称,如下一行9 ]0 x! b* w" K8 e' F3 d1 s
   vUsername = m_pRecordset-&gt;GetCollect("username");///取得username字段的值
2 r" f* h% V7 e: b% K) w% F& P+ V( Q   vOld = m_pRecordset-&gt;GetCollect("old");( _* R; B* l# _) F
   vBirthday = m_pRecordset-&gt;GetCollect("birthday");
' Z$ z  z+ ^7 K   ///在DEBUG方式下的OUTPUT窗口输出记录集中的记录
) ~7 v: O6 m0 D4 N   if(vID.vt != VT_NULL &amp;&amp; vUsername.vt != VT_NULL &amp;&amp; vOld.vt != VT_NULL &amp;&amp; vBirthday.vt != VT_NULL)
# w0 Z% v' S6 n       TRACE("id:%d,姓名:%s,年龄:%d,生日:%s\r\n",
) u( q2 Z! X% }+ ^% V- o$ u vID.lVal,& U) F; M; \$ M
(LPCTSTR)(_bstr_t)vUsername,$ @$ g2 Y! b$ T( F; ]
vOld.lVal,
2 P5 l* W& m. b3 ?  c (LPCTSTR)(_bstr_t)vBirthday);
) X% z/ h  h# w   m_pRecordset-&gt;MoveNext();///移到下一条记录3 ?- y* p* `% q8 Y. B$ g3 S3 Q
}% S/ p8 _# W; R; `
m_pRecordset-&gt;MoveFirst();///移到首条记录3 `7 j8 V# ?! t; B
m_pRecordset-&gt;Delete(adAffectCurrent);///删除当前记录
, s4 G$ K* U6 ~- e6 T5 E6 \2 z///添加三条新记录并赋值
4 Y3 k+ h5 ^, _  r; e  qfor(int i=0;i&lt;3;i++)8 _2 P. k1 D3 V5 P# w
{
! `# V5 _' S/ {- E& p- B" L   m_pRecordset-&gt;AddNew();///添加新记录
" l9 L% E7 ~+ Z; f: y   m_pRecordset-&gtutCollect("ID",_variant_t((long)(i+10)));4 F# _; w$ l: L0 A& I
   m_pRecordset-&gtutCollect("username",_variant_t("叶利钦"));; _  U5 ^2 x! \
   m_pRecordset-&gtutCollect("old",_variant_t((long)71));
! {8 E6 I7 K- K2 |, f" m& d   m_pRecordset-&gtutCollect("birthday",_variant_t("1930-3-15"));+ X: M6 {( p1 y: o6 Y
}
/ f/ _7 _& P9 I4 X4 G) f: dm_pRecordset-&gt;Move(1,_variant_t((long)adBookmarkFirst));///从第一条记录往下移动一条记录,即移动到第二条记录处
* Y6 ~2 C3 K  ^8 Hm_pRecordset-&gtutCollect(_variant_t("old"),_variant_t((long)45));///修改其年龄. W. ~! C, V7 U
m_pRecordset-&gt;Update();///保存到库中   
3 \5 \7 Y7 {+ Q! g备注:多次查询可把查询过程做成一个函数ExecuteSQL让m_pRecordset获得连接指针m_pConnection查询结果
$ _; a/ I% U- Q  E! @void ExecuteSQL(_ConnectionPtr  m_pConnection, _RecordsetPtr  m_pRecordset,CString strSql)4 V& m5 C* b' h" H
{
, x) p' Y  R& h8 `: e   //执行Select 语句& }0 M* x, ]& @# Y
   BSTR bstrSQL = strSql.AllocSysString();           
: W; M( C, j& d9 S0 ^    try; e8 B) v# Q) {  M8 k
    {
3 G/ [6 L, {0 n" ?3 A) m       m_pRecordset-&gt;Open(bstrSQL,(IDispatch*)m_pConnection,adOpenDynamic,adLockOptimistic,adCmdText);
8 Q( I8 ^0 ?) D! N: s           //adOpenDynamic:动态  adLockOptimistic乐观封锁法  adCmdText:文本查询语句, Z8 i; }; }7 P. N4 F
    }
$ f$ Y& ]0 `$ q/ m+ h5 d    catch(_com_error error)
6 M0 t8 x1 T& Z& |    {) S1 Y: L. _- D7 X; K
       CString errorMessage;4 O$ W8 k# ?4 L/ s% Q$ l) V7 o
       errorMessage.format("%s",(LPTSTR)error.Description());! u$ H+ s' r& \! ^5 o( E0 C# k
       AfxMessageBox(errorMessage);
- \. S5 j' H0 C* G' b" e  Y( m    }- B* A' V, u6 {- }! n# N' e  v( E( K
}        - ^0 v/ [& K" [( A
//出错处理:. A4 G6 ?4 V4 n& N
3127——没有找到目标表3 j0 m# S# {8 j1 }" Z
3092——目标表已经存在
, b+ I5 i9 _6 d( ?* z例如:0 F& u1 V3 X; U9 d) }# A/ G
catch(const _com_error e), A: z" M" M1 H0 ]! L2 ^
{) P# b4 N! U4 H$ y
    AfxMessageBox(e.Description());7 C7 @8 F1 t, ]
    long errorCode=e.WCode();& h$ v) a! W& v
    if(3127==errorCode) AfxMessageBox("表不存在");
4 z; y6 [6 p. {! ]7 s- T3 S    if(3092==errorCode) AfxMessageBox("表已经存在");
0 b! P* P, t& p3 q3 v  }; Q    return FALSE;1 f; A* r! L2 V
} ' w4 i9 a* X* v4 t- @

  L# S, l+ w& X$ |</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-6-3 13:16 , Processed in 0.317220 second(s), 58 queries .

回顶部