数学建模社区-数学中国
标题:
[转帖]在Visual C++中用ADO进行数据库编程(下)
[打印本页]
作者:
god
时间:
2005-3-30 22:53
标题:
[转帖]在Visual C++中用ADO进行数据库编程(下)
<TABLE cellPadding=0 cellSpacing=0 height=325 style="TABLE-LAYOUT: fixed" width="100%">
+ ^' r& L4 ~+ H! {, ^
" W$ s; G5 x% a6 z
<TR>
! ~2 b0 C. r q J
<TD vAlign=top width=32></TD>
2 B( ?1 K! J' w( c+ F
<TD vAlign=top>5. 记录集的遍历、更新
' b6 \2 T- F% ^$ [0 @! {* g: U
% @ Z! N! a) @3 o+ i A2 K
根据我们刚才通过执行SQL命令建立好的users表,它包含四个字段:ID,username,old,birthday
% o( N- [5 s0 k7 K/ M" C6 p7 d2 G @
以下的代码实现:打开记录集,遍历所有记录,删除第一条记录,添加三条记录,移动光标到第二条记录,
+ [; Q* e C ^+ ^& v
更改其年龄,保存到数据库。
9 J) [9 A9 n9 J2 U" L: Y6 i& @
_variant_t vUsername,vBirthday,vID,vOld;
% |4 o( ?5 f% z" v& [: \6 p& O4 e: v
_RecordsetPtr m_pRecordset;
9 c% F+ b+ I2 s) _
m_pRecordset.CreateInstance("ADODB.Recordset");
! d1 I8 [- O }3 N! d. R
m_pRecordset->Open("SELECT * FROM users",
9 a' ?/ j1 m) ?! k% W0 A
_variant_t((IDispatch*)m_pConnection,true),
& Q- ]% ?4 b' N( Q& o# }# J
adOpenStatic,
9 e% N- S% e) t2 e3 o6 t6 i, a
adLockOptimistic,
9 a; q$ ]' ~1 Q# [" O* M! j3 r- V; A
adCmdText);
5 B3 P/ j8 N0 z& q7 J. O& z
while(!m_pRecordset->adoEOF)
- m% a$ Q, \& D' W8 h! k
{
1 L7 e* L5 |" X7 \' B. w W, Z
vID = m_pRecordset->GetCollect(_variant_t((long)0));///取得第1列的值,从0开始计数,
2 J5 k' a7 g9 p0 Q1 Y. y/ x
///你也可以直接给出列的名称,如下一行
9 E+ e* J& v2 A% M P9 B
vUsername = m_pRecordset->GetCollect("username");///取得username字段的值
+ L+ n# k8 H4 [6 Z
vOld = m_pRecordset->GetCollect("old");
& m- c6 z4 m9 X# _& v* X4 O5 B
vBirthday = m_pRecordset->GetCollect("birthday");
( k- \7 b, X" u" f) f# [! @
///在DEBUG方式下的OUTPUT窗口输出记录集中的记录
' @& ?! o7 ?: {! F* P$ n7 e1 `( t
if(vID.vt != VT_NULL && vUsername.vt != VT_NULL && vOld.vt != VT_NULL && vBirthday.vt != VT_NULL)
& b5 b% j9 X- ~+ ?* s. a
TRACE("id:%d,姓名:%s,年龄:%d,生日:%s\r\n",
2 T+ p/ d0 w- A
vID.lVal,
# ^: W4 B4 p. T% e! }
(LPCTSTR)(_bstr_t)vUsername,
' C8 Z0 j y W
vOld.lVal,
% Q1 O+ ]/ q) N% b
(LPCTSTR)(_bstr_t)vBirthday);
! l D8 B7 P3 ]) v* T+ y
m_pRecordset->MoveNext();///移到下一条记录
6 [+ J, c* X- M, \
}
* O) u$ R: j0 b8 _; A5 O* B6 x* r
m_pRecordset->MoveFirst();///移到首条记录
+ h) r& T9 W. B' x5 n: V
m_pRecordset->Delete(adAffectCurrent);///删除当前记录
7 ]( Z7 s% H) ^
///添加三条新记录并赋值
c: B: ~8 K" }: Q0 l+ s3 S
for(int i=0;i<3;i++)
& c$ _; E4 _7 w& X1 V, S
{
: C, O1 ?$ q1 j1 Z2 _3 F. Y0 Y2 i
m_pRecordset->AddNew();///添加新记录
+ x. C6 y6 H; X$ u/ Z
m_pRecordset->
utCollect("ID",_variant_t((long)(i+10)));
5 g- U4 f4 p, X, v3 x
m_pRecordset->
utCollect("username",_variant_t("叶利钦"));
) l& Q! m- l% o6 D' F
m_pRecordset->
utCollect("old",_variant_t((long)71));
( Y) ]) X% i8 T
m_pRecordset->
utCollect("birthday",_variant_t("1930-3-15"));
* e9 } ^; n* Z6 q
}
. I4 m, s! t( M: ?% V1 P9 q; o: j
m_pRecordset->Move(1,_variant_t((long)adBookmarkFirst));///从第一条记录往下移动一条记录,即移动到第二条记录处
5 Y' x8 R1 q7 n* F( C1 E" \% f ]
m_pRecordset->
utCollect(_variant_t("old"),_variant_t((long)45));///修改其年龄
+ w- S* S, E) U1 z! r3 Y# ?) w5 J
m_pRecordset->Update();///保存到库中
! R: N% ?, z0 p2 g
备注:多次查询可把查询过程做成一个函数ExecuteSQL让m_pRecordset获得连接指针m_pConnection查询结果
+ }$ H2 f) D- T4 }8 n4 f! E" b
void ExecuteSQL(_ConnectionPtr m_pConnection, _RecordsetPtr m_pRecordset,CString strSql)
7 r' i3 L0 }$ M
{
) u { [0 ]3 e: L- P) @6 f
//执行Select 语句
! g( K7 J$ b% \. V
BSTR bstrSQL = strSql.AllocSysString();
+ C( [' e: C- s5 x; f$ N6 `+ m
try
3 w) d+ r! d4 ~6 q W5 {
{
, P7 H3 E; U- p! ]$ u
m_pRecordset->Open(bstrSQL,(IDispatch*)m_pConnection,adOpenDynamic,adLockOptimistic,adCmdText);
7 E# Z& P m2 e) |" q5 v" ^
//adOpenDynamic:动态 adLockOptimistic乐观封锁法 adCmdText:文本查询语句
2 t R9 F, Z) H, S% K
}
# x8 x3 i- o* b g. o! F, _
catch(_com_error error)
. _2 U/ A! i1 i
{
9 ^7 v M9 B7 }0 V
CString errorMessage;
7 U' m3 U# e. M
errorMessage.format("%s",(LPTSTR)error.Description());
5 F* o3 ^7 y% x* u8 h
AfxMessageBox(errorMessage);
6 r. V2 R) @0 Q: d1 Y. u
}
' K1 Y# u) A1 l, W9 B2 I
}
4 _. z, J6 m$ t5 y) E: I
//出错处理:
8 K* n4 A$ H {/ I0 g V- m
3127——没有找到目标表
9 x3 ]. G, o! G6 |/ F9 [
3092——目标表已经存在
% u0 \3 a: W; ^6 T) x! z+ b: H$ [5 q
例如:
7 L6 S+ H' j/ j5 u" }* W6 P) {
catch(const _com_error e)
1 n! [# @9 K1 E
{
' t. J( U: b, R( s1 E
AfxMessageBox(e.Description());
6 q. Y+ D0 ~9 W( ~ g( P0 [' w
long errorCode=e.WCode();
. C# n n! b! Z0 Q8 w
if(3127==errorCode) AfxMessageBox("表不存在");
, v- X, [$ F+ R/ p) ]6 @0 y
if(3092==errorCode) AfxMessageBox("表已经存在");
3 J( ?+ T! M! J5 V9 c6 z
return FALSE;
' w u% _8 e6 y! a) p$ L* z- `
}
5 F4 b: J. t6 Z& q! A
6 I! \) h4 K0 V1 j
</TD></TR></TABLE>
作者:
wangyu249
时间:
2006-11-21 15:14
<p>不错</p>
欢迎光临 数学建模社区-数学中国 (http://www.madio.net/)
Powered by Discuz! X2.5