QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 3576|回复: 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%">
3 p* ?: w' f# l. R7 j+ p
( C' o/ B$ ?1 n- N; Q/ W<TR>$ y' w5 [& Q! n) O& r+ ]
<TD vAlign=top width=32></TD>) A4 Q% x" Q8 |4 n4 ?. e
<TD  vAlign=top>5. 记录集的遍历、更新( _, x) J" e! g8 n

0 G( z' L1 }  m- B$ {: L8 F     根据我们刚才通过执行SQL命令建立好的users表,它包含四个字段:ID,username,old,birthday4 i2 J* s- e4 t, T
以下的代码实现:打开记录集,遍历所有记录,删除第一条记录,添加三条记录,移动光标到第二条记录,
" b- o; ?5 D& z1 S1 w3 |: b更改其年龄,保存到数据库。
/ }  k8 _1 @6 [- b% L% u( B8 p_variant_t vUsername,vBirthday,vID,vOld;
! t8 Q! p* O' M# K, {& g_RecordsetPtr m_pRecordset;
8 D: {- k8 B7 Q3 q& H. H7 }m_pRecordset.CreateInstance("ADODB.Recordset");8 [" k2 H* Q( o6 H- x6 U9 ^
m_pRecordset-&gt;Open("SELECT * FROM users"," a: q6 o3 ]" K1 Z: ]# X! e+ S
_variant_t((IDispatch*)m_pConnection,true),8 W- @: ?8 W- ]2 @
adOpenStatic,
0 B" H: h7 a8 J+ C, K8 x' a8 ~1 z adLockOptimistic,- l, {3 b: n7 `; C  t* _
adCmdText);
1 F) V7 Y, y  k1 i* V* Pwhile(!m_pRecordset-&gt;adoEOF)
& X, K, {* f; O8 c4 j0 w+ X{
3 z1 Y# T3 P  r- o6 B9 a( x   vID = m_pRecordset-&gt;GetCollect(_variant_t((long)0));///取得第1列的值,从0开始计数,. M4 [2 y2 _. c
   ///你也可以直接给出列的名称,如下一行
4 l! V- o; {5 m  ~4 j   vUsername = m_pRecordset-&gt;GetCollect("username");///取得username字段的值- O2 _3 U! J5 ^$ v" h, w
   vOld = m_pRecordset-&gt;GetCollect("old");
; ?9 F% o* o% M. P3 O   vBirthday = m_pRecordset-&gt;GetCollect("birthday");* [. i% B: z/ p% D1 B
   ///在DEBUG方式下的OUTPUT窗口输出记录集中的记录
; J; u& I; H' s- o   if(vID.vt != VT_NULL &amp;&amp; vUsername.vt != VT_NULL &amp;&amp; vOld.vt != VT_NULL &amp;&amp; vBirthday.vt != VT_NULL)
2 p) I  Y2 M& \1 M& h: f: S! f       TRACE("id:%d,姓名:%s,年龄:%d,生日:%s\r\n",
1 M' [3 Q* }& J4 [# y vID.lVal,* a9 e- m  K; E% W' J
(LPCTSTR)(_bstr_t)vUsername,
, U; d6 b) P+ d) ^% [5 o- O5 S vOld.lVal,% e( }$ e3 }. z0 q9 h3 @
(LPCTSTR)(_bstr_t)vBirthday);0 I1 ~( V8 B* @5 ?  d5 ]6 f  U
   m_pRecordset-&gt;MoveNext();///移到下一条记录
* Z' J0 a1 o6 z) a}
# v# v: b, ]2 p8 `0 }: ?m_pRecordset-&gt;MoveFirst();///移到首条记录
3 B6 H+ n  U0 d" c* B, W8 ~$ a9 [' hm_pRecordset-&gt;Delete(adAffectCurrent);///删除当前记录! S+ H: r6 J; e* z6 {$ J$ {( ^
///添加三条新记录并赋值0 ?* }4 L1 C1 F6 u0 v' ~( O7 a
for(int i=0;i&lt;3;i++)
; g" o3 z) O; y* Z, A2 {5 ~{
0 C* h# g3 d- ^  Z   m_pRecordset-&gt;AddNew();///添加新记录& M  Y* A4 z5 }* D5 f
   m_pRecordset-&gtutCollect("ID",_variant_t((long)(i+10)));
5 x3 E' Y4 S4 J2 B  F5 W   m_pRecordset-&gtutCollect("username",_variant_t("叶利钦"));0 U% @( I3 a1 g) }* S, w( h4 Y, O1 J
   m_pRecordset-&gtutCollect("old",_variant_t((long)71));5 I6 T6 N4 q* A
   m_pRecordset-&gtutCollect("birthday",_variant_t("1930-3-15"));
' E! b+ }( ~4 r& \' o4 x' c, N  P}- S. _8 |* N: V" c
m_pRecordset-&gt;Move(1,_variant_t((long)adBookmarkFirst));///从第一条记录往下移动一条记录,即移动到第二条记录处
, A/ D8 m# B( u. p% Mm_pRecordset-&gtutCollect(_variant_t("old"),_variant_t((long)45));///修改其年龄; x8 n3 E3 Y& G- G( H
m_pRecordset-&gt;Update();///保存到库中   
, x" r8 M. q' d/ _, E. N  {备注:多次查询可把查询过程做成一个函数ExecuteSQL让m_pRecordset获得连接指针m_pConnection查询结果
/ h/ k$ L) X  \: N4 Lvoid ExecuteSQL(_ConnectionPtr  m_pConnection, _RecordsetPtr  m_pRecordset,CString strSql)
* L( V$ b% m4 N{
: w$ a0 B" Y  x, @0 i' m$ U$ u   //执行Select 语句
$ ^) f& N8 h- E$ m/ L2 i" L   BSTR bstrSQL = strSql.AllocSysString();           
+ }! K# L# a1 X2 B    try
! x& H9 H. V6 m) u' @! Y    {& p. e+ C5 c5 G+ i
       m_pRecordset-&gt;Open(bstrSQL,(IDispatch*)m_pConnection,adOpenDynamic,adLockOptimistic,adCmdText); ' \( q# _7 K7 E9 V- e6 B
           //adOpenDynamic:动态  adLockOptimistic乐观封锁法  adCmdText:文本查询语句, c! Z  F$ G: ?5 f( Z" _
    }
