QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 3538|回复: 0
打印 上一主题 下一主题

[转帖]在Visual C++中用ADO进行数据库编程(中)

[复制链接]
字体大小: 正常 放大
god        

206

主题

2

听众

882

积分

升级  70.5%

该用户从未签到

新人进步奖

跳转到指定楼层
1#
发表于 2005-3-30 22:53 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
4.执行SQL命令并取得结果记录集
& [9 A: f. E  R. `$ k  i+ {
. ~" w' @: |" q0 P  为了取得结果记录集,我们定义一个指向Recordset对象的指针:_RecordsetPtr m_pRecordset;9 p$ `; ~- t: k3 E3 U5 R
并为其创建Recordset对象的实例: m_pRecordset.CreateInstance("ADODB.Recordset");
& [3 ^& _8 p6 S: E; ?+ g( MSQL命令的执行可以采用多种形式,下面我们一进行阐述。) U) j; `# I, E0 S2 i8 y
5 Y# `$ R7 g% k
  (1)利用Connection对象的Execute方法执行SQL命令/ I) o8 x* k3 \' Y0 s- h9 O7 B

* B7 C8 w. G1 ^  Execute方法的原型如下所示:
' O. e& S7 y  {4 r+ N) R
7 q& L' I/ H2 [) e2 E4 m* o_RecordsetPtr Connection15::Execute ( _bstr_t CommandText, VARIANT * RecordsAffected, long Options ) 9 C  a7 D8 M+ i6 |) E! A4 X! J5 u7 v

' d, q. f$ q& P& l2 J  J; }8 [其中CommandText是命令字串,通常是SQL命令。
1 \3 o' @2 k1 N4 D- m% |参数RecordsAffected是操作完成后所影响的行数, . E: H# G4 r3 v
参数Options表示CommandText中内容的类型,Options可以取如下值之一:  v, ]; q- z7 M' t: t. w; g
adCmdText:表明CommandText是文本命令
" T% l; d1 r5 d' x; {$ A/ {adCmdTable:表明CommandText是一个表名
. S5 Z- a, E* L6 }adCmdProc:表明CommandText是一个存储过程* s5 S- y0 H/ |* G+ Z& D+ N
adCmdUnknown:未知% z+ z# b  [3 U2 }/ D3 c' ]: n2 g
! T8 M4 X- \+ ~9 x1 f
Execute执行完后返回一个指向记录集的指针,下面我们给出具体代码并作说明。
4 ^% c. {2 H  p7 P  }_variant_t RecordsAffected;7 ^/ \4 }8 c& N8 _) p$ H! N
///执行SQL命令:CREATE TABLE创建表格users,users包含四个字段:整形ID,字符串username,整形old,日期型birthday; b9 ]' Y# f8 S
m_pConnection->Execute("CREATE TABLE users(ID INTEGER,username TEXT,old INTEGER,birthday DATETIME)",
8 r* o) s8 m' H) ~7 ~% Z&RecordsAffected,
9 v( F* G* b) y( P3 w1 ]adCmdText);3 U+ B9 _% h" Q" B$ h" r. V

