QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 3582|回复: 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%">/ ?. X9 @, x8 G6 m8 Q9 w8 _3 i7 m
! U! C* }6 t) n. I, S3 d7 J
<TR>- {$ V1 e8 l# n$ o( d. a
<TD vAlign=top width=32></TD>8 j, f( ]& o& N9 K
<TD  vAlign=top>5. 记录集的遍历、更新& u) @& Y" V" z# {. x3 y
: M: N# T" W$ A  Z( _8 k* x" |
     根据我们刚才通过执行SQL命令建立好的users表,它包含四个字段:ID,username,old,birthday( F% z! @# a3 M) B/ }) f) b
以下的代码实现:打开记录集,遍历所有记录,删除第一条记录,添加三条记录,移动光标到第二条记录,
) e# e+ m1 d, x1 g7 b( R更改其年龄,保存到数据库。
% |/ V% n4 k% R/ G7 O_variant_t vUsername,vBirthday,vID,vOld;
. L& M: W: q; ]4 B8 H. A_RecordsetPtr m_pRecordset;& y1 ?. t; y% @+ T; ~
m_pRecordset.CreateInstance("ADODB.Recordset");5 a5 o7 K: `2 |
m_pRecordset-&gt;Open("SELECT * FROM users",5 b- \6 k. ?" ^2 x( \9 r
_variant_t((IDispatch*)m_pConnection,true),& X+ o9 V# j2 |
adOpenStatic," n% f& z5 f# s
adLockOptimistic,
$ ^' \) j# h/ B# e, }  `8 d adCmdText);8 ~+ z/ g! |7 {8 t
while(!m_pRecordset-&gt;adoEOF)
' m$ `$ p5 b5 b- Y  g3 {9 x3 |7 C{5 F, @) \  Y$ l9 S5 R! L
   vID = m_pRecordset-&gt;GetCollect(_variant_t((long)0));///取得第1列的值,从0开始计数,
/ N4 q4 D1 h8 x5 `* Z  j   ///你也可以直接给出列的名称,如下一行
0 }/ t, ?2 Q; g' @! {( h   vUsername = m_pRecordset-&gt;GetCollect("username");///取得username字段的值( W3 q% B5 e* d0 B9 B4 G3 Q3 K
   vOld = m_pRecordset-&gt;GetCollect("old");- O; [6 Q% B9 u8 G; ]" \+ f  t
   vBirthday = m_pRecordset-&gt;GetCollect("birthday");) c) B( |9 X) L( \
   ///在DEBUG方式下的OUTPUT窗口输出记录集中的记录
  P& e0 f# G, Y- U/ \- i   if(vID.vt != VT_NULL &amp;&amp; vUsername.vt != VT_NULL &amp;&amp; vOld.vt != VT_NULL &amp;&amp; vBirthday.vt != VT_NULL)& [( ^- H/ S; v
       TRACE("id:%d,姓名:%s,年龄:%d,生日:%s\r\n",8 r) p7 J! R; h0 s- a
vID.lVal,
, S: `$ H4 J  X (LPCTSTR)(_bstr_t)vUsername,
6 Q; a/ c. L" h) y vOld.lVal,6 a: j4 ?% K! t& |9 x6 I3 d
(LPCTSTR)(_bstr_t)vBirthday);8 v  V* _6 q- K/ J+ S4 I5 l
   m_pRecordset-&gt;MoveNext();///移到下一条记录
$ c1 o- \/ L+ j}
  ?- h' L/ X. T0 T6 `m_pRecordset-&gt;MoveFirst();///移到首条记录
