- 在线时间
- 0 小时
- 最后登录
- 2007-11-12
- 注册时间
- 2004-12-24
- 听众数
- 2
- 收听数
- 0
- 能力
- 0 分
- 体力
- 2467 点
- 威望
- 0 点
- 阅读权限
- 50
- 积分
- 882
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 205
- 主题
- 206
- 精华
- 2
- 分享
- 0
- 好友
- 0
升级   70.5% 该用户从未签到
 |
4.执行SQL命令并取得结果记录集
6 R- H. f4 `- k: c$ n5 C
/ i O4 W d0 R! U 为了取得结果记录集,我们定义一个指向Recordset对象的指针:_RecordsetPtr m_pRecordset;* D& \, w. s, g( N1 f/ U
并为其创建Recordset对象的实例: m_pRecordset.CreateInstance("ADODB.Recordset");7 Y% k6 E! }8 G9 J& k: a7 H# b3 T
SQL命令的执行可以采用多种形式,下面我们一进行阐述。& ~) O, I9 X* g1 p" q+ [
5 K7 v" v2 e; i! M; B0 N# D (1)利用Connection对象的Execute方法执行SQL命令
( s# m$ n& [& r0 l- P
) V; z8 V: @& Y" `( K* R: V7 k0 T Execute方法的原型如下所示:; F( J& e0 m7 w+ h4 G
( O$ E$ V) p/ [( y/ X
_RecordsetPtr Connection15::Execute ( _bstr_t CommandText, VARIANT * RecordsAffected, long Options )
" a8 z$ C3 ]* |: [' \7 q8 I; {! l+ f+ ~7 V
其中CommandText是命令字串,通常是SQL命令。
7 C1 m) \# _: X( Y4 A3 `6 J参数RecordsAffected是操作完成后所影响的行数, 4 k0 J( q% j/ w, Y& c
参数Options表示CommandText中内容的类型,Options可以取如下值之一:. k( C3 B4 r9 R
adCmdText:表明CommandText是文本命令
c4 E3 M4 z& M8 X0 F$ jadCmdTable:表明CommandText是一个表名
. L# M/ o* b. t1 E4 ]adCmdProc:表明CommandText是一个存储过程7 ^* {2 L* X; t' {; x/ k
adCmdUnknown:未知4 w, @0 }' h' @7 ?
7 s: T! p+ ^0 XExecute执行完后返回一个指向记录集的指针,下面我们给出具体代码并作说明。
' {9 I4 V- o/ Q( M_variant_t RecordsAffected;3 E; [) K$ p& S3 @3 f$ @" A
///执行SQL命令:CREATE TABLE创建表格users,users包含四个字段:整形ID,字符串username,整形old,日期型birthday
# ~9 F' A; S: ]4 @+ I2 w5 J* J6 pm_pConnection->Execute("CREATE TABLE users(ID INTEGER,username TEXT,old INTEGER,birthday DATETIME)",
! B0 f3 t. n. ~1 z: P&RecordsAffected,
1 b% t' H# a+ |4 VadCmdText);
, j$ \) l1 C( E; }; V# r# E: W9 l D* Q/ J
///往表格里面添加记录
! X8 _6 d7 D- L( L# |; Mm_pConnection->Execute("INSERT INTO users(ID,username,old,birthday) valueS (1, ''''Washington'''',25,''''1970/1/1'''')",&RecordsAffected,adCmdText);# o* h. i+ ]2 H
! t. u% m/ z0 ]///将所有记录old字段的值加一
1 G* @! X/ c. x4 _m_pConnection->Execute("UPDATE users SET old = old+1",&RecordsAffected,adCmdText);
0 r H' K) |/ q4 v+ D. ?; H
1 \0 @+ |0 q T. ~, l4 P///执行SQL统计命令得到包含记录条数的记录集$ f) T! G1 k0 D9 b
m_pRecordset = m_pConnection->Execute("SELECT COUNT(*) FROM users",&RecordsAffected,adCmdText);- p6 u, H% a: c- `0 h
_variant_t vIndex = (long)0;
# j0 [6 O3 V- F" t# ~, p4 P_variant_t vCount = m_pRecordset->GetCollect(vIndex);///取得第一个字段的值放入vCount变量
# B7 l/ c" V; ` B; q; S# u h F上两句可以写成— _variant_t vCount = m_pRecordset->GetCollect((_variant_t)((long)0));1 h3 \, N3 V/ a% Y5 X5 p E a
m_pRecordset->Close();///关闭记录集
) g4 K/ }- ?* B0 X, w: YCString message;
3 e+ V/ P' k! t( lmessage.format("共有%d条记录",vCount.lVal); E( `- k4 {8 f. i& h# B2 |0 Q9 ]
AfxMessageBox(message);///显示当前记录条数
( u- v( I" N! C9 x0 v( C4 [ |$ G+ @$ i
(2)利用Command对象来执行SQL命令 - s; ^" K) t. x3 W! N
& N% O/ h% x' t_CommandPtr m_pCommand;
' |- w1 G4 W, U* r4 W3 o# l2 i7 jm_pCommand.CreateInstance("ADODB.Command");9 E5 X1 B% I3 c# Y# O" w
_variant_t vNULL;
: m% ]* {% \8 C9 \vNULL.vt = VT_ERROR;6 b2 c/ f+ v5 C
vNULL.scode = DISP_E_PARAMNOTFOUND;///定义为无参数
v& L7 P* j6 g6 E a/ s) e ?m_pCommand->ActiveConnection = m_pConnection;///非常关键的一句,将建立的连接赋值给它
$ g4 }8 G5 ^3 e/ Z4 tm_pCommand->CommandText = "SELECT * FROM users";///命令字串
: U" }- U. D! P/ |" ?m_pRecordset = m_pCommand->Execute(&vNULL,&vNULL,adCmdText);///执行命令,取得记录集4 g9 w! x+ s/ q4 N
4 ]1 }+ K% i0 b( O3 K( j 在这段代码中我们只是用Command对象来执行了SELECT查询语句,Command对象在进行存储过程的调用中能真正体现它的作用。下次我们将详细介绍。
+ y2 H- T! `: @$ L& E$ c' k
( y& m" N; E6 N9 k5 |+ J# H8 y (3)直接用Recordset对象进行查询取得记录集
2 G. c/ j: e: y1 S9 ?1 U
% |& ]4 m! z& S5 M' z 实例——
- B: k* e% C! _, J! Q1 Z2 o0 V% l/ L+ |" e& _
void CGmsaDlg::OnDBSelect()
% V- i8 @/ `4 s{
3 f5 \) \% ^. }3 l% {* n// TOD Add your control notification handler code here
' j5 B$ L( d5 b5 G. }+ m_RecordsetPtr Rs1; //定义Recordset对象
& o4 s3 q/ I1 v" I" ]. b4 }_bstr_t Connect("DSN=GMS;UID=sa WD=;");//定义连接字符串
. R$ O! O, g: q u* Y_bstr_t Source ("SELECT count(*) FROM buaa.mdb010"); //要执行的SQL语句: J6 j z& ^ h
::CoInitialize(NULL); //初始化Rs1对象
3 v+ Q* u3 G6 G0 C; rHRESUL hr = Rs1.CreateInstance( __uuidof( Recordset ) );4 N; q/ G- }- U
//省略对返回值hr的判断 ; P" x2 i0 Z7 t4 X/ L8 s
Rs1->Open( Source,
+ b5 i. ?# d7 O) D2 I1 iConnect,
0 W: K* V# l# Z: ^; tadOpenForwardOnly,* l3 E* X6 n6 t8 o r3 Q' B. W' o- t
adLockReadOnly,
4 W; }( K' o* z+ S2 d# j! _-1 ); 7 G; U% P7 P4 p9 G! m
_variant_t temp=Rs1->GetCollect(_variant_t((long)0));
8 a$ G( y1 F$ u- qCString strTemp=(char* )(_bstr_t)temp;
( n' n8 L3 v5 m5 xMessageBox("OK!"+strTemp);
+ _' O8 C/ d: O* N3 A7 q1 ?5 z}
/ w1 o6 v) `* h" N0 ~, s
9 y6 g( j+ d8 N( z$ d例如
6 [/ j1 Y# d) q/ Tm_pRecordset->Open("SELECT * FROM users",# v2 k$ @" \0 f2 Z* c8 c) b
_variant_t((IDispatch *)m_pConnection,true),
! j" X9 m" e; N9 b0 G" Q6 S; radOpenStatic,9 y- u" E) G; `' D$ E9 X
adLockOptimistic,: q8 s y) q4 g& e) @( ? g
adCmdText);1 z" Q. W& G! `1 ^- C5 R( L+ u( R( o4 @4 e
# w8 n/ n4 f+ p
Open方法的原型是这样的:
# F1 F E& o, B) b) V6 _" OHRESULT Recordset15::Open ( const _variant_t & Source,
7 n" i% X( i; B7 J! tconst _variant_t & ActiveConnection,
5 G; K5 ~* d% A3 M. u6 [' Cenum CursorTypeEnum CursorType,
$ g9 {' O o- K, e) J8 c9 renum LockTypeEnum LockType, ; ~/ O) _2 z, A2 b
long Options ) + L& L: J1 d, n
' h/ W) B$ K& r8 D
其中:' N6 s+ h( E! ~1 Z0 }' U: k1 u
+ |3 l/ R& ~, p; u# }8 k M①Source是数据查询字符串+ S8 ~" M2 d0 t! s2 ?6 m
②ActiveConnection是已经建立好的连接(我们需要用Connection对象指针来构造一个_variant_t对象) " s( q1 {7 |6 l4 n- D: Q
③CursorType光标类型,它可以是以下值之一,请看这个枚举结构:. x9 P3 E6 u z9 g1 O; I
! ]$ y# x/ A( s4 W
enum CursorTypeEnum/ h; |# c: l' Z; h
{" Y, N9 k( ` l8 S2 f1 G" j3 T
adOpenUnspecified = -1,///不作特别指定
1 y. ?# {: J! u9 {adOpenForwardOnly = 0,///前滚静态光标。这种光标只能向前浏览记录集,比如用MoveNext向前滚动,这种方式可以提高浏览速度。但诸如BookMark,RecordCount,AbsolutePosition,AbsolutePage都不能使用" b# b$ Z6 e" m! O0 L5 E
adOpenKeyset = 1,///采用这种光标的记录集看不到其它用户的新增、删除操作,但对于更新原有记录的操作对你是可见的。
! H3 d& d3 K( n" i0 M$ J, r% x* L% o' L
adOpenDynamic = 2,///动态光标。所有数据库的操作都会立即在各用户记录集上反应出来。
1 D! c; u3 K& t2 m4 {adOpenStatic = 3///静态光标。它为你的记录集产生一个静态备份,但其它用户的新增、删除、更新操作对你的记录集来说是不可见的。
1 f+ H9 \2 a# ]7 U: _1 `! c4 P4 j};
" K: r- R! ?' L④LockType锁定类型,它可以是以下值之一,请看如下枚举结构:
/ T# j8 \) Q3 U1 j0 n3 z" s
7 [& }9 t7 K3 K( d* g0 F, R* zenum LockTypeEnum
9 e, q0 b5 G/ ]{: H. p" [8 o$ m8 y5 {. Q" i
adLockUnspecified = -1,///未指定
, k' ]& |$ q+ g& nadLockReadOnly = 1,///只读记录集) S$ [) @" O: s) g3 _) X0 _6 N
adLockPessimistic = 2,悲观锁定方式。数据在更新时锁定其它所有动作,这是最安全的锁定机制* `+ e$ O$ }( y2 @# n; {
adLockOptimistic = 3,乐观锁定方式。只有在你调用Update方法时才锁定记录。在此之前仍然可以做数据的更新、插入、删除等动作
* E$ w& m4 [8 l2 ^$ P1 z3 radLockBatchOptimistic = 4,乐观分批更新。编辑时记录不会锁定,更改、插入及删除是在批处理模式下完成。
* \3 @' J7 a5 W" O9 M1 T& q};
; [ L; q C/ ?- x% F/ k
' ^3 L: a8 s9 u4 H0 R- i⑤Options可以取如下值之一:) o/ @. Y9 j, C/ a4 A: R" w' r
adCmdText:表明CommandText是文本命令) r7 X8 D n& x
adCmdTable:表明CommandText是一个表名# s7 ^ _& E+ |/ O, J. Q3 r- ]
adCmdProc:表明CommandText是一个存储过程. V: m+ f& z1 {, C
adCmdUnknown:未知 |
zan
|