QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 3577|回复: 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 q7 D0 c; |* [- L; \- W2 v  a1 v4 _/ F
<TR>
* `" W2 x- g+ O$ V<TD vAlign=top width=32></TD>
0 k+ A3 B7 @( }: }8 g<TD  vAlign=top>5. 记录集的遍历、更新
: j! ?' O; ^$ E& M1 Z" t: P+ }, M  s* [# k5 H
     根据我们刚才通过执行SQL命令建立好的users表,它包含四个字段:ID,username,old,birthday2 p, n. L' N( N6 t+ h
以下的代码实现:打开记录集,遍历所有记录,删除第一条记录,添加三条记录,移动光标到第二条记录,
$ f* L$ m8 H& G* V, K更改其年龄,保存到数据库。 ; z# j2 C& _) v1 ~* ^
_variant_t vUsername,vBirthday,vID,vOld;) N: ]$ i8 b- k6 ~0 U
_RecordsetPtr m_pRecordset;
' {1 z( g$ Z2 Xm_pRecordset.CreateInstance("ADODB.Recordset");. x  Z4 {) V3 |; ?: h' r
m_pRecordset-&gt;Open("SELECT * FROM users",  [9 [# ^* u4 V% |. ~
_variant_t((IDispatch*)m_pConnection,true),( p/ H7 u; e% Y" c. ^% T8 y
adOpenStatic," S) n! s/ t( W5 x
adLockOptimistic,
/ H6 x, {/ y/ a) s0 w adCmdText);% F5 H3 L& j5 Y, M4 s6 Y
while(!m_pRecordset-&gt;adoEOF)
, d7 \2 z7 q/ s+ G( j{1 `% S+ m$ S' K4 y- Y. i2 [1 F
   vID = m_pRecordset-&gt;GetCollect(_variant_t((long)0));///取得第1列的值,从0开始计数,8 m) l, l( o) \
   ///你也可以直接给出列的名称,如下一行
  B! g8 q( {6 w   vUsername = m_pRecordset-&gt;GetCollect("username");///取得username字段的值
7 M2 g# {: M* t8 A/ b   vOld = m_pRecordset-&gt;GetCollect("old");
! {# ?2 z3 a% k! F   vBirthday = m_pRecordset-&gt;GetCollect("birthday");
6 R, Z# ~  D* q% K% w* ]2 F7 r   ///在DEBUG方式下的OUTPUT窗口输出记录集中的记录
& o* l4 [  ~8 a) \   if(vID.vt != VT_NULL &amp;&amp; vUsername.vt != VT_NULL &amp;&amp; vOld.vt != VT_NULL &amp;&amp; vBirthday.vt != VT_NULL)
" Q. a/ e: _5 {9 o. s# ~& T       TRACE("id:%d,姓名:%s,年龄:%d,生日:%s\r\n",
, p1 G& ^) X/ }7 J/ \8 |' F$ O3 I vID.lVal,
- F% Z$ @" y! M! ]4 M# Z$ k (LPCTSTR)(_bstr_t)vUsername,
, I/ N& J1 p6 ^3 N/ n$ D vOld.lVal,1 c: t2 C1 ]; L, ?( c1 P& s
(LPCTSTR)(_bstr_t)vBirthday);
5 q: q+ r, Q% t   m_pRecordset-&gt;MoveNext();///移到下一条记录4 K1 l% R& B/ ]* }- R8 o
}* Q* ?7 R9 l" n! j$ a! V
m_pRecordset-&gt;MoveFirst();///移到首条记录5 d7 f' \# r2 F2 O
m_pRecordset-&gt;Delete(adAffectCurrent);///删除当前记录5 `( V3 [# N. i
///添加三条新记录并赋值4 `' k0 v7 d3 n; G* k7 u5 Q
for(int i=0;i&lt;3;i++)$ D: o8 c8 }0 F, a+ }1 @5 b( p6 E
{
& \$ g# A5 C4 [. F* T% a9 H, N" i' X   m_pRecordset-&gt;AddNew();///添加新记录
, ^3 S3 k! y" a! T; G, a5 O   m_pRecordset-&gtutCollect("ID",_variant_t((long)(i+10)));9 D! X9 f2 n) E4 r' p
   m_pRecordset-&gtutCollect("username",_variant_t("叶利钦"));
4 E8 R9 R5 t  \/ ?: p6 L   m_pRecordset-&gtutCollect("old",_variant_t((long)71));3 M, v8 U; }' D1 t& r
   m_pRecordset-&gtutCollect("birthday",_variant_t("1930-3-15"));
! W+ f3 }) N$ {% ]  h. S  q}
4 S+ p" N% P# y# s- q( r6 D) am_pRecordset-&gt;Move(1,_variant_t((long)adBookmarkFirst));///从第一条记录往下移动一条记录,即移动到第二条记录处% U' X2 F8 g# }* g2 n
m_pRecordset-&gtutCollect(_variant_t("old"),_variant_t((long)45));///修改其年龄
# C9 S; e# @) n( P) Y; xm_pRecordset-&gt;Update();///保存到库中    * [: L4 R( `  s' L) e
备注:多次查询可把查询过程做成一个函数ExecuteSQL让m_pRecordset获得连接指针m_pConnection查询结果 0 \- @6 ]7 ^$ `8 i9 ^; y
void ExecuteSQL(_ConnectionPtr  m_pConnection, _RecordsetPtr  m_pRecordset,CString strSql)
$ \6 J( Q7 `7 i" W( B; m8 S5 l: Y{1 h9 m# y7 Y+ {+ [
   //执行Select 语句# b( y5 T. X+ z8 B7 p' T
   BSTR bstrSQL = strSql.AllocSysString();           