+ b3 C: K* L) _& t& @0 zm_pRecordset-&gt;Delete(adAffectCurrent);///删除当前记录
1 H& x0 F% e7 D2 f' k2 L///添加三条新记录并赋值
, h& s1 ~" {9 N/ ?9 l7 Zfor(int i=0;i&lt;3;i++)
' e% V! i3 N  w{
% |  `+ b' O1 ~" `; q3 z5 U& D: v  w7 a   m_pRecordset-&gt;AddNew();///添加新记录
/ F. u, M, u0 R3 o6 [( n5 L   m_pRecordset-&gtutCollect("ID",_variant_t((long)(i+10)));
: D! A  W9 L5 g# A% T7 j% S   m_pRecordset-&gtutCollect("username",_variant_t("叶利钦"));
: x4 V- l" M8 ?0 z4 E3 x   m_pRecordset-&gtutCollect("old",_variant_t((long)71));) M  ~  R$ q8 E9 R3 q
   m_pRecordset-&gtutCollect("birthday",_variant_t("1930-3-15"));
, c* o6 X. \- ]5 ?! L. `' o2 V9 }}& q$ {. E* P8 k0 Y% I- h- n
m_pRecordset-&gt;Move(1,_variant_t((long)adBookmarkFirst));///从第一条记录往下移动一条记录,即移动到第二条记录处. K: y3 r2 e9 s7 f: L
m_pRecordset-&gtutCollect(_variant_t("old"),_variant_t((long)45));///修改其年龄% u' n6 Q' \% v* ?4 q3 ^
m_pRecordset-&gt;Update();///保存到库中   
' I( ]/ x* r) S8 E备注:多次查询可把查询过程做成一个函数ExecuteSQL让m_pRecordset获得连接指针m_pConnection查询结果 ; x4 P0 [3 K, B
void ExecuteSQL(_ConnectionPtr  m_pConnection, _RecordsetPtr  m_pRecordset,CString strSql)
4 u* T4 {$ o% h7 _. s, b" C& ^/ |{  U) Z, |& h9 L
   //执行Select 语句3 W+ \4 q! H  r" n
   BSTR bstrSQL = strSql.AllocSysString();           
9 [( X, D  l, X9 q" D! e- i- U    try
0 ?% ~" m3 h( y( c, a    {
1 Y6 q3 `; D; u9 o       m_pRecordset-&gt;Open(bstrSQL,(IDispatch*)m_pConnection,adOpenDynamic,adLockOptimistic,adCmdText);
2 m6 u* P( ^% x) C+ y8 {           //adOpenDynamic:动态  adLockOptimistic乐观封锁法  adCmdText:文本查询语句7 ]. V+ I) b8 @5 `  w8 ^
    }' _9 z; s4 F' e- ^0 s. d6 H
    catch(_com_error error)/ L/ \  W5 U! G2 Q! [, z
    {
9 d0 J" l. y& X' C- T       CString errorMessage;
% l) T: U) S+ n" z0 y       errorMessage.format("%s",(LPTSTR)error.Description());# Q6 N. F2 x! K( `
       AfxMessageBox(errorMessage);
2 s/ ?5 e& o0 k* o5 h. t; _( u    }- \+ `4 a' _4 `# Z0 f# g* y, p
}        
' S2 g. D4 N3 g//出错处理:9 d. o' k- b  I' e, y( {5 P
3127——没有找到目标表% o' x; e* W% q% v1 l% `  u. R$ d$ c8 \
3092——目标表已经存在  S, H+ d, _0 K8 x# V5 B
例如:6 L& s4 d! q6 R6 w7 u& e  M
catch(const _com_error e)
' W# T" g8 @* y) i3 S{
: D6 M5 S9 ^, ~3 e    AfxMessageBox(e.Description());
2 _; Z& {% b0 y- u/ }    long errorCode=e.WCode();
. z& m9 [" }$ Q9 A$ U6 q/ }* ^& |, I& `    if(3127==errorCode) AfxMessageBox("表不存在");
! x+ I# K3 q( h. C" b  M; _! |    if(3092==errorCode) AfxMessageBox("表已经存在");
0 F+ |* G1 h  R! s6 v    return FALSE;
' o, ~( W6 a4 @" y& a( D}
; r; l- T, P3 P0 L/ P. ]1 T( t! j. J2 i' |- q7 W) y
</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-19 04:19 , Processed in 0.409053 second(s), 58 queries .

回顶部