4 O) A9 \& C) i& Q" ]" {% B, F///往表格里面添加记录
6 f$ A# t; ^  l& H- [m_pConnection->Execute("INSERT INTO users(ID,username,old,birthday) valueS (1, ''''Washington'''',25,''''1970/1/1'''')",&RecordsAffected,adCmdText);
; J( G( w: t* Z
0 s# ~1 P) X( Z( F/ k///将所有记录old字段的值加一
4 v0 n# t6 \3 r* X+ S! `m_pConnection->Execute("UPDATE users SET old = old+1",&RecordsAffected,adCmdText);
# V2 I5 v+ y6 J1 C5 t
1 x9 z5 W1 o2 H9 q///执行SQL统计命令得到包含记录条数的记录集
2 ?% {; u4 u4 f: mm_pRecordset = m_pConnection->Execute("SELECT COUNT(*) FROM users",&RecordsAffected,adCmdText);
- z, B/ G7 ~3 F; n" a3 A0 D_variant_t vIndex = (long)0;
" N' |! z' m" X% B, F_variant_t vCount = m_pRecordset->GetCollect(vIndex);///取得第一个字段的值放入vCount变量! c6 j# L7 Z' ^, V
上两句可以写成— _variant_t vCount = m_pRecordset->GetCollect((_variant_t)((long)0));# _& X8 p. M4 T) |$ g
m_pRecordset->Close();///关闭记录集
- {! G; B* Y  sCString message;
6 i2 o- M& d; a- Y4 xmessage.format("共有%d条记录",vCount.lVal);' P4 X0 X: l3 ^! S
AfxMessageBox(message);///显示当前记录条数7 |( G& h7 K. P0 c% x9 O- x' \

- P. l2 O* d, O& Q7 w! l% U7 f(2)利用Command对象来执行SQL命令 4 v8 U4 W* y3 h. m

" x' T6 q! m0 U' ^9 u_CommandPtr m_pCommand;2 v9 {1 W$ Z# O' ?1 i7 |+ u6 w
m_pCommand.CreateInstance("ADODB.Command");
" @( t2 g; ~9 F8 w, ~_variant_t vNULL;
+ V$ ?* N9 S/ L2 R- m" gvNULL.vt = VT_ERROR;5 \- G& O6 I( U+ U. s
vNULL.scode = DISP_E_PARAMNOTFOUND;///定义为无参数! s* j7 t0 O5 b  `( }) _
m_pCommand->ActiveConnection = m_pConnection;///非常关键的一句,将建立的连接赋值给它1 P0 U. O1 k% ^
m_pCommand->CommandText = "SELECT * FROM users";///命令字串& F, ?5 a8 u3 R1 o
m_pRecordset = m_pCommand->Execute(&vNULL,&vNULL,adCmdText);///执行命令,取得记录集/ v7 F2 o! N2 T! A1 z" c

$ k2 v1 K; w' g+ V5 W  在这段代码中我们只是用Command对象来执行了SELECT查询语句,Command对象在进行存储过程的调用中能真正体现它的作用。下次我们将详细介绍。
. I# o' w% K1 ?' u+ u: a, ^: Z2 i! m% `4 `: }# s0 \
  (3)直接用Recordset对象进行查询取得记录集- k% V  P6 x$ ^$ d
" f" W9 W9 M8 W; v# O
  实例—— , p0 R' O7 V  ^0 N4 q) E$ }: x( {

* C* F! D/ P5 p" Q* r9 Xvoid CGmsaDlg::OnDBSelect()
9 [; K( V* E8 j8 d3 N& d5 T- T{
/ ~! s, E% O0 X" p! o( @8 i// TOD Add your control notification handler code here; W. V' z' j" x
_RecordsetPtr Rs1; //定义Recordset对象7 P$ a9 [' d4 k9 R7 Y  m& M
_bstr_t Connect("DSN=GMS;UID=saWD=;");//定义连接字符串
) ]' D$ L$ q2 @/ O- R# \' K! H_bstr_t Source ("SELECT count(*) FROM buaa.mdb010"); //要执行的SQL语句
& V. D; T* s+ v3 t; }: T/ ]9 ^. ~::CoInitialize(NULL); //初始化Rs1对象. W0 B# }! A6 o  P- x3 u3 R5 {( e
HRESUL hr = Rs1.CreateInstance( __uuidof( Recordset ) );$ n8 j( H! K' Q8 H
//省略对返回值hr的判断 " g0 @2 S6 ]( M8 N* V
Rs1->Open( Source,/ p# J. e; U7 t
Connect,5 X6 j+ l6 T- d. [& w
adOpenForwardOnly,
. a0 ?, z- e% a) y- Q! \adLockReadOnly,- E# Z5 Y8 D" a2 `4 @. C: I0 K
-1 ); , J! }$ L/ k/ `5 i# T
_variant_t temp=Rs1->GetCollect(_variant_t((long)0));
' L6 h9 t4 \' k  _4 JCString strTemp=(char* )(_bstr_t)temp;( x8 ~. {+ m8 Z, S# P
MessageBox("OK!"+strTemp);
9 G+ Y( w7 Y6 t. W/ z1 @: x}
/ d0 G2 {- X, f) L+ h: u6 X, i! c  z0 z" b) ~; W! |# }
例如
3 {) t- _1 x, r) S2 F/ dm_pRecordset->Open("SELECT * FROM users",
6 j/ H) _1 r; V_variant_t((IDispatch *)m_pConnection,true),
9 F4 l1 t' q/ V0 v+ BadOpenStatic," R+ o% `4 i! V- e
adLockOptimistic,
# g  S: R' u. Y8 H0 xadCmdText);
4 ]' H" r# [! B' P, c/ i+ y, O
& Q- \8 ], _5 ?' J( v0 y* MOpen方法的原型是这样的:
. c. [  E; J( }# LHRESULT Recordset15::Open ( const _variant_t & Source,
/ _- ^& f; W8 j# Aconst _variant_t & ActiveConnection,
/ _( N+ u! i) W- X3 Zenum CursorTypeEnum CursorType, 7 g# r" V# d' a" @
enum LockTypeEnum LockType,
' x  `1 S1 F9 _! ^0 \2 x! s, zlong Options )
$ `6 A  ]1 U- @: l* H8 F" s9 @& K; C  Q6 g
其中:
6 r& p2 @: ]$ M4 T
( |  y$ u7 {# V5 G- J6 i! d①Source是数据查询字符串
1 R' j: ~, R% R②ActiveConnection是已经建立好的连接(我们需要用Connection对象指针来构造一个_variant_t对象) 1 B6 \  S. ]3 D/ K* a
③CursorType光标类型,它可以是以下值之一,请看这个枚举结构:* d  g; f( B2 i

9 s6 X5 ~: |5 e8 V4 J% W* Denum CursorTypeEnum
) O' B1 u7 j5 X) w% S{: Z2 |" d: }; A5 {% e
adOpenUnspecified = -1,///不作特别指定
( \, h5 W- |1 r0 M5 d8 padOpenForwardOnly = 0,///前滚静态光标。这种光标只能向前浏览记录集,比如用MoveNext向前滚动,这种方式可以提高浏览速度。但诸如BookMark,RecordCount,AbsolutePosition,AbsolutePage都不能使用
# [( P8 F" F6 T/ radOpenKeyset = 1,///采用这种光标的记录集看不到其它用户的新增、删除操作,但对于更新原有记录的操作对你是可见的。) B; @6 ?8 ?. Z4 v+ ^* @5 e8 D4 ]: C8 Y

; S. W: n: S" i5 T/ SadOpenDynamic = 2,///动态光标。所有数据库的操作都会立即在各用户记录集上反应出来。
: H6 G, g! n, U" r& o7 V0 }adOpenStatic = 3///静态光标。它为你的记录集产生一个静态备份,但其它用户的新增、删除、更新操作对你的记录集来说是不可见的。6 Q. l+ b2 Y4 v- K! |
};
6 {2 T9 S3 R2 ?  o+ W④LockType锁定类型,它可以是以下值之一,请看如下枚举结构:
3 i' s9 f7 v0 ], i- b
7 k& M4 {/ s  c4 x% N. Oenum LockTypeEnum
! U/ C- }9 j1 `/ T9 q5 j8 {{
4 l9 Q7 g3 B  T0 s' UadLockUnspecified = -1,///未指定  }- p1 A% J5 M, E( _
adLockReadOnly = 1,///只读记录集
6 z$ U/ f7 I* ?) B9 p0 madLockPessimistic = 2,悲观锁定方式。数据在更新时锁定其它所有动作,这是最安全的锁定机制
7 E( t% R5 Q/ y4 ~5 h0 |adLockOptimistic = 3,乐观锁定方式。只有在你调用Update方法时才锁定记录。在此之前仍然可以做数据的更新、插入、删除等动作$ F# g- Q, Q' v* @( K9 f  o
adLockBatchOptimistic = 4,乐观分批更新。编辑时记录不会锁定,更改、插入及删除是在批处理模式下完成。  e. a5 S9 i3 S+ X8 q
};
4 L8 R/ c: i# @1 H: c
# R" o+ }+ {- v7 f6 m⑤Options可以取如下值之一:
" ^9 e1 E  t& s$ [. Z# \adCmdText:表明CommandText是文本命令
8 M% c/ y( r; t/ [adCmdTable:表明CommandText是一个表名* b" T  E, J7 }% E' b1 ?
adCmdProc:表明CommandText是一个存储过程
0 C$ d9 o1 F: L6 T# V! y2 _2 gadCmdUnknown:未知
zan
转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
如果我没给你翅膀,你要学会用理想去飞翔!!!
您需要登录后才可以回帖 登录 | 注册地址

qq
收缩
  • 电话咨询

  • 04714969085
fastpost

关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

手机版|Archiver| |繁體中文 手机客户端  

蒙公网安备 15010502000194号

Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

GMT+8, 2026-7-19 14:14 , Processed in 0.712602 second(s), 52 queries .

回顶部