QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 3640|回复: 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%">$ t- T% c5 d9 z) d
3 w0 x# T" b6 u; [- j* f7 [
<TR>
1 h0 V) o1 x  W- q/ Y2 T4 s<TD vAlign=top width=32></TD>4 a7 D9 }  b6 x& C3 [& }
<TD  vAlign=top>5. 记录集的遍历、更新( M9 K! ]! p1 t
- T. ^; G+ t+ {, M4 [
     根据我们刚才通过执行SQL命令建立好的users表,它包含四个字段:ID,username,old,birthday9 s' G* h8 F) `9 v% T6 D( i
以下的代码实现:打开记录集,遍历所有记录,删除第一条记录,添加三条记录,移动光标到第二条记录,
+ g1 i( K: n8 [' Z  \& V更改其年龄,保存到数据库。 . w% ]9 [1 @, R2 [+ c  l) D
_variant_t vUsername,vBirthday,vID,vOld;2 C5 N$ ^4 H1 s3 K! n
_RecordsetPtr m_pRecordset;# l: U* u* j7 j/ s
m_pRecordset.CreateInstance("ADODB.Recordset");. b; Z- C4 Q$ m8 d2 D* F6 p
m_pRecordset-&gt;Open("SELECT * FROM users",
) j/ h/ y% d2 \4 G( K: Q( t _variant_t((IDispatch*)m_pConnection,true),/ W, f0 Y2 a4 N* ?& E2 C
adOpenStatic,
& y$ ?' I' [6 @2 [8 B+ ]; { adLockOptimistic,
! N( m8 a, T) U2 n4 X6 C0 q6 i adCmdText);1 [/ s) p4 P  T
while(!m_pRecordset-&gt;adoEOF), t, p, i( F: t8 y; r+ x- S
{
+ j1 }+ P8 b0 N7 G: ?  o   vID = m_pRecordset-&gt;GetCollect(_variant_t((long)0));///取得第1列的值,从0开始计数,2 o4 L6 v( f9 v8 P" G
   ///你也可以直接给出列的名称,如下一行* O4 e; T/ z" |" A
   vUsername = m_pRecordset-&gt;GetCollect("username");///取得username字段的值# F% n2 _* Q4 ?9 w) y/ y3 [9 x
   vOld = m_pRecordset-&gt;GetCollect("old");& P2 J5 ~! l& z
   vBirthday = m_pRecordset-&gt;GetCollect("birthday");
2 o: v! e7 c2 B; r   ///在DEBUG方式下的OUTPUT窗口输出记录集中的记录
2 P5 Q! O9 L: ?+ w5 ?+ L   if(vID.vt != VT_NULL &amp;&amp; vUsername.vt != VT_NULL &amp;&amp; vOld.vt != VT_NULL &amp;&amp; vBirthday.vt != VT_NULL)& p& V+ Q, [! r( X8 k8 \
       TRACE("id:%d,姓名:%s,年龄:%d,生日:%s\r\n",: j2 ~+ W8 f2 I8 i- p
vID.lVal,
3 a" C0 c( y' \2 D- _ (LPCTSTR)(_bstr_t)vUsername,
& T, y3 g' Z( d: k' T vOld.lVal,- c& x8 g0 A# Z* U0 r
(LPCTSTR)(_bstr_t)vBirthday);
! M/ k+ |7 j# ]% H6 u+ O   m_pRecordset-&gt;MoveNext();///移到下一条记录( C4 u$ g3 x9 N# n
}9 g5 o( v; r7 Y" r, ?
m_pRecordset-&gt;MoveFirst();///移到首条记录/ a- k7 l2 N7 N: w) ?. x2 E
m_pRecordset-&gt;Delete(adAffectCurrent);///删除当前记录
! Q' f# N0 |0 L! S. m" C///添加三条新记录并赋值, P( \% V$ \  O! g  B- X
for(int i=0;i&lt;3;i++)
( l  a. b8 {) S* ~3 e{
  k1 s1 Z5 [' j! p0 d6 v2 O* U4 ]   m_pRecordset-&gt;AddNew();///添加新记录
5 {2 ]  }7 i0 C3 e# y   m_pRecordset-&gtutCollect("ID",_variant_t((long)(i+10)));
+ s6 h4 s1 w1 D' ^5 u6 w' I& t   m_pRecordset-&gtutCollect("username",_variant_t("叶利钦"));
+ `$ q) E8 f5 H% N: b! d* o, h   m_pRecordset-&gtutCollect("old",_variant_t((long)71));
) D: y+ @7 u6 w7 Y   m_pRecordset-&gtutCollect("birthday",_variant_t("1930-3-15"));
' b% t) L: ~; ~. _4 s, R# i% y, y. y}- B/ [, v, ]2 Z3 t. j" R6 t
m_pRecordset-&gt;Move(1,_variant_t((long)adBookmarkFirst));///从第一条记录往下移动一条记录,即移动到第二条记录处
; Q. O' u/ n8 @2 G- pm_pRecordset-&gtutCollect(_variant_t("old"),_variant_t((long)45));///修改其年龄
  R$ }- T/ d! h( c6 q7 @5 ?) Bm_pRecordset-&gt;Update();///保存到库中   
7 {! Y! {8 z3 E3 G备注:多次查询可把查询过程做成一个函数ExecuteSQL让m_pRecordset获得连接指针m_pConnection查询结果 # t; U7 k) X" ^, o% {
void ExecuteSQL(_ConnectionPtr  m_pConnection, _RecordsetPtr  m_pRecordset,CString strSql)6 D3 v/ x8 v  B% \0 n- _" [
{- `' A( l" G: P2 G: s0 E
   //执行Select 语句% L. t' k6 F! I  S% L! W
   BSTR bstrSQL = strSql.AllocSysString();           
* w9 O+ G! ~* s: M    try
4 q! }7 B4 [4 C    {( l( U! B! r/ R2 O0 k) v2 I
       m_pRecordset-&gt;Open(bstrSQL,(IDispatch*)m_pConnection,adOpenDynamic,adLockOptimistic,adCmdText);
& F* Z7 {1 ]( j( a: S5 `           //adOpenDynamic:动态  adLockOptimistic乐观封锁法  adCmdText:文本查询语句7 j4 R3 J% }' H9 b
    }3 K/ Z+ a$ R- {
    catch(_com_error error)
3 H8 u4 ^2 K2 i( o# i# E0 N9 F    {; ], P( N+ c4 s' G1 q7 q. }
       CString errorMessage;8 j9 J/ X% I2 N9 b  |
       errorMessage.format("%s",(LPTSTR)error.Description());
/ L& P1 g6 h# A5 L" S* G  G       AfxMessageBox(errorMessage);
/ Q5 ?2 G3 m# j( J    }6 M6 n% ]( P: t. ~2 }( g
}          ?- y0 T2 F/ v) t+ ]
//出错处理:
2 J. I% j9 a& A4 a# }: f3127——没有找到目标表
0 X% _. b: P. ]; \- F3092——目标表已经存在8 T5 G5 y; V1 U2 L1 ?) B8 C$ z% E
例如:
6 w, ~3 K( B, g  F, S" ccatch(const _com_error e)
3 ?/ }( S. f4 B. C$ ~{
1 M7 _4 ~: ]6 T    AfxMessageBox(e.Description());
/ G9 ]4 D9 p4 a( [/ I    long errorCode=e.WCode();
# A( y* g' n. W$ T! H3 @# w' D- ?    if(3127==errorCode) AfxMessageBox("表不存在");
; b4 Y: D8 e& ?% z& G  _    if(3092==errorCode) AfxMessageBox("表已经存在");/ ?" g( @& J9 E( X' C
    return FALSE;* N- C: Q8 A! n& q
}
, a3 x9 a+ L& \8 e% G! p) {. v* j& n
</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-19 10:24 , Processed in 0.778015 second(s), 58 queries .

回顶部