- 在线时间
- 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命令并取得结果记录集
2 _- t) o1 W9 @5 C% T2 P& ~7 {9 A& j9 f
为了取得结果记录集,我们定义一个指向Recordset对象的指针:_RecordsetPtr m_pRecordset;
! S& x! ]0 q: J% X) L2 N) D% Z, C% r) @并为其创建Recordset对象的实例: m_pRecordset.CreateInstance("ADODB.Recordset");% [! e4 p( [4 W3 R
SQL命令的执行可以采用多种形式,下面我们一进行阐述。: Q/ r8 r0 M8 w# F/ _
$ C8 a" s! K- e1 ^. ]; k7 Y
(1)利用Connection对象的Execute方法执行SQL命令- h7 b) f8 N$ R
9 a) {9 e6 P5 J
Execute方法的原型如下所示:" Z w: T# q# Z9 q* L2 Y! e. m
8 C' H/ l& C" n( w: d) W
_RecordsetPtr Connection15::Execute ( _bstr_t CommandText, VARIANT * RecordsAffected, long Options )
7 _6 p5 g: e- z% n9 y5 ^1 N' c1 [ R: H# |+ I8 |! R
其中CommandText是命令字串,通常是SQL命令。
" p+ j, |' | H7 ]1 l- \# Q' h# N7 n8 f参数RecordsAffected是操作完成后所影响的行数, $ ~! m5 U! k6 e0 e
参数Options表示CommandText中内容的类型,Options可以取如下值之一:/ ^$ d. U9 R# b, L! Y& _8 Z) g) X" [
adCmdText:表明CommandText是文本命令2 U r# i& r- O' ?( @
adCmdTable:表明CommandText是一个表名3 l7 u6 Z* t0 @* \+ v! U- L
adCmdProc:表明CommandText是一个存储过程0 o. Q& D$ ^0 V( k4 f
adCmdUnknown:未知
3 p( W# P1 I1 e
6 V# L$ p K* L1 F2 \' h @, f. ^4 qExecute执行完后返回一个指向记录集的指针,下面我们给出具体代码并作说明。
2 R! f* t0 c( K# }_variant_t RecordsAffected;9 ?% E8 V7 D$ K' T' ~
///执行SQL命令:CREATE TABLE创建表格users,users包含四个字段:整形ID,字符串username,整形old,日期型birthday
) M2 \ d# t3 R* d% dm_pConnection->Execute("CREATE TABLE users(ID INTEGER,username TEXT,old INTEGER,birthday DATETIME)",
$ J/ [/ t/ _# j' I" ^6 ?' t&RecordsAffected,9 N2 o5 `: [! t1 T4 G. x, O1 s
adCmdText);) y p. ~, a, z" E. m
- U: D; }- Y" {: ^+ ^3 ^///往表格里面添加记录& _6 d% Z. \1 p2 f' N T
m_pConnection->Execute("INSERT INTO users(ID,username,old,birthday) valueS (1, ''''Washington'''',25,''''1970/1/1'''')",&RecordsAffected,adCmdText);# o v( `% B$ X
H- z/ }$ p2 _- I! A& P
///将所有记录old字段的值加一
" C& y# \4 k# L; zm_pConnection->Execute("UPDATE users SET old = old+1",&RecordsAffected,adCmdText);$ _+ @" U( D9 t4 b9 [$ m9 {4 O
. F; n0 \- i' J) ?3 d
///执行SQL统计命令得到包含记录条数的记录集
& Q/ ]4 n. N& [0 F9 x, |m_pRecordset = m_pConnection->Execute("SELECT COUNT(*) FROM users",&RecordsAffected,adCmdText);% u" w O7 Z7 T& r* a2 V
_variant_t vIndex = (long)0;
! g( P1 ^8 q$ U. F2 h4 c, J0 n_variant_t vCount = m_pRecordset->GetCollect(vIndex);///取得第一个字段的值放入vCount变量
& G2 L. a5 H7 ?$ `8 @9 I& V上两句可以写成— _variant_t vCount = m_pRecordset->GetCollect((_variant_t)((long)0));* E: a. F& l5 j; p' r" Q
m_pRecordset->Close();///关闭记录集2 L: \$ D$ M" v, |" l
CString message;; B- Y6 Q# |3 j% E: S4 M
message.format("共有%d条记录",vCount.lVal);
' l) C3 n9 w3 \9 a4 bAfxMessageBox(message);///显示当前记录条数
5 v9 T; f! a% @ Q* W7 ~6 @/ w1 y0 {
7 f3 n' ~" c6 Z8 M, C0 T(2)利用Command对象来执行SQL命令 0 ^/ ~- j: G( |" U# h% F+ v# P
4 Q$ [' p; ~5 P5 i2 f# E5 D
_CommandPtr m_pCommand;$ T$ f- Z1 M0 U( N" i) t1 j
m_pCommand.CreateInstance("ADODB.Command");
# c: G g+ I- L- M+ }' B: z9 F9 x_variant_t vNULL;7 x) o. f: r( c# b, ~) a8 T
vNULL.vt = VT_ERROR;
7 ]% l. X# e& R5 c" Y7 QvNULL.scode = DISP_E_PARAMNOTFOUND;///定义为无参数8 u( e+ \9 \ j2 Z8 }
m_pCommand->ActiveConnection = m_pConnection;///非常关键的一句,将建立的连接赋值给它
0 G3 ~& F. v+ C$ ~0 Jm_pCommand->CommandText = "SELECT * FROM users";///命令字串
, a' s3 I- z9 {8 Z* A6 n6 \% |1 Cm_pRecordset = m_pCommand->Execute(&vNULL,&vNULL,adCmdText);///执行命令,取得记录集
! H* U7 H. x7 ~0 e I1 @+ }
+ }6 X" ?; }% H' u, U 在这段代码中我们只是用Command对象来执行了SELECT查询语句,Command对象在进行存储过程的调用中能真正体现它的作用。下次我们将详细介绍。
% l2 ^6 U9 ^0 l, e6 M9 l$ F# _/ w. N+ G8 O
(3)直接用Recordset对象进行查询取得记录集% |( ^% X. _' \) z
% {' P+ i5 K5 G7 O, p4 {9 g 实例——
5 }! O U* _, W0 Y1 @, I5 \! _' H5 N' M/ r$ d
void CGmsaDlg::OnDBSelect()
. i a2 I2 R% g{
* r6 `6 l4 S! L% i* P- {) b// TOD Add your control notification handler code here( k# ]0 s m7 v$ G& B" R
_RecordsetPtr Rs1; //定义Recordset对象
a9 U0 _7 ~" ]7 t7 i_bstr_t Connect("DSN=GMS;UID=sa WD=;");//定义连接字符串# C% n) N# z" J S/ N) `2 A3 n
_bstr_t Source ("SELECT count(*) FROM buaa.mdb010"); //要执行的SQL语句$ y& j ^7 M; }1 c/ X% P) ]6 C5 `
::CoInitialize(NULL); //初始化Rs1对象
" ~' f5 f& o$ i/ d7 t7 N2 S9 x; y, SHRESUL hr = Rs1.CreateInstance( __uuidof( Recordset ) );9 q2 h+ P+ `0 e% L) e
//省略对返回值hr的判断 1 O @! p2 v" G& F
Rs1->Open( Source,
6 V) }* J# h- r |4 x7 oConnect,
! q6 j7 l* L" j3 u3 gadOpenForwardOnly,
0 a' h4 T: a C% DadLockReadOnly,# C% f n/ I8 l# v+ I- A. k- Z
-1 );
' [7 x( l0 H4 Y8 N$ H_variant_t temp=Rs1->GetCollect(_variant_t((long)0));* O4 P0 u, r% a3 [
CString strTemp=(char* )(_bstr_t)temp;: J. r2 z$ q" e/ B* H
MessageBox("OK!"+strTemp); t. ]; j3 \. d9 I
}
; e2 f: q& I4 j9 L/ [( ?
$ Q9 S) m# ?8 R2 A( D$ Y例如 # K |/ M# ]5 l: d" \+ A3 D
m_pRecordset->Open("SELECT * FROM users",
/ i5 G0 Y$ Q3 M) K_variant_t((IDispatch *)m_pConnection,true),
7 T5 B( I$ ]; r7 W7 V0 X& {adOpenStatic,/ ^' F, q8 \: v. f! [
adLockOptimistic,& H$ M2 Z: T/ P
adCmdText);' K% Y. e$ ?: c9 M7 F2 I5 p
/ e+ Z" r2 R3 n7 H/ Y4 ?
Open方法的原型是这样的:
, J. G$ r, V$ B3 E/ `' \! JHRESULT Recordset15::Open ( const _variant_t & Source, * @0 }9 V+ ?+ K/ K( f
const _variant_t & ActiveConnection,
7 H* w/ T6 W6 Uenum CursorTypeEnum CursorType,
* g* S6 z% t; ~7 ?: ]- D3 Fenum LockTypeEnum LockType, , a8 L, V1 _. ]9 u
long Options ) ' q/ s, q/ i* u8 k0 O3 E0 E2 ]
' A$ W2 F8 n! h" u7 _
其中:
1 }: g3 k- u# ]" p: p3 @
4 r T, J- {3 G! |①Source是数据查询字符串8 J$ U/ t7 `% w+ g; W& \
②ActiveConnection是已经建立好的连接(我们需要用Connection对象指针来构造一个_variant_t对象)
% U+ S) T& g% ~" x# E% B③CursorType光标类型,它可以是以下值之一,请看这个枚举结构:
: v9 S: h0 o8 k
% ?! T4 n6 j8 q, t' f" e3 T3 genum CursorTypeEnum+ U) ~; U1 j+ ^" ^+ t1 t/ ]
{
" @ E$ \: ~0 u4 m2 uadOpenUnspecified = -1,///不作特别指定
7 O* s' V6 N) q K; S" L$ RadOpenForwardOnly = 0,///前滚静态光标。这种光标只能向前浏览记录集,比如用MoveNext向前滚动,这种方式可以提高浏览速度。但诸如BookMark,RecordCount,AbsolutePosition,AbsolutePage都不能使用8 D' ^$ R' B9 x1 N) i
adOpenKeyset = 1,///采用这种光标的记录集看不到其它用户的新增、删除操作,但对于更新原有记录的操作对你是可见的。
/ l- _& [" y7 z9 z% [8 n0 |# o% g+ r6 e( W+ L3 O7 Z( \
adOpenDynamic = 2,///动态光标。所有数据库的操作都会立即在各用户记录集上反应出来。
L; i' ~9 B/ S) a `& g# \5 radOpenStatic = 3///静态光标。它为你的记录集产生一个静态备份,但其它用户的新增、删除、更新操作对你的记录集来说是不可见的。
h2 @0 Q H% N};
5 {$ n, r. v3 H T& D5 Y④LockType锁定类型,它可以是以下值之一,请看如下枚举结构:# `1 E/ G, M Z2 {; U( s k
! A# R* N3 T# J0 i# d2 B
enum LockTypeEnum
% Z/ a# A5 @5 _{
6 X$ [+ C4 b& {) e) m+ v) U( x- c! uadLockUnspecified = -1,///未指定
- k% N9 x+ j. madLockReadOnly = 1,///只读记录集; [" Y5 q+ f3 k6 p, p
adLockPessimistic = 2,悲观锁定方式。数据在更新时锁定其它所有动作,这是最安全的锁定机制) n/ X9 T9 ?5 K8 d+ Q) l
adLockOptimistic = 3,乐观锁定方式。只有在你调用Update方法时才锁定记录。在此之前仍然可以做数据的更新、插入、删除等动作) z/ K* G, n6 O; g1 U3 I9 s9 P
adLockBatchOptimistic = 4,乐观分批更新。编辑时记录不会锁定,更改、插入及删除是在批处理模式下完成。, l/ c6 K* ~8 y4 ]4 J& u/ }
};
; x- y- c' k5 S6 A$ A' ?
; \3 _7 Q; f9 q9 q5 l3 b⑤Options可以取如下值之一:0 s2 K0 c1 {7 e' k
adCmdText:表明CommandText是文本命令
8 p1 c# k' S9 E; yadCmdTable:表明CommandText是一个表名
0 S' q' r8 w* T# J& C- oadCmdProc:表明CommandText是一个存储过程 H1 n6 C( }8 g x- ] n' E+ \& w
adCmdUnknown:未知 |
zan
|