QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 3643|回复: 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%">) W; e& a, c+ w6 W

/ Y( H) S) s# B<TR>
; W0 K+ e2 ~4 U6 f( A<TD vAlign=top width=32></TD>5 t! s. v* t7 r( ^) D' w
<TD  vAlign=top>5. 记录集的遍历、更新
& ~3 Z1 B+ ~! s- @6 `. y! h& U1 j* Y, q! U* z
     根据我们刚才通过执行SQL命令建立好的users表,它包含四个字段:ID,username,old,birthday
, R" e) I9 C- ]4 M, s以下的代码实现:打开记录集,遍历所有记录,删除第一条记录,添加三条记录,移动光标到第二条记录,0 G, i; e! a0 n0 r
更改其年龄,保存到数据库。 . [- Z& G  i; U/ P$ h: L
_variant_t vUsername,vBirthday,vID,vOld;
" G+ Y% n% v) u+ J_RecordsetPtr m_pRecordset;
& c* O+ N# m+ }6 n  Y: |m_pRecordset.CreateInstance("ADODB.Recordset");
, I" W4 x  k3 t* w. m7 Em_pRecordset-&gt;Open("SELECT * FROM users",
# ~  ]5 j) ]& q+ @$ R" W$ O& x _variant_t((IDispatch*)m_pConnection,true),
# F  T0 R: o# V adOpenStatic,* Z4 E; j+ X) ?5 J( c
adLockOptimistic,4 n  T3 e) E) \5 T& c
adCmdText);
$ k# l/ B& s. I6 ]% lwhile(!m_pRecordset-&gt;adoEOF)
: R2 M7 n2 n2 K( _/ g2 Q- c{
) l9 V# M# Q2 P/ K/ O) V   vID = m_pRecordset-&gt;GetCollect(_variant_t((long)0));///取得第1列的值,从0开始计数,
3 C. W3 z% T( I   ///你也可以直接给出列的名称,如下一行
  }5 @  Y9 B" n6 Y$ U   vUsername = m_pRecordset-&gt;GetCollect("username");///取得username字段的值' d  P9 y# F* n" ~
   vOld = m_pRecordset-&gt;GetCollect("old");" d, i6 V6 F* \  \
   vBirthday = m_pRecordset-&gt;GetCollect("birthday");
* A* \: U+ b$ I6 J# ~   ///在DEBUG方式下的OUTPUT窗口输出记录集中的记录% i0 S7 n6 j  P8 |' V+ D# ~
   if(vID.vt != VT_NULL &amp;&amp; vUsername.vt != VT_NULL &amp;&amp; vOld.vt != VT_NULL &amp;&amp; vBirthday.vt != VT_NULL)
2 ]  X- x; W; V, K       TRACE("id:%d,姓名:%s,年龄:%d,生日:%s\r\n",' A/ z+ @0 {) y3 ^/ r
vID.lVal,' y; M/ t4 J$ S
(LPCTSTR)(_bstr_t)vUsername,; b0 n6 E+ a' G9 I
vOld.lVal,2 g/ |+ {2 v: M
(LPCTSTR)(_bstr_t)vBirthday);2 [' m# v/ C  y9 e8 _. G
   m_pRecordset-&gt;MoveNext();///移到下一条记录
# N7 \' S. P7 v" p}
. B/ I) ]- V( }) Y+ `m_pRecordset-&gt;MoveFirst();///移到首条记录
# q! h! M6 L# {! u/ H* ~7 Em_pRecordset-&gt;Delete(adAffectCurrent);///删除当前记录
1 L( L- v4 I  r+ V  D///添加三条新记录并赋值
' s& W- Z. R, ?/ q/ a9 R: z. ]for(int i=0;i&lt;3;i++)& n3 A* I  r+ b* z
{2 }$ [4 b% r; m0 f
   m_pRecordset-&gt;AddNew();///添加新记录* d1 Q: q- J/ ?! W) E" a
   m_pRecordset-&gtutCollect("ID",_variant_t((long)(i+10)));6 N. ]; k# [7 J# m
   m_pRecordset-&gtutCollect("username",_variant_t("叶利钦"));" n" |+ {, E- q# d
   m_pRecordset-&gtutCollect("old",_variant_t((long)71));! H7 Q4 T" \9 f
   m_pRecordset-&gtutCollect("birthday",_variant_t("1930-3-15"));6 {$ K5 x9 E# T3 E. C7 p
}- M; Z& _$ p  {$ q2 e
m_pRecordset-&gt;Move(1,_variant_t((long)adBookmarkFirst));///从第一条记录往下移动一条记录,即移动到第二条记录处
% x4 K; k/ \+ R- Gm_pRecordset-&gtutCollect(_variant_t("old"),_variant_t((long)45));///修改其年龄
1 B9 n& O3 R. O  p! z9 Em_pRecordset-&gt;Update();///保存到库中    , _. d) X( Q! w0 f5 x+ j
备注:多次查询可把查询过程做成一个函数ExecuteSQL让m_pRecordset获得连接指针m_pConnection查询结果 2 [. T% s; H8 i' f2 z4 u: z2 k
void ExecuteSQL(_ConnectionPtr  m_pConnection, _RecordsetPtr  m_pRecordset,CString strSql)1 A; f: {& \: }+ R4 m! v9 P; Z' o% n* f
{
* A( p6 d. i  G, U& V; M   //执行Select 语句$ J+ G* [7 I! a' D% [# R
   BSTR bstrSQL = strSql.AllocSysString();           
$ H/ A* z1 E$ J( z; f4 K& U    try. V: H. @& N/ x# k) y0 e! `
    {
, Q" M& n/ r8 l" u* b" L0 t       m_pRecordset-&gt;Open(bstrSQL,(IDispatch*)m_pConnection,adOpenDynamic,adLockOptimistic,adCmdText);
% c9 y2 R- q  Y: A/ e* V* U           //adOpenDynamic:动态  adLockOptimistic乐观封锁法  adCmdText:文本查询语句3 @. W& K! c6 l. S
    }8 J# _4 n2 y7 I1 K( r
    catch(_com_error error), {) i4 w3 X. N/ F. ]+ e
    {
, ]0 h/ F! a- C$ ]# B+ z( l4 V" `& r1 g       CString errorMessage;/ V2 h1 X! d$ V* ?* a# h7 S, _. x
       errorMessage.format("%s",(LPTSTR)error.Description());6 V1 j: w8 d# T3 V0 e! r0 K3 b
       AfxMessageBox(errorMessage);! e2 H7 N  K( t$ w7 X# A3 Q* ]
    }
4 V8 s0 z" k2 ^% b: m3 ~+ A, W( i- v}        ) l3 W5 e; X/ y+ h  \/ W; H
//出错处理:
9 ?- e4 k* O$ Y3127——没有找到目标表5 `2 [3 Z; i3 B0 a
3092——目标表已经存在
' N& u) q  x' q, D0 u/ T例如:
: H- z* o* ^' \$ d" v% ~catch(const _com_error e); q  G, j* o9 M
{9 K) `; Z2 Z" d8 u
    AfxMessageBox(e.Description());
0 r1 a% q( S/ `$ Q- l4 y# r    long errorCode=e.WCode();
1 E9 _% I( Q0 a  _    if(3127==errorCode) AfxMessageBox("表不存在");
" `# K; U: _: l3 O- D1 E    if(3092==errorCode) AfxMessageBox("表已经存在");* N, X' C2 q7 q6 I7 ?
    return FALSE;8 }7 E" H3 x1 ?( K3 _
}
" U! J. K" }$ X/ ]2 e; T% \2 w; i: A6 N5 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-7-19 20:02 , Processed in 0.306374 second(s), 58 queries .

回顶部