: T2 D2 V6 L4 i7 O7 N5 ?8 D, f    catch(_com_error error)$ t8 T6 w3 j% i, T  O
    {
/ u* V0 c- d* {  \       CString errorMessage;8 G1 M/ ]$ Q# S  M- m2 @# C
       errorMessage.format("%s",(LPTSTR)error.Description());! T- s) f' ]+ X) t: r$ x$ K4 G
       AfxMessageBox(errorMessage);
7 z. V# M9 N9 h6 G( U' F0 `    }  q' T- V4 i. S0 ~1 z8 {
}        
& }* B3 [4 v- D* r, [" m# ?//出错处理:
7 Y. C( q" F! T  @. Z3127——没有找到目标表3 Z$ h& F: @) t5 A7 d+ K) p1 |
3092——目标表已经存在
4 ~8 L1 G$ }. ~$ J/ T例如:) C1 @" j( d/ w$ ~
catch(const _com_error e)5 y2 b' z, f% n+ Z$ H: j
{
8 H! ?0 e3 Y$ M9 G1 j# r3 |  z    AfxMessageBox(e.Description());& M& W/ m. L8 Z8 [8 ?  N8 j
    long errorCode=e.WCode();( O  r. Y5 E5 e! ?$ S2 j
    if(3127==errorCode) AfxMessageBox("表不存在");
9 V7 }5 D& T9 x" s5 W7 z    if(3092==errorCode) AfxMessageBox("表已经存在");3 s: [8 y2 L; k$ Q% j+ ]1 E
    return FALSE;
. \% O: Y$ s% I# [) X0 h( X} 9 F5 u# J% y9 ?* i

# {3 @8 n: ~. c% z</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-4-17 18:41 , Processed in 0.508671 second(s), 57 queries .

回顶部