QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 3573|回复: 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%">
: ]" ^& [( f/ z% T
  R& P2 H* O' [: F3 t: E<TR>' M5 P- }+ _- x) G
<TD vAlign=top width=32></TD>
- D" v0 P3 Y# M8 [" {+ w<TD  vAlign=top>5. 记录集的遍历、更新( z+ Q7 G! l/ u/ i4 J( J' r( i' }6 D

* m# W9 a9 p+ j     根据我们刚才通过执行SQL命令建立好的users表,它包含四个字段:ID,username,old,birthday
; Q( N- |2 [- u% R# O# U# p5 p以下的代码实现:打开记录集,遍历所有记录,删除第一条记录,添加三条记录,移动光标到第二条记录,
: D7 S; y  x9 J$ _更改其年龄,保存到数据库。 % j  P3 X" C) p! T% p' t6 M
_variant_t vUsername,vBirthday,vID,vOld;9 q9 \9 a5 y' N. }1 R) p
_RecordsetPtr m_pRecordset;
% b2 N- d# b! tm_pRecordset.CreateInstance("ADODB.Recordset");0 y) Y( Q$ O/ p! C0 K
m_pRecordset-&gt;Open("SELECT * FROM users",9 u" ~& K. d3 v, F6 }5 v8 \
_variant_t((IDispatch*)m_pConnection,true),
" N& J$ g* r+ P; i, p adOpenStatic,( e- W* N. d2 B( H1 M2 g# D8 L
adLockOptimistic,4 M3 ?4 G' d) x: Z& _/ C2 J9 I
adCmdText);! ]: b' y% ?$ ~; z) s6 i8 \6 }
while(!m_pRecordset-&gt;adoEOF)
( s+ S5 h" g* z{
7 X( F: r# _5 R+ n6 ?: n) x   vID = m_pRecordset-&gt;GetCollect(_variant_t((long)0));///取得第1列的值,从0开始计数,- Z1 t- A* ~; I
   ///你也可以直接给出列的名称,如下一行
( |! D) j* q) @5 E: [, r- |. H   vUsername = m_pRecordset-&gt;GetCollect("username");///取得username字段的值
/ x5 L9 Y1 y. j1 r. D" M   vOld = m_pRecordset-&gt;GetCollect("old");
, s! R$ ~# b! @3 X+ z1 ~4 ?   vBirthday = m_pRecordset-&gt;GetCollect("birthday");
$ I7 u& S4 H; e   ///在DEBUG方式下的OUTPUT窗口输出记录集中的记录5 h. F: |* [; V' w
   if(vID.vt != VT_NULL &amp;&amp; vUsername.vt != VT_NULL &amp;&amp; vOld.vt != VT_NULL &amp;&amp; vBirthday.vt != VT_NULL)
8 k8 x) v2 \/ g, e       TRACE("id:%d,姓名:%s,年龄:%d,生日:%s\r\n",; [% D( d+ n0 z2 I' l, `& P) s
vID.lVal,
  q5 h! C7 S& j% q$ ] (LPCTSTR)(_bstr_t)vUsername,! \3 D! [: U, |' z
vOld.lVal,
0 G( B2 B: d  I (LPCTSTR)(_bstr_t)vBirthday);& O1 u! o# Y9 o
   m_pRecordset-&gt;MoveNext();///移到下一条记录
3 R; M3 R* t' i: ~}
: |4 j2 W$ l- [$ S) ym_pRecordset-&gt;MoveFirst();///移到首条记录
* f# m, K( X% j3 c  ]! Em_pRecordset-&gt;Delete(adAffectCurrent);///删除当前记录
  R( y1 N, d- j5 X* F///添加三条新记录并赋值
: F: T. t& W& c( d# f; n8 P. Qfor(int i=0;i&lt;3;i++)+ W5 P% r% c9 R+ W
{
0 _2 h/ p/ w6 g1 [4 ~   m_pRecordset-&gt;AddNew();///添加新记录
+ Z, Q; x! T  i, g   m_pRecordset-&gtutCollect("ID",_variant_t((long)(i+10)));+ e5 `- _7 t, @( F1 ^$ v! x9 q5 z1 r
   m_pRecordset-&gtutCollect("username",_variant_t("叶利钦"));
( k0 n& @( s3 O% L3 p2 X! r) c: x4 G   m_pRecordset-&gtutCollect("old",_variant_t((long)71));, }' d' J) X, d' Y+ l& i! u$ e
   m_pRecordset-&gtutCollect("birthday",_variant_t("1930-3-15"));) y; i0 o+ w+ _* \! m( h! Q) X4 J
}+ ]8 Z, e! m, C$ ~5 v1 X
m_pRecordset-&gt;Move(1,_variant_t((long)adBookmarkFirst));///从第一条记录往下移动一条记录,即移动到第二条记录处
0 y$ r( X( b: z3 r, dm_pRecordset-&gtutCollect(_variant_t("old"),_variant_t((long)45));///修改其年龄3 m% V- B0 F  V2 @6 f
m_pRecordset-&gt;Update();///保存到库中   
8 _9 T8 X  {; N  h% p备注:多次查询可把查询过程做成一个函数ExecuteSQL让m_pRecordset获得连接指针m_pConnection查询结果
* G% ]; s( U# i8 k! Evoid ExecuteSQL(_ConnectionPtr  m_pConnection, _RecordsetPtr  m_pRecordset,CString strSql)
2 E1 F( \) r- ?0 U" U3 [6 C8 d% O{
9 H' g" g' t: e( t   //执行Select 语句' M. q2 ^! B1 ^  ?
   BSTR bstrSQL = strSql.AllocSysString();           " m, I  s+ o# H1 P
    try
' h0 p8 ]3 R0 F3 c, Z    {
: \2 x( i- T: X       m_pRecordset-&gt;Open(bstrSQL,(IDispatch*)m_pConnection,adOpenDynamic,adLockOptimistic,adCmdText);
. s% J% s. h! G& g           //adOpenDynamic:动态  adLockOptimistic乐观封锁法  adCmdText:文本查询语句* a) @, M1 Z' _' e. [
    }
6 p* Y- H$ u' `5 t" D    catch(_com_error error)
+ Y. p/ f9 Y. P  A2 s    {
0 @9 d8 n9 T7 i       CString errorMessage;
9 s$ G) S/ `: R' O2 ?& [       errorMessage.format("%s",(LPTSTR)error.Description());# F- _, m0 P# g( h3 P
       AfxMessageBox(errorMessage);7 b3 q& C8 _# v1 E3 l
    }: E: G4 g1 l( t$ R& V% J. u- A+ x2 s
}        
% b: S  P4 E$ u//出错处理:
5 N  E8 ?. y8 m  i6 ^1 G3127——没有找到目标表
0 n# g# x! m" \3 g; \2 d3092——目标表已经存在
/ ]0 `. W4 u1 n  \3 B3 U$ p例如:
" \  T6 K/ Q7 W$ H7 B+ Pcatch(const _com_error e)9 Y3 c0 h. V1 C9 Z2 a5 |
{
8 }& ]6 Z' E+ a    AfxMessageBox(e.Description());3 w' T0 e& I; E- q2 k2 q8 Z& ?
    long errorCode=e.WCode();# n: s9 `: T' s  o* K1 J1 v, f5 s
    if(3127==errorCode) AfxMessageBox("表不存在");
0 V& J8 V9 F8 d, z    if(3092==errorCode) AfxMessageBox("表已经存在");+ A7 j+ @0 L, }* l' }
    return FALSE;
1 \# K8 q/ V- Y5 V! M5 [}
% q7 |9 f9 @  k3 B$ E0 H, a2 J1 C, Y6 G( {! N# r
</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 10:44 , Processed in 0.465354 second(s), 57 queries .

回顶部