QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 3389|回复: 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 Y. v' a  {0 N" G5 ~. ]# \5 G" S- ]
<TR>
8 a4 W& i' L) q# F6 r<TD vAlign=top width=32></TD>
. I* N4 }1 Y4 ?% C, p<TD  vAlign=top>5. 记录集的遍历、更新
) {' W, i6 q% w0 `9 ^7 p9 \9 D+ f8 b  G2 K% H1 w$ Z' C
     根据我们刚才通过执行SQL命令建立好的users表,它包含四个字段:ID,username,old,birthday
3 D+ a5 l5 r( A( h- {0 D以下的代码实现:打开记录集,遍历所有记录,删除第一条记录,添加三条记录,移动光标到第二条记录,
" V8 `3 E% n5 z& {. y更改其年龄,保存到数据库。
: b& M8 Y4 U- Z" B' z5 ~- C0 L/ s_variant_t vUsername,vBirthday,vID,vOld;
* N3 u. y3 j8 B* l( J_RecordsetPtr m_pRecordset;: _+ s3 b7 T6 W) V
m_pRecordset.CreateInstance("ADODB.Recordset");
2 {: b' q0 F- ^& a0 zm_pRecordset-&gt;Open("SELECT * FROM users",! U/ I; f  }/ w$ L- W! w/ j
_variant_t((IDispatch*)m_pConnection,true),) d0 `3 N7 ?0 u) D+ W- l: e
adOpenStatic,; D  p6 v9 T4 q" r
adLockOptimistic,- a+ \; y- d$ r1 F  A6 Y
adCmdText);, I8 D% I+ o" ]
while(!m_pRecordset-&gt;adoEOF)- _1 |! A4 ?, ~/ ^( j3 N( X4 }
{
) T, w# ]+ J/ k' U   vID = m_pRecordset-&gt;GetCollect(_variant_t((long)0));///取得第1列的值,从0开始计数,
4 ~! B! f, U9 U  O   ///你也可以直接给出列的名称,如下一行( S3 P: R5 m" b, H
   vUsername = m_pRecordset-&gt;GetCollect("username");///取得username字段的值
- s# p- y3 @9 `/ ~8 o: L   vOld = m_pRecordset-&gt;GetCollect("old");
+ C& Q" S9 G$ k7 y) y! i6 `   vBirthday = m_pRecordset-&gt;GetCollect("birthday");
6 t  k4 g- ~  W* Y" z! S4 k0 s   ///在DEBUG方式下的OUTPUT窗口输出记录集中的记录
' H+ e& @" p% s1 E0 O   if(vID.vt != VT_NULL &amp;&amp; vUsername.vt != VT_NULL &amp;&amp; vOld.vt != VT_NULL &amp;&amp; vBirthday.vt != VT_NULL)$ m1 {" w' B; j" f$ ~
       TRACE("id:%d,姓名:%s,年龄:%d,生日:%s\r\n",7 h) U' i) ^  \( f5 H
vID.lVal,0 q: v* K5 G( e; ]
(LPCTSTR)(_bstr_t)vUsername,
% v8 {$ Y; X9 x" q: x5 u: X vOld.lVal,
4 u+ f/ U. |" q0 p (LPCTSTR)(_bstr_t)vBirthday);
' `6 Y+ b8 @, R. `' Z   m_pRecordset-&gt;MoveNext();///移到下一条记录' Y: p, h1 l: @) U
}' m' P* k$ w+ j/ W
m_pRecordset-&gt;MoveFirst();///移到首条记录
+ F  R5 R. L8 V2 U: Um_pRecordset-&gt;Delete(adAffectCurrent);///删除当前记录: J3 Q7 E2 C2 u. K( \8 e7 Q7 V
///添加三条新记录并赋值% u& W/ g$ R1 H2 q" A. F9 h3 ?
for(int i=0;i&lt;3;i++)# [5 A) r% l' G4 y* H% C# [
{, ^+ j3 u- ~- X
   m_pRecordset-&gt;AddNew();///添加新记录
/ b. e* A$ T& e+ j" V   m_pRecordset-&gtutCollect("ID",_variant_t((long)(i+10)));
+ P1 S- X. Q3 u; E   m_pRecordset-&gtutCollect("username",_variant_t("叶利钦"));& }/ y3 X: l; O: O& B
   m_pRecordset-&gtutCollect("old",_variant_t((long)71));
" r: P  t* ]* G2 e* ~  a4 `$ K   m_pRecordset-&gtutCollect("birthday",_variant_t("1930-3-15"));3 S. {6 L% Z5 [% C9 h
}
' r4 m7 ^1 u) r4 A/ A3 S3 n/ [m_pRecordset-&gt;Move(1,_variant_t((long)adBookmarkFirst));///从第一条记录往下移动一条记录,即移动到第二条记录处5 P3 H+ a1 {: a5 z
m_pRecordset-&gtutCollect(_variant_t("old"),_variant_t((long)45));///修改其年龄) l: J' T& m2 r; K. @6 \- ~, d- U
m_pRecordset-&gt;Update();///保存到库中    - i$ ^; |8 k" P7 G6 ]8 J5 l
备注:多次查询可把查询过程做成一个函数ExecuteSQL让m_pRecordset获得连接指针m_pConnection查询结果
0 |. z9 P2 d7 L, h; v, Vvoid ExecuteSQL(_ConnectionPtr  m_pConnection, _RecordsetPtr  m_pRecordset,CString strSql); k8 m) f+ \, v7 V' ?2 b3 g9 o, F
{
7 @$ F& C6 b; |! }   //执行Select 语句
  q: c7 p* D6 |; l   BSTR bstrSQL = strSql.AllocSysString();           ; K7 A# |* ?  p' U! s
    try" n) e3 C4 F# H2 i; `' G
    {8 K2 j; d3 s- Q! J) g" m# }
       m_pRecordset-&gt;Open(bstrSQL,(IDispatch*)m_pConnection,adOpenDynamic,adLockOptimistic,adCmdText); 1 F' ?0 D5 [8 L' J1 ]# O. A
           //adOpenDynamic:动态  adLockOptimistic乐观封锁法  adCmdText:文本查询语句/ ~3 s/ b3 i+ {( M
    }+ n$ Z7 H2 f3 e' Z0 `, D
    catch(_com_error error)
) |$ u/ c' v% k9 f' z; U# A$ W    {8 U/ J! b, p( u7 U/ j9 n0 p
       CString errorMessage;  b( F; N) U$ ~7 Q" }' O
       errorMessage.format("%s",(LPTSTR)error.Description());1 S: J6 {/ x  |/ ~! g  P7 ?
       AfxMessageBox(errorMessage);  j4 Y& F# @  e6 q! I2 q2 }4 y3 Y
    }7 R4 Q) Z+ l& k. _$ Z! J! _
}        * C4 s: V' B. d/ M
//出错处理:# a* h' y; u3 b2 k* q& i
3127——没有找到目标表
/ o# f9 O" n/ Q; `) x0 f/ e3092——目标表已经存在% T7 p  f8 f- t, G& k
例如:
5 v  \& w2 B6 s- g) Fcatch(const _com_error e)
$ e! I8 }) ?5 D3 u& j# P{
7 k! A7 B0 @: G    AfxMessageBox(e.Description());+ m/ n- |5 i7 E( |% n
    long errorCode=e.WCode();
5 X2 C7 y. P  p3 x( G3 d( O    if(3127==errorCode) AfxMessageBox("表不存在");
" N* |( i* \$ e) `! S0 I    if(3092==errorCode) AfxMessageBox("表已经存在");" n5 `+ \1 x) v2 D* V
    return FALSE;
5 A' j9 S% ?2 k" p}
1 s3 `; j9 r$ i
( s% s5 e% A: O- F8 {# \</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-11 00:53 , Processed in 0.507901 second(s), 57 queries .

回顶部