QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 3674|回复: 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%">
4 V1 r0 z/ h. \
/ B; U$ |. f' Q5 p5 L& i<TR>
$ m, b9 z+ s: L  K<TD vAlign=top width=32></TD>
9 v4 v( v. \: a<TD  vAlign=top>5. 记录集的遍历、更新* a( ]; d  y8 P! M2 J# {' m

6 T/ w; e8 D* y     根据我们刚才通过执行SQL命令建立好的users表,它包含四个字段:ID,username,old,birthday
) d3 ]/ l' J! b以下的代码实现:打开记录集,遍历所有记录,删除第一条记录,添加三条记录,移动光标到第二条记录,
% I" L8 @% |7 W  `# x更改其年龄,保存到数据库。 + k2 ], b1 ?( J* X% I- v
_variant_t vUsername,vBirthday,vID,vOld;# Y9 i; r4 e( c! o
_RecordsetPtr m_pRecordset;
- @5 d5 \$ L7 \; x1 M9 \m_pRecordset.CreateInstance("ADODB.Recordset");+ Q' B  U7 j! c3 j! q" K  s; k( Y( x
m_pRecordset-&gt;Open("SELECT * FROM users",
* [; {' f+ d' ^ _variant_t((IDispatch*)m_pConnection,true),) x8 l, j5 M6 n" ~; l8 W2 P: Y
adOpenStatic,& H$ D# F! k* E* R
adLockOptimistic,4 Y5 ], M6 B! |+ ?7 G
adCmdText);
' [) x+ H, c+ u6 h: `0 d+ ^8 Awhile(!m_pRecordset-&gt;adoEOF)- F+ v( S7 V" z1 |
{' O" i; I6 j  M0 U0 s
   vID = m_pRecordset-&gt;GetCollect(_variant_t((long)0));///取得第1列的值,从0开始计数,: p; Y3 b2 F1 Q3 ~
   ///你也可以直接给出列的名称,如下一行
0 N# z/ z1 x/ w" g' @+ g1 G   vUsername = m_pRecordset-&gt;GetCollect("username");///取得username字段的值
# V6 Q. ]6 t9 e; b   vOld = m_pRecordset-&gt;GetCollect("old");
# j  o" i+ _( x   vBirthday = m_pRecordset-&gt;GetCollect("birthday");' s2 c: r; y# f) u1 q0 l
   ///在DEBUG方式下的OUTPUT窗口输出记录集中的记录
- i8 G- l! J& T5 |   if(vID.vt != VT_NULL &amp;&amp; vUsername.vt != VT_NULL &amp;&amp; vOld.vt != VT_NULL &amp;&amp; vBirthday.vt != VT_NULL), ~: @+ Z: W1 h- R: A, f
       TRACE("id:%d,姓名:%s,年龄:%d,生日:%s\r\n",
6 C9 T/ E& c+ s; g2 h) N vID.lVal,
6 Q2 x& ^5 r1 p% j+ `* T (LPCTSTR)(_bstr_t)vUsername,
5 X# F) R5 H' J  T% w vOld.lVal,
1 [- ]6 C$ P* x' m$ z (LPCTSTR)(_bstr_t)vBirthday);# m+ L: \5 R. g* M$ K4 {# ~, P
   m_pRecordset-&gt;MoveNext();///移到下一条记录
  V9 ?& n; V5 z- X9 u# z! p, D}/ p4 E0 C  [4 v) s: @7 Z) X
m_pRecordset-&gt;MoveFirst();///移到首条记录- C- @- R/ a8 i8 P, Q& m
m_pRecordset-&gt;Delete(adAffectCurrent);///删除当前记录4 x" ?3 D" V3 ?2 w& x1 v4 E6 `
///添加三条新记录并赋值
: u/ A  b5 ~' w7 m; bfor(int i=0;i&lt;3;i++)
8 D! ?- b# S6 K" t{* e* c7 m) w, ^0 j9 K
   m_pRecordset-&gt;AddNew();///添加新记录2 L0 J! O7 [1 }: f, {8 o
   m_pRecordset-&gtutCollect("ID",_variant_t((long)(i+10)));
$ k* _+ F+ e5 G7 _   m_pRecordset-&gtutCollect("username",_variant_t("叶利钦"));
( l4 U0 n6 d( ^% [. U4 [5 D* M+ E   m_pRecordset-&gtutCollect("old",_variant_t((long)71));! ?" a6 q$ n, i$ _
   m_pRecordset-&gtutCollect("birthday",_variant_t("1930-3-15"));& M0 T8 `) S. @0 \
}
% I: s7 i# x1 i. |4 q, W1 Y  ]: ]m_pRecordset-&gt;Move(1,_variant_t((long)adBookmarkFirst));///从第一条记录往下移动一条记录,即移动到第二条记录处) ~1 v# r! R+ }
m_pRecordset-&gtutCollect(_variant_t("old"),_variant_t((long)45));///修改其年龄5 ?! m# Q: G0 X; k  V
m_pRecordset-&gt;Update();///保存到库中    ; @/ v; W  r/ z0 h" G+ j
备注:多次查询可把查询过程做成一个函数ExecuteSQL让m_pRecordset获得连接指针m_pConnection查询结果 # I  \4 g8 K2 a/ T) `$ r$ ^9 r  J0 G
void ExecuteSQL(_ConnectionPtr  m_pConnection, _RecordsetPtr  m_pRecordset,CString strSql)
/ M7 J3 z: b9 u: B+ X5 w{
* `6 ]; C9 M, B# a+ u   //执行Select 语句4 Q/ Q" o  X) x! f& t0 V
   BSTR bstrSQL = strSql.AllocSysString();           
% k- [( T- C: w    try; J2 X7 E% r, y# W6 F
    {0 I. p4 |) }! ~8 {
       m_pRecordset-&gt;Open(bstrSQL,(IDispatch*)m_pConnection,adOpenDynamic,adLockOptimistic,adCmdText); ) @, @) R- d- i; p
           //adOpenDynamic:动态  adLockOptimistic乐观封锁法  adCmdText:文本查询语句
8 i0 A! j4 Y3 o' ~# @& z: |    }6 T, i- H. A/ \2 S5 V, R
    catch(_com_error error)
/ m8 e7 p( U% N- I/ W, Y    {1 s7 R) `- X9 i1 U5 F/ S+ ?" S0 _; w
       CString errorMessage;
4 Z% \. B5 T/ E, K' S0 C       errorMessage.format("%s",(LPTSTR)error.Description());' [; E5 U/ c" a  G* i
       AfxMessageBox(errorMessage);
# F% n% T# N. O' u! r    }& u: A1 I# z' Z" R& a) |) Y
}        4 j% M% |# W' I8 l# Z6 y: u: g( c
//出错处理:
. @+ n: D; I# K) D  |7 S# f5 N5 i3127——没有找到目标表1 q: \2 }* g+ P* `% P
3092——目标表已经存在
" ?$ H( Z, g. b8 K4 f. s* Y例如:$ ^4 w* W: f6 B
catch(const _com_error e)7 s! d! a& ^, M- K& r
{
9 Z" ?* b* f  o6 {3 g% ?. k    AfxMessageBox(e.Description());
) L7 j+ K9 e4 I6 U9 q7 S' P' ?" Z    long errorCode=e.WCode();
8 l5 y. \- }! j# m; H    if(3127==errorCode) AfxMessageBox("表不存在");
2 b) B! L6 t# d0 R- y( r    if(3092==errorCode) AfxMessageBox("表已经存在");0 N# }1 W) O+ j& _
    return FALSE;" d5 ^$ @9 U- v
} 2 s5 Z4 {  U, z
' F- T4 J2 ~; }7 j# v* H
</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 06:32 , Processed in 1.257046 second(s), 58 queries .

回顶部