- 在线时间
- 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命令并取得结果记录集+ c+ w4 l- u3 c, ~' c; H
! b$ g$ g+ s ? Q2 a! y [! [! p& x
为了取得结果记录集,我们定义一个指向Recordset对象的指针:_RecordsetPtr m_pRecordset;0 y1 t! b% O x5 a
并为其创建Recordset对象的实例: m_pRecordset.CreateInstance("ADODB.Recordset");' x4 H6 d* j/ R' H" l" @
SQL命令的执行可以采用多种形式,下面我们一进行阐述。
: f- e5 H! G) T" n, H- R) r# P
' A6 @6 I- Y, n- } (1)利用Connection对象的Execute方法执行SQL命令9 }" I. t( h- @& w
# Z9 `$ }5 a" i# f, B+ X' m Execute方法的原型如下所示:
4 \: A8 l* U" A# a1 X# a# F- ?* I2 @' f/ w, K" i
_RecordsetPtr Connection15::Execute ( _bstr_t CommandText, VARIANT * RecordsAffected, long Options )
; s* c7 K3 b' k* I
6 u! S; P- Q- k4 w其中CommandText是命令字串,通常是SQL命令。
- Q, y# j) O4 w参数RecordsAffected是操作完成后所影响的行数, / g* D8 n: _4 }1 v9 m7 O; O0 O
参数Options表示CommandText中内容的类型,Options可以取如下值之一:
$ r8 h; t X9 t+ \5 @2 G& @6 {$ SadCmdText:表明CommandText是文本命令
& l3 A$ D+ k* z4 u1 x) HadCmdTable:表明CommandText是一个表名& x B) ~" S5 J: t i2 H
adCmdProc:表明CommandText是一个存储过程
" S( z3 v+ K/ KadCmdUnknown:未知9 ]9 ]# C3 u6 ?! i* s* R O
$ p- i) ~* a/ z) D- J" ^2 ZExecute执行完后返回一个指向记录集的指针,下面我们给出具体代码并作说明。
6 e/ C! y8 n# D7 w/ w$ u_variant_t RecordsAffected;
, z* H2 r! i( t1 g/ T$ E///执行SQL命令:CREATE TABLE创建表格users,users包含四个字段:整形ID,字符串username,整形old,日期型birthday+ ]) I/ E2 Z6 i$ c7 c# f
m_pConnection->Execute("CREATE TABLE users(ID INTEGER,username TEXT,old INTEGER,birthday DATETIME)",
) u5 L0 }. h4 A8 M" @* C&RecordsAffected,
6 @! X, ~8 Y3 j5 q! a! U# kadCmdText);" [3 y- K, |2 I" ^' e% g+ z
: ~+ l% ^" O2 R5 k9 N3 L$ p; @///往表格里面添加记录
* q$ M! H' |* b; y& Z1 j1 V Tm_pConnection->Execute("INSERT INTO users(ID,username,old,birthday) valueS (1, ''''Washington'''',25,''''1970/1/1'''')",&RecordsAffected,adCmdText);. X3 V4 Q) \3 h2 T' V$ O' k# T5 N0 ^
1 p5 A6 _7 D* q! _5 F
///将所有记录old字段的值加一7 O" c; N) ]6 I1 m( C, l4 l
m_pConnection->Execute("UPDATE users SET old = old+1",&RecordsAffected,adCmdText);; ? ^3 T$ X" a, j1 E
" [! t3 ^; ?! s' j$ _///执行SQL统计命令得到包含记录条数的记录集3 E+ |& b* y! Q( T z
m_pRecordset = m_pConnection->Execute("SELECT COUNT(*) FROM users",&RecordsAffected,adCmdText);
' o$ t: x3 {1 R1 V_variant_t vIndex = (long)0;
/ v* X- h) \5 u! w& x& |_variant_t vCount = m_pRecordset->GetCollect(vIndex);///取得第一个字段的值放入vCount变量; K5 \& |& P, ?! e
上两句可以写成— _variant_t vCount = m_pRecordset->GetCollect((_variant_t)((long)0));
4 N0 B% w9 J% V) N% B1 `m_pRecordset->Close();///关闭记录集
" T8 g0 j9 l0 fCString message;
3 |1 M: ?' v9 Q; b+ }) w3 v3 rmessage.format("共有%d条记录",vCount.lVal);+ ^6 }4 c! F1 W7 N
AfxMessageBox(message);///显示当前记录条数
6 S* O m* N8 Q! o' ]: N
( L) q* f: p/ z(2)利用Command对象来执行SQL命令
; V5 K+ g+ J/ Q! ?7 |6 y3 O: c$ _ `2 D1 t- j) {3 n: {2 e
_CommandPtr m_pCommand;
" A# `* C2 K8 K8 v& I+ m( p! lm_pCommand.CreateInstance("ADODB.Command");
: M" m/ [5 k5 a( l& I8 h) __variant_t vNULL;
% J; U4 _4 Q$ T9 u% }2 }vNULL.vt = VT_ERROR;5 M* J* Y+ w( s' Q/ j. ]/ Z
vNULL.scode = DISP_E_PARAMNOTFOUND;///定义为无参数) }: y4 z$ g0 I( P9 R: |/ S3 Z3 ?$ U
m_pCommand->ActiveConnection = m_pConnection;///非常关键的一句,将建立的连接赋值给它
& ^. K9 U" c- Q% G. mm_pCommand->CommandText = "SELECT * FROM users";///命令字串* [! D' @. d3 I
m_pRecordset = m_pCommand->Execute(&vNULL,&vNULL,adCmdText);///执行命令,取得记录集
" |7 B5 X, c, Z/ h" y
- I/ l& \9 R3 O7 Q4 Q- t; q: U# {- U0 W9 x 在这段代码中我们只是用Command对象来执行了SELECT查询语句,Command对象在进行存储过程的调用中能真正体现它的作用。下次我们将详细介绍。
$ g B: h, [4 r
) ]0 e5 }8 m; T4 Z& B8 P (3)直接用Recordset对象进行查询取得记录集( l" s& G" I' P
8 G* W, Z+ O' \( e: N* ]9 ] h& {. f' X
实例——
; Y2 i' ?* V5 D4 }/ D) N( H& _
: U; T) |, i! t, T+ {# uvoid CGmsaDlg::OnDBSelect()
$ f; @+ t5 e: b7 Q2 j3 M1 P{
9 \( }/ j! ]6 H// TOD Add your control notification handler code here
- x `6 n+ j+ Q1 d' ?8 |& O% @_RecordsetPtr Rs1; //定义Recordset对象
3 t0 v+ ^, F4 y! Z6 N+ i_bstr_t Connect("DSN=GMS;UID=sa WD=;");//定义连接字符串# ~9 ], J, p3 L% a8 Y0 e4 r) }
_bstr_t Source ("SELECT count(*) FROM buaa.mdb010"); //要执行的SQL语句- s; n) T+ v9 ?+ P1 {' u
::CoInitialize(NULL); //初始化Rs1对象
! G5 I: b. H/ O5 G2 K8 o1 G/ ^HRESUL hr = Rs1.CreateInstance( __uuidof( Recordset ) );9 O0 u+ M3 U! s
//省略对返回值hr的判断 ; C$ w6 A0 h/ e6 `3 U0 x* p" k
Rs1->Open( Source,
/ J* y. X; K3 U4 X3 F! |Connect,) Y5 p- c5 Q8 J1 h; x+ y5 _
adOpenForwardOnly,! Y- z; N3 e; i" m
adLockReadOnly,
& i9 U3 e- u- s-1 ); . R, i3 F0 _6 I8 m q
_variant_t temp=Rs1->GetCollect(_variant_t((long)0));
6 \: T% e& h( @0 H& e2 H6 \% ^4 z* VCString strTemp=(char* )(_bstr_t)temp;
' Y! Z* W U) {( N, lMessageBox("OK!"+strTemp);
' o7 ]) H9 h( |0 d, @}( W6 h O+ a3 F
, q' r+ M, b* N# \
例如
! [1 J! a7 |8 H# e7 w9 Dm_pRecordset->Open("SELECT * FROM users",0 F, c" C9 X1 X; S3 m
_variant_t((IDispatch *)m_pConnection,true),! B* i/ F0 L4 f$ r" ^
adOpenStatic,
3 q: p' P d8 Y. p% {: G6 ]adLockOptimistic,
9 ?1 Z: F: ^ s2 X. \" \5 WadCmdText);, m+ W1 M7 S% M1 U( k) G
% N- J9 {1 C, S2 i( p
Open方法的原型是这样的:
1 X. Z9 D9 S) u9 b4 N* I. @HRESULT Recordset15::Open ( const _variant_t & Source,
& L$ [+ O, Z q6 f# O8 I! Gconst _variant_t & ActiveConnection,
/ p4 ]2 x0 E$ B; ]/ c1 Cenum CursorTypeEnum CursorType, & ?' O- J7 H8 X! Y! f" I: w
enum LockTypeEnum LockType,
5 `+ w3 _, Z' `7 ?8 }7 rlong Options )
+ m$ ~) a* X+ q9 f: [9 D# L
% Y3 r; X& d8 x* I# k( ]* F其中:
) i* e# ^8 L4 g9 j. b% R3 r' \1 W4 k. M7 @, @: x! h
①Source是数据查询字符串* y& I' ^" j5 S) i
②ActiveConnection是已经建立好的连接(我们需要用Connection对象指针来构造一个_variant_t对象) m9 A$ k" }" V. F5 c6 i
③CursorType光标类型,它可以是以下值之一,请看这个枚举结构:
! b) ]. D1 D, h# `+ s4 p8 L" f& a5 S4 v. g1 G% M3 L
enum CursorTypeEnum
/ O+ A7 V4 I5 D$ W7 j) \{
' U4 L% [9 H! c8 I6 ~% j9 radOpenUnspecified = -1,///不作特别指定1 k3 O: F( \& e5 J/ e, \5 o
adOpenForwardOnly = 0,///前滚静态光标。这种光标只能向前浏览记录集,比如用MoveNext向前滚动,这种方式可以提高浏览速度。但诸如BookMark,RecordCount,AbsolutePosition,AbsolutePage都不能使用6 D" A4 F5 s; H* \7 m! {
adOpenKeyset = 1,///采用这种光标的记录集看不到其它用户的新增、删除操作,但对于更新原有记录的操作对你是可见的。9 m/ V3 I# {3 K
# r/ S5 _5 h+ Y& _adOpenDynamic = 2,///动态光标。所有数据库的操作都会立即在各用户记录集上反应出来。) b) V: p# x, ^% O% y& z& Q
adOpenStatic = 3///静态光标。它为你的记录集产生一个静态备份,但其它用户的新增、删除、更新操作对你的记录集来说是不可见的。1 S) X, a/ T N' j. f% `" ?2 a6 V
};+ b( Q# q( J K+ J V* U
④LockType锁定类型,它可以是以下值之一,请看如下枚举结构:
) o* ^0 g. x6 R2 i, a% h. ]/ t5 f$ s7 r; L( v ^$ ?0 r
enum LockTypeEnum+ e# D7 i8 I1 w+ \ I" }
{) r+ s- `1 n+ ~0 K: v6 c D" U( @
adLockUnspecified = -1,///未指定
+ q. g, `- f* L3 l2 N3 @adLockReadOnly = 1,///只读记录集
8 Z0 o1 P+ G) }' n' K1 r$ XadLockPessimistic = 2,悲观锁定方式。数据在更新时锁定其它所有动作,这是最安全的锁定机制; f- N( x1 u+ I
adLockOptimistic = 3,乐观锁定方式。只有在你调用Update方法时才锁定记录。在此之前仍然可以做数据的更新、插入、删除等动作
2 O- w3 s' |" IadLockBatchOptimistic = 4,乐观分批更新。编辑时记录不会锁定,更改、插入及删除是在批处理模式下完成。! b' Q. P1 v3 r& m
}; # m5 m; y; n3 Z) Q( u2 s7 s# m
7 q$ V5 Q. a7 o2 T⑤Options可以取如下值之一:; a. v* s+ |- e, p- J4 L. J Y
adCmdText:表明CommandText是文本命令( E7 F4 o0 x$ Q+ u
adCmdTable:表明CommandText是一个表名$ g0 f; O: s/ K' w3 A; S9 E" x) ]
adCmdProc:表明CommandText是一个存储过程4 k6 L9 Y) y5 e2 O% U! _' t
adCmdUnknown:未知 |
zan
|