QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 3636|回复: 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%">
" [% \  C; q( C
) p# c; ~+ R) h0 ~* D* |  Y. C<TR>
+ a5 \: i: b& G7 x+ T" p<TD vAlign=top width=32></TD>
% w0 k+ L5 q8 W! `* g<TD  vAlign=top>5. 记录集的遍历、更新9 [# K$ p" V4 z/ B
& _( O8 z6 G  C2 L' q5 l$ c+ _
     根据我们刚才通过执行SQL命令建立好的users表,它包含四个字段:ID,username,old,birthday
5 B$ ~2 f7 K; ?" i. H以下的代码实现:打开记录集,遍历所有记录,删除第一条记录,添加三条记录,移动光标到第二条记录,7 `3 a3 ^4 \3 \: Z. T/ @
更改其年龄,保存到数据库。 5 D( n& I& l- f! q
_variant_t vUsername,vBirthday,vID,vOld;
0 W, B+ M7 z. ~" z- k_RecordsetPtr m_pRecordset;; @) L: z' ~6 q7 _! {
m_pRecordset.CreateInstance("ADODB.Recordset");
2 a, ]. Y' [+ m1 O& Wm_pRecordset-&gt;Open("SELECT * FROM users",
8 t' W+ E0 B' f( f3 ~, { _variant_t((IDispatch*)m_pConnection,true),
& L6 C9 s! ]! Y: T- j; y adOpenStatic,, t. H) \$ v) z* m$ u
adLockOptimistic,
* g; N, R% R7 T: ? adCmdText);$ u3 j0 S$ S0 ^/ w0 p! P
while(!m_pRecordset-&gt;adoEOF)  _; G6 \+ ^$ U4 B( D$ O/ S
{
9 ?: K$ P; G" M( N  j, ^   vID = m_pRecordset-&gt;GetCollect(_variant_t((long)0));///取得第1列的值,从0开始计数,' W: q1 P2 E4 a' l5 T- b0 ]
   ///你也可以直接给出列的名称,如下一行
! K. Z: n: N& i& u   vUsername = m_pRecordset-&gt;GetCollect("username");///取得username字段的值+ P" r  [1 A5 {: J
   vOld = m_pRecordset-&gt;GetCollect("old");
) ^9 n: {6 j5 q( }( D3 x- |   vBirthday = m_pRecordset-&gt;GetCollect("birthday");
# L2 ^1 q  a/ X' J6 H0 ~/ E   ///在DEBUG方式下的OUTPUT窗口输出记录集中的记录! g% o2 B3 r% J7 A
   if(vID.vt != VT_NULL &amp;&amp; vUsername.vt != VT_NULL &amp;&amp; vOld.vt != VT_NULL &amp;&amp; vBirthday.vt != VT_NULL)7 I! P) M+ ~- t1 ~8 Q. J
       TRACE("id:%d,姓名:%s,年龄:%d,生日:%s\r\n",' g1 y$ l8 {: U8 z; _
vID.lVal,
. @5 K6 S0 L" g3 |% Y1 I, Z (LPCTSTR)(_bstr_t)vUsername,
; W0 `$ F. m+ [0 p/ Y( W' B) U vOld.lVal,
# Z" P4 J( C. _' S) n( @3 h (LPCTSTR)(_bstr_t)vBirthday);) N: @7 v& Q$ [0 D3 D
   m_pRecordset-&gt;MoveNext();///移到下一条记录
* v% F! G2 v, E' i6 e1 ?2 H6 P}
& k& a6 Q0 o6 i8 O* ^m_pRecordset-&gt;MoveFirst();///移到首条记录$ {. ^0 i7 ]/ ?4 d4 s  {
m_pRecordset-&gt;Delete(adAffectCurrent);///删除当前记录
) V* r/ O! @9 C8 c& o3 j& S///添加三条新记录并赋值
6 \" F. F" T, P. U7 I) qfor(int i=0;i&lt;3;i++)% L+ A# K# y- }7 d0 p- H! y
{
- U# B7 Y1 l7 p: w. K' Z* ^   m_pRecordset-&gt;AddNew();///添加新记录
' o3 @. l0 Q8 g, R   m_pRecordset-&gtutCollect("ID",_variant_t((long)(i+10)));7 ~4 @" A8 e8 ^/ M/ ?
   m_pRecordset-&gtutCollect("username",_variant_t("叶利钦"));; f. b, u. y; {) X6 ~5 H
   m_pRecordset-&gtutCollect("old",_variant_t((long)71));9 h2 Z6 X9 a6 ^; P, N
   m_pRecordset-&gtutCollect("birthday",_variant_t("1930-3-15"));5 q+ ~) e' R+ X
}: X( t# G! h5 b, e
m_pRecordset-&gt;Move(1,_variant_t((long)adBookmarkFirst));///从第一条记录往下移动一条记录,即移动到第二条记录处
& A+ K1 n0 ?! P4 y0 nm_pRecordset-&gtutCollect(_variant_t("old"),_variant_t((long)45));///修改其年龄4 Q7 X4 m2 F' I- U* m
m_pRecordset-&gt;Update();///保存到库中    : u5 i- L& T9 ^' _( E3 f
备注:多次查询可把查询过程做成一个函数ExecuteSQL让m_pRecordset获得连接指针m_pConnection查询结果
' _: Q$ `. ?9 e" l1 C" uvoid ExecuteSQL(_ConnectionPtr  m_pConnection, _RecordsetPtr  m_pRecordset,CString strSql)
$ u! w* a) @7 V3 Z{# t: D' h# B4 g3 E  A& j2 r8 k
   //执行Select 语句$ y3 X+ {  @: D) F+ {. S. N: E
   BSTR bstrSQL = strSql.AllocSysString();           ( s, J4 K. e1 r- [% x- ?5 s
    try
1 v6 j- e9 s0 N( t0 A/ h    {* @5 h3 P5 L  c/ Z* E
       m_pRecordset-&gt;Open(bstrSQL,(IDispatch*)m_pConnection,adOpenDynamic,adLockOptimistic,adCmdText);
, G2 a1 ?  D  K& ~/ Z5 G( R. V; }: l1 D           //adOpenDynamic:动态  adLockOptimistic乐观封锁法  adCmdText:文本查询语句3 X- P! R# Z) @
    }
6 N( g) T/ c/ D" T9 U% K  L    catch(_com_error error)
; o8 Z9 x1 e$ _& ^) Y& _    {
5 S- p+ f9 z, @2 k) H       CString errorMessage;
9 g/ H! E5 M* X  ?       errorMessage.format("%s",(LPTSTR)error.Description());
! n4 o% w) y8 `2 X       AfxMessageBox(errorMessage);
' M; D) w: P1 x    }
0 S+ ~4 H7 w  Q}        
; Z1 N. ~6 ~0 l; `( O: M; R//出错处理:
+ I- M( t1 N% X. O9 Y* l3127——没有找到目标表7 \, b$ v3 y7 v
3092——目标表已经存在/ F. H. O  W4 E5 `
例如:
* v9 Q7 X' y5 c6 l, K8 ecatch(const _com_error e)
# N# N( `' c" C: j{
; _- P6 w$ r! y/ a2 l4 @    AfxMessageBox(e.Description());% K9 e# R4 V$ n3 W  a/ [% K) z
    long errorCode=e.WCode();9 X: X. l7 Z5 K7 {$ ]+ s" o( F1 j. `
    if(3127==errorCode) AfxMessageBox("表不存在");6 ~8 H; _  D& ?) I9 C9 P+ W
    if(3092==errorCode) AfxMessageBox("表已经存在");
. L  P1 _5 n5 q0 n* z    return FALSE;: t( L( a2 d4 X
} ( \" n! F; c4 ?3 o1 s
9 K  q8 [4 j9 |1 N! }- t
</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-18 16:53 , Processed in 1.360387 second(s), 57 queries .

回顶部