QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 3574|回复: 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%">
) v$ t+ [, L& `# Z; u2 G
8 o/ K% d. b/ l5 q<TR>
  Q& B; ~5 S8 g2 }<TD vAlign=top width=32></TD>; K( _- p* Z. E" c4 f
<TD  vAlign=top>5. 记录集的遍历、更新
9 V) {' `% Z$ R4 v6 D/ [
: ]  \1 w& w5 P     根据我们刚才通过执行SQL命令建立好的users表,它包含四个字段:ID,username,old,birthday
) S* d1 l5 r! W( D以下的代码实现:打开记录集,遍历所有记录,删除第一条记录,添加三条记录,移动光标到第二条记录,
8 H6 L, b5 T5 s- [; c更改其年龄,保存到数据库。
/ Q$ B% j6 ^6 {9 ]  ^1 c_variant_t vUsername,vBirthday,vID,vOld;) N( C! p6 k% O9 B2 w# C; j
_RecordsetPtr m_pRecordset;: A8 P9 d1 a+ L" B/ E  D
m_pRecordset.CreateInstance("ADODB.Recordset");
) E$ G; w3 ?0 P# |  m" ]m_pRecordset-&gt;Open("SELECT * FROM users",
$ d1 U" B. J3 i) L. b8 ] _variant_t((IDispatch*)m_pConnection,true),
$ r2 W* E! B/ w* e+ {5 l4 X adOpenStatic,
" E' S4 |4 r+ B4 Y& a adLockOptimistic,0 M2 j* m; h0 D* n
adCmdText);( Y" A* `$ ]5 d$ i5 r! Q& Z
while(!m_pRecordset-&gt;adoEOF)# ?1 R9 o0 v0 a5 O* H8 i8 y1 G
{
% p7 r0 M; w- e; f6 R   vID = m_pRecordset-&gt;GetCollect(_variant_t((long)0));///取得第1列的值,从0开始计数,% \, k6 L, R* R# z' X# [9 |
   ///你也可以直接给出列的名称,如下一行/ I- G+ m0 F; P/ S) G6 M
   vUsername = m_pRecordset-&gt;GetCollect("username");///取得username字段的值" Y1 u- s5 \6 e0 y+ {
   vOld = m_pRecordset-&gt;GetCollect("old");
# o) y5 F1 K/ l9 y   vBirthday = m_pRecordset-&gt;GetCollect("birthday");1 ?. O2 i: G  D8 @7 y$ h$ M
   ///在DEBUG方式下的OUTPUT窗口输出记录集中的记录
( \( `7 {. |& x& d# n   if(vID.vt != VT_NULL &amp;&amp; vUsername.vt != VT_NULL &amp;&amp; vOld.vt != VT_NULL &amp;&amp; vBirthday.vt != VT_NULL)
4 Y0 r4 j* c. Z  ]* I( [- ?( u       TRACE("id:%d,姓名:%s,年龄:%d,生日:%s\r\n",2 q+ X. B; h6 v0 s
vID.lVal,9 \3 r- M" [0 o& }# ]& K
(LPCTSTR)(_bstr_t)vUsername,, x5 S, C8 \. B( y. z9 D
vOld.lVal,
2 _  |+ e' b; F (LPCTSTR)(_bstr_t)vBirthday);& M% c  r3 V, H7 ?8 i- {9 f( W
   m_pRecordset-&gt;MoveNext();///移到下一条记录
0 d* Y' J% n5 p8 ~1 m; l0 z}
/ v4 D' ]- P5 h7 f8 dm_pRecordset-&gt;MoveFirst();///移到首条记录  X& n8 A1 l9 r0 J+ e
m_pRecordset-&gt;Delete(adAffectCurrent);///删除当前记录1 x' D) Y. ]9 E& u: |/ o
///添加三条新记录并赋值
" z) i) [' V. K6 w+ X( Ifor(int i=0;i&lt;3;i++)
; b0 T8 n+ k) V{: T: L$ o9 D. {" c  J  n* `: @
   m_pRecordset-&gt;AddNew();///添加新记录
1 z* D8 a( W, s4 F! E. t  v   m_pRecordset-&gtutCollect("ID",_variant_t((long)(i+10)));
/ ^2 v* p# |/ y/ K, b3 X& ~% u   m_pRecordset-&gtutCollect("username",_variant_t("叶利钦"));
- M2 S; z# F" m8 l; _6 |   m_pRecordset-&gtutCollect("old",_variant_t((long)71));4 l. f# R# \9 O3 _1 L9 {
   m_pRecordset-&gtutCollect("birthday",_variant_t("1930-3-15"));
+ b* K* v  _( @. G}1 g1 K, m% Q/ v+ W
m_pRecordset-&gt;Move(1,_variant_t((long)adBookmarkFirst));///从第一条记录往下移动一条记录,即移动到第二条记录处5 ^( x+ a2 P2 l4 A" R  B
m_pRecordset-&gtutCollect(_variant_t("old"),_variant_t((long)45));///修改其年龄
% _8 j$ G! ?6 O1 @: g" vm_pRecordset-&gt;Update();///保存到库中      u/ n. ~  Z" g* ?3 \
备注:多次查询可把查询过程做成一个函数ExecuteSQL让m_pRecordset获得连接指针m_pConnection查询结果
5 k; |$ C3 O+ Y2 p; s9 S1 Cvoid ExecuteSQL(_ConnectionPtr  m_pConnection, _RecordsetPtr  m_pRecordset,CString strSql)6 s& m" o! {9 b1 o3 q) I# t
{
% f/ Q  T* F, q   //执行Select 语句
5 y$ p4 k: q+ a/ N( s1 `" H6 Y. T' i   BSTR bstrSQL = strSql.AllocSysString();           , `; }- X( u0 Y0 A
    try! L) \' A& g4 ]
    {6 r9 u/ @) ~) i! r. r( M/ e
       m_pRecordset-&gt;Open(bstrSQL,(IDispatch*)m_pConnection,adOpenDynamic,adLockOptimistic,adCmdText);
+ x& X: r  {. f8 s' o           //adOpenDynamic:动态  adLockOptimistic乐观封锁法  adCmdText:文本查询语句
2 C# @; K8 [- p' g    }
% C/ U; R& F, J+ i4 {* E( \    catch(_com_error error); B1 X6 Q, D6 f3 M3 C  B, s" R
    {
) T& J% Z/ c' u. R* J       CString errorMessage;
1 c& g& H& X/ J8 F( d, K1 s4 f       errorMessage.format("%s",(LPTSTR)error.Description());' t3 ~* u% t. H& O& h0 w& C
       AfxMessageBox(errorMessage);
$ O* ?" V5 e  @7 U1 C5 C* @+ I    }$ r0 P' D1 G# G6 p1 ]
}        
( C3 V! l& _4 @# {//出错处理:
+ s& @9 G% \7 V# \/ O& J0 s3127——没有找到目标表% q( r. W. ^# h% Y* j( B  U
3092——目标表已经存在
7 k: e/ e6 s% j$ A% z例如:) s' }3 C# y' A  a0 M2 S
catch(const _com_error e)
" z, T5 A/ r9 {6 Z{9 k  F/ o$ M/ F! L+ f6 j7 g
    AfxMessageBox(e.Description());
' r5 s# c9 p% y    long errorCode=e.WCode();
+ P, |& o" Z* w/ E! j! f    if(3127==errorCode) AfxMessageBox("表不存在");
9 K* A, [- g$ P* o    if(3092==errorCode) AfxMessageBox("表已经存在");! s8 C3 V2 A- x. `7 ^2 n* L- I& U" b
    return FALSE;
7 |* O% f/ |6 \, o1 a3 C} 8 T4 i# x# ?+ }! y
8 d' A7 j5 M4 ?# ~4 G
</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 11:08 , Processed in 0.278075 second(s), 58 queries .

回顶部