$ U: R' ?9 f* `: R! N    try
2 {8 \) J7 P) `' b    {4 v3 B" W; T; ]# d& Z
       m_pRecordset-&gt;Open(bstrSQL,(IDispatch*)m_pConnection,adOpenDynamic,adLockOptimistic,adCmdText); ! J( a9 f5 h6 E. \0 b
           //adOpenDynamic:动态  adLockOptimistic乐观封锁法  adCmdText:文本查询语句
% A  z& \: I' J    }/ G) v  y8 j7 k
    catch(_com_error error)' u/ P2 k- `* ]
    {
0 A5 Q; E  U$ |5 u. K9 }+ v6 S/ n       CString errorMessage;
5 p4 ?+ J$ i& b( {8 k0 N       errorMessage.format("%s",(LPTSTR)error.Description());
3 u! ?  B  c; s/ i6 z2 m" q; }       AfxMessageBox(errorMessage);
# ]- C5 q- r" o" V8 e4 @2 s" I$ W    }
; N% D; B8 @; Y& u6 d8 W5 b4 K/ q}        3 _: N! l! p* V6 |  n) i+ N' ^! h
//出错处理:# e1 Q7 X% |/ t/ u
3127——没有找到目标表3 s+ B: W7 E- p6 @$ c% e( X
3092——目标表已经存在
. g+ M# F; Y% k9 g6 k: S例如:* O& [! e/ y( k& U- @
catch(const _com_error e)/ f& J9 {& }# X- s* Y+ R" ]
{8 `0 q- G0 A& r+ {  B- W% v
    AfxMessageBox(e.Description());
: h! R% P. a' X  F4 ^7 I& p. v    long errorCode=e.WCode();
+ o: k- _) X: C, j( N    if(3127==errorCode) AfxMessageBox("表不存在");
1 c* j2 z" r8 `( u    if(3092==errorCode) AfxMessageBox("表已经存在");
# a4 t) X" o! W% k) F6 Q    return FALSE;
$ f- n: M* {: k8 @/ K: {} # Y+ a; G: ?" k$ D' l; e: m

5 x5 `- ^% P' W1 B4 [</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 19:27 , Processed in 0.771539 second(s), 58 queries .

回顶部