- 在线时间
- 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命令并取得结果记录集: K2 L, B0 j5 K5 L: d5 _
( t6 h( n1 r1 z5 k0 v( ]/ X
为了取得结果记录集,我们定义一个指向Recordset对象的指针:_RecordsetPtr m_pRecordset;
! Z2 I6 o& O0 _9 ]( S) w并为其创建Recordset对象的实例: m_pRecordset.CreateInstance("ADODB.Recordset");
- {- I$ Y1 ?# {; c$ W, q& RSQL命令的执行可以采用多种形式,下面我们一进行阐述。
5 L" X0 x/ }( Z5 j2 Z4 w6 N0 Y4 o; W
4 ~; Q; Y4 \+ o+ v) M2 `; ` (1)利用Connection对象的Execute方法执行SQL命令; N- T/ \1 O4 k, F4 N$ ?
0 K4 ]/ k( O# [5 f Execute方法的原型如下所示:
2 n% I, r, b# @; V+ y$ K
5 A. j0 N2 y! g' h0 Z: l, L0 k_RecordsetPtr Connection15::Execute ( _bstr_t CommandText, VARIANT * RecordsAffected, long Options )
6 h9 q2 w5 C1 ^9 q
e" X! b, S. Z) J, x6 S4 H* w其中CommandText是命令字串,通常是SQL命令。
$ ? ^4 f: y) {* M$ ^6 ` ]参数RecordsAffected是操作完成后所影响的行数, 2 d# N3 H' t3 i9 J% j# n9 [0 W
参数Options表示CommandText中内容的类型,Options可以取如下值之一:
4 i& e2 V0 I9 V3 l. E* NadCmdText:表明CommandText是文本命令7 j2 |8 r( K7 {( F( _
adCmdTable:表明CommandText是一个表名4 ?/ w) H6 T0 Q `) M) N
adCmdProc:表明CommandText是一个存储过程
2 c7 O( a% M- H8 f* iadCmdUnknown:未知
1 v( g$ \7 R; @& ]( w* L# R6 E% V7 T' [: M) f; J6 z5 M, ~; k) C
Execute执行完后返回一个指向记录集的指针,下面我们给出具体代码并作说明。
( @& v, @# S2 s9 D2 L( c_variant_t RecordsAffected;
6 T' Q6 p/ d- r///执行SQL命令:CREATE TABLE创建表格users,users包含四个字段:整形ID,字符串username,整形old,日期型birthday9 \6 g5 [! f' p6 z; t/ i: K+ D+ J
m_pConnection->Execute("CREATE TABLE users(ID INTEGER,username TEXT,old INTEGER,birthday DATETIME)",
& G; Z' l6 ?+ T; D1 L&RecordsAffected,) s4 x; Q" X4 a! i4 F
adCmdText);- m( w- q5 x) F$ N. s/ d
4 i: W0 Y' F* D6 y# N2 K( ]9 s
///往表格里面添加记录
. |. W- ]$ s( A) om_pConnection->Execute("INSERT INTO users(ID,username,old,birthday) valueS (1, ''''Washington'''',25,''''1970/1/1'''')",&RecordsAffected,adCmdText);7 J( D! v4 j9 u! U
6 Z6 a' Z6 T/ ?9 a
///将所有记录old字段的值加一
" u- |* v4 m- G sm_pConnection->Execute("UPDATE users SET old = old+1",&RecordsAffected,adCmdText);
I- `# V9 e) w5 b, _. k. b: Q% ~6 m# U& H
///执行SQL统计命令得到包含记录条数的记录集
5 C: I6 g: Y$ P3 {. Xm_pRecordset = m_pConnection->Execute("SELECT COUNT(*) FROM users",&RecordsAffected,adCmdText);
, H$ z% |$ ?3 \% W_variant_t vIndex = (long)0;) S7 u6 r0 k* X/ X2 \. {! t
_variant_t vCount = m_pRecordset->GetCollect(vIndex);///取得第一个字段的值放入vCount变量
5 @) L" X" D3 K- v q& L% E上两句可以写成— _variant_t vCount = m_pRecordset->GetCollect((_variant_t)((long)0));
9 m0 r, J4 W* R) nm_pRecordset->Close();///关闭记录集
) y( M9 f* g3 O/ f6 ICString message;6 O9 W; \% G$ ~
message.format("共有%d条记录",vCount.lVal);
$ u; s0 v$ P; X. f$ u9 @# ~7 _, CAfxMessageBox(message);///显示当前记录条数6 k6 V# R% C! L) J" y6 Q- ~3 }- c
* M9 n2 Q( F1 Z2 y1 h(2)利用Command对象来执行SQL命令 # {% [9 @7 \7 t: f
5 @! F0 v6 Y" o; O1 ]7 s) e_CommandPtr m_pCommand;1 \7 X4 ^5 e& v! X
m_pCommand.CreateInstance("ADODB.Command");
% a7 `. p( {! ?0 x; i& G4 n% v& a! {_variant_t vNULL;
7 j1 k, u6 o+ n( k; @% a+ bvNULL.vt = VT_ERROR;% t; h2 {: [. J( w# T) B- q9 R
vNULL.scode = DISP_E_PARAMNOTFOUND;///定义为无参数; j: x: c1 D8 X$ B3 T
m_pCommand->ActiveConnection = m_pConnection;///非常关键的一句,将建立的连接赋值给它
- U" g) q, A" u' [7 Q7 am_pCommand->CommandText = "SELECT * FROM users";///命令字串
8 k; ]) j# A! `. E, Km_pRecordset = m_pCommand->Execute(&vNULL,&vNULL,adCmdText);///执行命令,取得记录集
1 Q, J2 u5 E3 h. i9 i" E+ v
o( G, n5 w4 T3 U6 x 在这段代码中我们只是用Command对象来执行了SELECT查询语句,Command对象在进行存储过程的调用中能真正体现它的作用。下次我们将详细介绍。 2 y, S2 z) M; ]1 n. o7 y
2 {# N5 `9 y5 ^. m4 f# o# b
(3)直接用Recordset对象进行查询取得记录集
( H, I# g) [* D9 a
* u& Q5 U3 ]0 U2 b; ~2 L 实例——
( I7 E: Q# {; m2 ?. Q0 D$ [) |' O
void CGmsaDlg::OnDBSelect()
/ N3 ~% K- m7 C$ Q{
K( z8 \1 D$ g7 o" h$ E7 `: w% x// TOD Add your control notification handler code here) L0 ^8 v% R1 f- t5 `7 t% z
_RecordsetPtr Rs1; //定义Recordset对象 [0 S* L( d0 b3 l
_bstr_t Connect("DSN=GMS;UID=sa WD=;");//定义连接字符串9 d! B' D) J1 M6 A0 f
_bstr_t Source ("SELECT count(*) FROM buaa.mdb010"); //要执行的SQL语句( l- ? n- H+ @2 S
::CoInitialize(NULL); //初始化Rs1对象
- s9 X) u/ m) |0 H6 n0 LHRESUL hr = Rs1.CreateInstance( __uuidof( Recordset ) );% T( \; R3 v: k" s0 Z
//省略对返回值hr的判断 0 N1 ^: I/ Q, s
Rs1->Open( Source,
5 Y) e* K: G( c+ t9 w; AConnect,+ Y6 p( t, N( f% Z
adOpenForwardOnly,/ z7 ^% K5 J7 R7 r4 ]9 f
adLockReadOnly,
: g4 r( ^5 P9 R# b8 y \-1 );
2 z4 x9 R% K' D5 k_variant_t temp=Rs1->GetCollect(_variant_t((long)0));8 {8 d4 C8 ?, R- Q% a3 e
CString strTemp=(char* )(_bstr_t)temp;0 k( d, H- {( l7 v: p! M* D* r
MessageBox("OK!"+strTemp);
; i9 [( c- h3 }2 R9 d) r- g}
7 z- J [- c# D3 n0 q9 w
! |( M2 j; y! m0 V: _/ e; h$ B例如
& n( n. ~, R, Q' M* ^m_pRecordset->Open("SELECT * FROM users",
! o- m9 @; E$ ]_variant_t((IDispatch *)m_pConnection,true), D2 m1 J8 b" |3 H2 @' p+ d
adOpenStatic,
" ]/ f" ~& \' @' d" M, padLockOptimistic,
7 ^) B7 Q2 J* ~- S/ L6 SadCmdText);& C; h3 e' l; i, D& _! j
& z" n1 O( P4 _& OOpen方法的原型是这样的:+ l: Q" i6 Z- q
HRESULT Recordset15::Open ( const _variant_t & Source,
7 ~$ j3 u7 }" _ |# Dconst _variant_t & ActiveConnection, 2 ?- w- Z* S; |/ q: H
enum CursorTypeEnum CursorType, 3 x# f' d! N+ ~$ p; U* u
enum LockTypeEnum LockType,
* k% _( U! {+ g' U6 ^/ L# Flong Options )
4 |! c- b9 O' C4 m; X" Z! o, k
8 e* Q) |- s, a其中:
( R+ H1 B' V+ t) h& W; e& z. E. \. H Y7 Q; A
①Source是数据查询字符串" f( b+ G+ X9 v( B
②ActiveConnection是已经建立好的连接(我们需要用Connection对象指针来构造一个_variant_t对象)
& r, o1 X- x; ?; u9 r7 D③CursorType光标类型,它可以是以下值之一,请看这个枚举结构:1 v9 c% [- _) f) h2 c
/ i- Z7 N& J) s; r# s" F s' {: ~enum CursorTypeEnum% o } {9 S+ C3 t/ z# ^7 n
{5 ~1 J% Y1 h) M. W2 R! R
adOpenUnspecified = -1,///不作特别指定
4 Z: i1 O5 M8 jadOpenForwardOnly = 0,///前滚静态光标。这种光标只能向前浏览记录集,比如用MoveNext向前滚动,这种方式可以提高浏览速度。但诸如BookMark,RecordCount,AbsolutePosition,AbsolutePage都不能使用
, F4 D1 C6 f: e s# N- v r' ^adOpenKeyset = 1,///采用这种光标的记录集看不到其它用户的新增、删除操作,但对于更新原有记录的操作对你是可见的。
. A+ x$ \% }; T! r
3 F8 I, a) x3 AadOpenDynamic = 2,///动态光标。所有数据库的操作都会立即在各用户记录集上反应出来。( U( p. C2 U2 |3 y$ r2 L
adOpenStatic = 3///静态光标。它为你的记录集产生一个静态备份,但其它用户的新增、删除、更新操作对你的记录集来说是不可见的。
$ {( y F# E' }};
7 R) t' l( D& Y$ V' T④LockType锁定类型,它可以是以下值之一,请看如下枚举结构:
! |" _0 ] e8 q( V0 t- d/ D4 p8 Y
enum LockTypeEnum
0 H' N) X$ b/ ]3 w{
% c3 |9 h) L9 o- H4 c$ r PadLockUnspecified = -1,///未指定
! d0 ^; [' r: ^8 oadLockReadOnly = 1,///只读记录集' U: q' S7 l% a' I) B
adLockPessimistic = 2,悲观锁定方式。数据在更新时锁定其它所有动作,这是最安全的锁定机制
/ x! N* G( i+ [2 L9 A# l; uadLockOptimistic = 3,乐观锁定方式。只有在你调用Update方法时才锁定记录。在此之前仍然可以做数据的更新、插入、删除等动作" Q8 ?: k+ @) U3 J7 W
adLockBatchOptimistic = 4,乐观分批更新。编辑时记录不会锁定,更改、插入及删除是在批处理模式下完成。
) l h4 r1 b% ?8 h};
# ^# h; U$ f' k8 b6 n+ T) h8 A' L* ~! ]( P
⑤Options可以取如下值之一:
4 t& D" W5 P: ~: |0 v/ RadCmdText:表明CommandText是文本命令
! h; c Y4 s, \ N4 q8 n4 f) tadCmdTable:表明CommandText是一个表名. n7 |5 x4 f h. G/ e
adCmdProc:表明CommandText是一个存储过程# s5 h1 |& }) y7 ]3 l b, C
adCmdUnknown:未知 |
zan
|