QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 3608|回复: 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, L/ p  y8 ~0 ?, C' L2 k7 N& |

0 n  @  Q% H* A& Q" O: ~0 R<TR>" ]3 T8 `1 W& c
<TD vAlign=top width=32></TD># J9 V2 b1 }; o% m7 d
<TD  vAlign=top>5. 记录集的遍历、更新; N9 O+ k/ {' G. J/ D( S
- ~- D; `! ~$ m/ z  ?" {
     根据我们刚才通过执行SQL命令建立好的users表,它包含四个字段:ID,username,old,birthday
+ c, t2 {, r2 A# @3 @; y以下的代码实现:打开记录集,遍历所有记录,删除第一条记录,添加三条记录,移动光标到第二条记录,& p0 l$ Q, ?) J8 T. o1 z
更改其年龄,保存到数据库。 : P2 G; b8 V  L! J/ n. r, R9 y: F
_variant_t vUsername,vBirthday,vID,vOld;
- u0 [& a+ z4 Y5 e% o_RecordsetPtr m_pRecordset;
* G% I/ [) V: [+ z% lm_pRecordset.CreateInstance("ADODB.Recordset");. M: m' B, d. m' U  J
m_pRecordset-&gt;Open("SELECT * FROM users",
5 ?5 s1 T( }6 F' s; D, \ _variant_t((IDispatch*)m_pConnection,true),' e( \' a- ^' k
adOpenStatic,0 \0 q2 d: c: f0 k' w4 f
adLockOptimistic,+ Y. q7 ^3 z! r: Q
adCmdText);
  r( K2 T. i2 {0 W4 K' rwhile(!m_pRecordset-&gt;adoEOF)& [, b% T. P& ]. _, V* j7 V
{6 J3 K6 L0 i# H$ w9 b! c
   vID = m_pRecordset-&gt;GetCollect(_variant_t((long)0));///取得第1列的值,从0开始计数,9 l- a5 E) r! v) j5 M  L9 v/ P
   ///你也可以直接给出列的名称,如下一行/ p% g( n, c2 m; z
   vUsername = m_pRecordset-&gt;GetCollect("username");///取得username字段的值
& H6 R9 \" ?  E% j   vOld = m_pRecordset-&gt;GetCollect("old");
8 p/ S/ ]9 Y7 H7 g8 n   vBirthday = m_pRecordset-&gt;GetCollect("birthday");9 _# N$ |2 [( \' q
   ///在DEBUG方式下的OUTPUT窗口输出记录集中的记录# x7 e( N: R* ?: ~& {1 j
   if(vID.vt != VT_NULL &amp;&amp; vUsername.vt != VT_NULL &amp;&amp; vOld.vt != VT_NULL &amp;&amp; vBirthday.vt != VT_NULL)- W3 s5 Y5 a2 o9 [
       TRACE("id:%d,姓名:%s,年龄:%d,生日:%s\r\n",
& n8 j. Y/ Z. b" Z  g vID.lVal,
& N! p; @* `. `( a (LPCTSTR)(_bstr_t)vUsername,& w+ W- }# n$ i; L, I9 W
vOld.lVal,6 V. T' W. V$ ]) h: J
(LPCTSTR)(_bstr_t)vBirthday);
: ?/ G" J5 w* T" V& e5 f. a8 Q, h6 ?   m_pRecordset-&gt;MoveNext();///移到下一条记录
: ]0 H/ i4 h0 q" h5 K}
7 H+ z1 ^5 M0 l+ Mm_pRecordset-&gt;MoveFirst();///移到首条记录1 D. y3 y. U5 J+ E6 L9 [
m_pRecordset-&gt;Delete(adAffectCurrent);///删除当前记录$ N( H6 n% _9 F. h' w) T! w
///添加三条新记录并赋值' a8 X+ U# C& G' u0 W
for(int i=0;i&lt;3;i++)1 Z0 `/ Z' f; v3 _
{/ [* ?7 F9 t: [7 |+ Z: A* p9 T' s
   m_pRecordset-&gt;AddNew();///添加新记录3 m; b: _; C0 m# Q$ x  t0 D
   m_pRecordset-&gtutCollect("ID",_variant_t((long)(i+10)));  j- N% W) l; L4 F
   m_pRecordset-&gtutCollect("username",_variant_t("叶利钦"));- W2 t( x/ [; W. I
   m_pRecordset-&gtutCollect("old",_variant_t((long)71));( v+ C' x8 N4 z. k$ O
   m_pRecordset-&gtutCollect("birthday",_variant_t("1930-3-15"));
' I/ x  w: O4 V0 _: [$ o}
* S8 Q9 S( B6 X& Mm_pRecordset-&gt;Move(1,_variant_t((long)adBookmarkFirst));///从第一条记录往下移动一条记录,即移动到第二条记录处1 O/ X4 o5 }. M" d7 t% e0 L
m_pRecordset-&gtutCollect(_variant_t("old"),_variant_t((long)45));///修改其年龄
7 g# A8 u. t, mm_pRecordset-&gt;Update();///保存到库中   
5 L! I9 d: ]" U; w; T备注:多次查询可把查询过程做成一个函数ExecuteSQL让m_pRecordset获得连接指针m_pConnection查询结果
: j+ @% E: c( j& r+ E: Dvoid ExecuteSQL(_ConnectionPtr  m_pConnection, _RecordsetPtr  m_pRecordset,CString strSql)" z3 h# t; B( {, w' |+ t
{
$ @+ u( p0 p) H! E6 x/ c$ Z) t& I   //执行Select 语句
" x/ u# j% G6 S0 |0 F& L. Z   BSTR bstrSQL = strSql.AllocSysString();           % A9 j; E$ A" H7 }' h
    try! ]  [5 Q: r! X  k  ]! U! a
    {! I, R; W/ e- c% b: x
       m_pRecordset-&gt;Open(bstrSQL,(IDispatch*)m_pConnection,adOpenDynamic,adLockOptimistic,adCmdText); 6 A9 A  }- T; q8 D' Y
           //adOpenDynamic:动态  adLockOptimistic乐观封锁法  adCmdText:文本查询语句
6 `$ f, ~) r- M: Q; e. d    }
3 V& |0 e( s8 b+ S" q7 w& H    catch(_com_error error)
3 p' C7 |8 b! h) M! [9 b    {
7 G6 F) m. u: L) ~/ H       CString errorMessage;( ]& K2 L& _7 C' b0 |
       errorMessage.format("%s",(LPTSTR)error.Description());# e. k2 C( |$ k' q6 `% `- N
       AfxMessageBox(errorMessage);
8 G$ E6 C/ Q$ N1 n3 y1 `0 x% b( z' F    }4 F" C. r' V, D: m7 F
}        
& P" n4 Q6 a& o$ p/ h& R//出错处理:, q6 E5 i" ^/ B& a2 u
3127——没有找到目标表& [. N6 k! a$ e3 ~- x! P# P
3092——目标表已经存在  D9 K/ i$ ?! l) C3 q/ E
例如:
# ~& z3 e$ l! u, @5 K8 d+ zcatch(const _com_error e)) Y0 w: S) m* ~+ m7 J8 J, f" v
{9 _0 ^! x) K& h  m: d1 [+ ^9 x$ F
    AfxMessageBox(e.Description());! h  B( R7 t5 A
    long errorCode=e.WCode();/ [8 Y9 J. ?) k) }+ Q" j/ w0 ^
    if(3127==errorCode) AfxMessageBox("表不存在");7 N& o. P( X' n$ A  i0 X" J, C8 [
    if(3092==errorCode) AfxMessageBox("表已经存在");
/ q, {; {# ~9 e; P3 e3 n    return FALSE;& O; _1 i/ T7 ^
}
$ v' F1 z3 E- R5 h% v0 n
$ r+ i8 e1 v) k( Y$ m; 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-6-3 12:18 , Processed in 0.410237 second(s), 58 queries .

回顶部