QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 3378|回复: 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%">
: k" Y8 h9 j/ k
- y: W0 k% A* V% Y5 G<TR>
0 B0 U! F- A! |; H& B<TD vAlign=top width=32></TD>
  q5 |$ B) J  V<TD  vAlign=top>5. 记录集的遍历、更新0 {* I) S6 x/ c

( M& S' j" ^7 }; f+ v2 B6 B& e     根据我们刚才通过执行SQL命令建立好的users表,它包含四个字段:ID,username,old,birthday
. y, _0 M1 |% W& d- ?0 t) W以下的代码实现:打开记录集,遍历所有记录,删除第一条记录,添加三条记录,移动光标到第二条记录,
8 L4 h! E7 M; [* c更改其年龄,保存到数据库。 + h, H; y% A; I$ o5 j( Q8 o
_variant_t vUsername,vBirthday,vID,vOld;7 f2 y. i( c0 p, w
_RecordsetPtr m_pRecordset;* b. r' i: u# g* @/ ]
m_pRecordset.CreateInstance("ADODB.Recordset");' c$ c" i+ s# b6 K1 y
m_pRecordset-&gt;Open("SELECT * FROM users",
$ r" N" H+ k$ w- } _variant_t((IDispatch*)m_pConnection,true),+ j+ X3 V! G. m6 i" E( g
adOpenStatic,8 V! c; \$ g! {9 j! Q3 o
adLockOptimistic,
$ m) y& C: }: q$ } adCmdText);- W" X/ e+ \. k; s. \
while(!m_pRecordset-&gt;adoEOF)+ t; }' L& P5 q, U) e
{
0 ]! _& r  S* \. O1 n5 z. N   vID = m_pRecordset-&gt;GetCollect(_variant_t((long)0));///取得第1列的值,从0开始计数,/ [, ^: o! f$ g. `+ P& p
   ///你也可以直接给出列的名称,如下一行
9 O4 {5 L" T8 L1 b* o  u' P  i   vUsername = m_pRecordset-&gt;GetCollect("username");///取得username字段的值
6 G* o4 k% d8 j/ c  S, M   vOld = m_pRecordset-&gt;GetCollect("old");
( n! R: s- h0 {: K   vBirthday = m_pRecordset-&gt;GetCollect("birthday");4 h7 x7 [; H2 |! C3 ?+ D5 _; y0 y
   ///在DEBUG方式下的OUTPUT窗口输出记录集中的记录' k5 y1 G2 |3 C1 g
   if(vID.vt != VT_NULL &amp;&amp; vUsername.vt != VT_NULL &amp;&amp; vOld.vt != VT_NULL &amp;&amp; vBirthday.vt != VT_NULL)
$ p2 J9 f& W3 b& o& l( p& ]       TRACE("id:%d,姓名:%s,年龄:%d,生日:%s\r\n",
/ W3 y4 Y! B" v1 |8 U vID.lVal,
% ?. V6 I+ O! w# ^" p) N (LPCTSTR)(_bstr_t)vUsername,8 D9 K$ \+ t. ?
vOld.lVal,
3 K8 o5 t( J3 X- {- z; { (LPCTSTR)(_bstr_t)vBirthday);* E8 o% w3 P* S. N" g+ N' y
   m_pRecordset-&gt;MoveNext();///移到下一条记录1 B' \  {; U( W! J: J
}; G0 I( b. t! d4 x3 T3 l
m_pRecordset-&gt;MoveFirst();///移到首条记录
" P: v* @! U. P2 W- U# jm_pRecordset-&gt;Delete(adAffectCurrent);///删除当前记录
( a$ a  A# c- n( b4 d///添加三条新记录并赋值
/ h5 Q  D6 I3 H0 e- O) M4 y" ]for(int i=0;i&lt;3;i++)
9 ]3 H7 V7 {$ y5 b; k{9 u1 ?3 j  H' `. s6 V# T$ k1 B' t
   m_pRecordset-&gt;AddNew();///添加新记录
# M+ j2 y$ }# O3 q; X! ^   m_pRecordset-&gtutCollect("ID",_variant_t((long)(i+10)));9 r0 ]) f2 z: w+ D# h7 Q% ^
   m_pRecordset-&gtutCollect("username",_variant_t("叶利钦"));' p: ]3 g7 H% _- }& G' A/ G
   m_pRecordset-&gtutCollect("old",_variant_t((long)71));3 f3 h  x; b, ~) e2 h& a' n
   m_pRecordset-&gtutCollect("birthday",_variant_t("1930-3-15"));- `$ `% V. l7 P3 C& `% G
}: u) F# g. B5 t" @
m_pRecordset-&gt;Move(1,_variant_t((long)adBookmarkFirst));///从第一条记录往下移动一条记录,即移动到第二条记录处! t1 R  e2 B* s' Y, E, O
m_pRecordset-&gtutCollect(_variant_t("old"),_variant_t((long)45));///修改其年龄$ r% o: `" r% x7 q7 b
m_pRecordset-&gt;Update();///保存到库中    2 w1 m1 v7 i! i. A
备注:多次查询可把查询过程做成一个函数ExecuteSQL让m_pRecordset获得连接指针m_pConnection查询结果 * A; x: u4 \. S' l
void ExecuteSQL(_ConnectionPtr  m_pConnection, _RecordsetPtr  m_pRecordset,CString strSql)
  k  M0 X0 }) v* t+ |- C{
+ d: \5 G( G! ~$ c, t% U8 C1 Y( E   //执行Select 语句
8 i# }. B4 t. m( x  G   BSTR bstrSQL = strSql.AllocSysString();           - a5 u8 A# q7 I4 }# W8 r
    try
+ y& D1 H5 K8 }& Q    {
; l) V( x5 q2 c3 g       m_pRecordset-&gt;Open(bstrSQL,(IDispatch*)m_pConnection,adOpenDynamic,adLockOptimistic,adCmdText); # S. H' Q1 k+ M) t  ]( m+ p0 v
           //adOpenDynamic:动态  adLockOptimistic乐观封锁法  adCmdText:文本查询语句/ U+ V+ S+ e0 j. k
    }' Z' L' D+ L: M( z. h
    catch(_com_error error)
+ r) Q5 G3 O6 g! t& z    {
% p8 B" Y0 A5 B# l3 |! e       CString errorMessage;% a/ z5 V0 q- W4 ]& [% q/ v
       errorMessage.format("%s",(LPTSTR)error.Description());
% k# w  g; ~, C# U7 X  z5 @       AfxMessageBox(errorMessage);
  F: Q9 m- C, E" ], j; U    }9 ]) I* J( \9 Z7 h2 z
}        4 ]  z+ ?6 W6 X# e! Z! n
//出错处理:) U" b9 W. S/ M! Z/ L
3127——没有找到目标表
' @. [9 V0 s2 r; T7 o2 a7 @1 T3092——目标表已经存在( z1 W1 ~6 v, o9 {7 M
例如:
) F- u9 c# D4 Z- g, E  Y) Q9 g' Tcatch(const _com_error e)
, S: G" _/ v9 K; L{* [0 e6 A, S2 W) O6 T
    AfxMessageBox(e.Description());' j/ n6 `% R+ Q( h1 C
    long errorCode=e.WCode();
% ^# z2 y+ C% i# Y) V5 L, V  `    if(3127==errorCode) AfxMessageBox("表不存在");
0 O) v' y4 }; a! Y    if(3092==errorCode) AfxMessageBox("表已经存在");3 o/ L" Q: V% ~! |8 \/ A& d
    return FALSE;3 m% i5 d9 N( U, o, {/ i
} / a% q/ P8 V# y6 y, F6 ?, _* E/ ~
4 ^4 j8 `, R$ @: C
</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, 2025-8-2 08:30 , Processed in 0.420906 second(s), 57 queries .

回顶部