- 在线时间
- 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命令并取得结果记录集4 r4 V, W# h3 n3 z( \
3 C6 A! i$ [$ ]0 \ 为了取得结果记录集,我们定义一个指向Recordset对象的指针:_RecordsetPtr m_pRecordset;2 w R+ u6 H: i: t3 R t' V
并为其创建Recordset对象的实例: m_pRecordset.CreateInstance("ADODB.Recordset");
- E" f& Q0 G, `, u/ N+ KSQL命令的执行可以采用多种形式,下面我们一进行阐述。! @, b0 c D q5 T, j2 j
. q9 a. }& G/ `, {' J
(1)利用Connection对象的Execute方法执行SQL命令
/ }/ m- K- u+ E6 _5 _. w% V. ~/ x7 } d4 F6 [
Execute方法的原型如下所示:' s: D' q0 r/ r* J
' }. G& N" V7 L! W2 J
_RecordsetPtr Connection15::Execute ( _bstr_t CommandText, VARIANT * RecordsAffected, long Options )
; J% N+ |/ g, |+ Y& R% Z6 }2 O6 C+ o! ~$ a
其中CommandText是命令字串,通常是SQL命令。! y0 J& @* |+ C5 X
参数RecordsAffected是操作完成后所影响的行数,
+ l) u4 j5 ^ g) J! X7 W: v( \0 S参数Options表示CommandText中内容的类型,Options可以取如下值之一:
" b( P& n# h6 G9 _( tadCmdText:表明CommandText是文本命令9 L% ^7 ~4 o' z9 N7 k
adCmdTable:表明CommandText是一个表名. c6 `% F9 n6 {' U) v; U
adCmdProc:表明CommandText是一个存储过程! V2 D& H" n- e3 a2 O- y+ W
adCmdUnknown:未知* T; I/ r5 L) l3 l p: ]
4 U( J5 m& S$ q3 W6 i4 m
Execute执行完后返回一个指向记录集的指针,下面我们给出具体代码并作说明。 ! q$ k2 ~) O' y6 J
_variant_t RecordsAffected;) C1 M6 m }) b9 G$ S% v q
///执行SQL命令:CREATE TABLE创建表格users,users包含四个字段:整形ID,字符串username,整形old,日期型birthday3 |' t, q- i4 V* Z6 R
m_pConnection->Execute("CREATE TABLE users(ID INTEGER,username TEXT,old INTEGER,birthday DATETIME)",% w1 j4 i0 f- v# [! ~
&RecordsAffected,# B. t ~" \) |5 F. m
adCmdText);
6 M- T- A8 m4 v% c& N
; f+ v5 i. c) ?9 @///往表格里面添加记录
8 c/ U0 J$ Z4 B+ I5 E/ v7 K1 qm_pConnection->Execute("INSERT INTO users(ID,username,old,birthday) valueS (1, ''''Washington'''',25,''''1970/1/1'''')",&RecordsAffected,adCmdText);3 f. r2 i4 B/ Y! ]2 V' b) M; X/ p
; I7 K& e+ \+ N3 z% B7 X
///将所有记录old字段的值加一
- y" `2 B/ G$ g) ^2 a; T+ O3 km_pConnection->Execute("UPDATE users SET old = old+1",&RecordsAffected,adCmdText);; t, o; x- F5 ~' _: N3 T
$ y4 U) V. i4 }! P///执行SQL统计命令得到包含记录条数的记录集
0 ]* i) C' ?: Em_pRecordset = m_pConnection->Execute("SELECT COUNT(*) FROM users",&RecordsAffected,adCmdText);
0 X3 c0 m9 c# @) d, G$ o8 A# P8 K_variant_t vIndex = (long)0;
! [+ X0 U- O0 D% x_variant_t vCount = m_pRecordset->GetCollect(vIndex);///取得第一个字段的值放入vCount变量9 v1 p8 u9 i* [* _
上两句可以写成— _variant_t vCount = m_pRecordset->GetCollect((_variant_t)((long)0));
7 P. B& Q l, U( `# im_pRecordset->Close();///关闭记录集
3 ~6 o4 D3 d2 ^# iCString message;+ C \8 d5 C* L. O% [
message.format("共有%d条记录",vCount.lVal);
0 t t; R+ I, z3 W# Q4 ?9 tAfxMessageBox(message);///显示当前记录条数
5 L4 U$ X$ j( M. |+ @0 @, e- d" [0 {& [. ]: G* T
(2)利用Command对象来执行SQL命令
( }: G0 u1 L* ~4 o$ s! Z) F& K. I4 n" m: Z3 }6 l
_CommandPtr m_pCommand;
# a, G8 s7 z3 g2 S/ ^) ~2 zm_pCommand.CreateInstance("ADODB.Command"); G+ S+ [ V8 O9 Q
_variant_t vNULL;+ w v- T9 R' V& y9 \) i) i# E+ H
vNULL.vt = VT_ERROR;* U+ \! _- n4 F# H' e8 B! R1 k
vNULL.scode = DISP_E_PARAMNOTFOUND;///定义为无参数
. u, W8 e" H" M* E& g; y3 q2 i4 qm_pCommand->ActiveConnection = m_pConnection;///非常关键的一句,将建立的连接赋值给它
' P$ f% j; y3 x b8 O8 C$ j& {m_pCommand->CommandText = "SELECT * FROM users";///命令字串
9 q$ s& H4 L% k% l% vm_pRecordset = m_pCommand->Execute(&vNULL,&vNULL,adCmdText);///执行命令,取得记录集5 O+ t) [8 [8 b& f8 C, |
& c1 S2 z0 l J+ a( X( e1 Z! V: ^' ? 在这段代码中我们只是用Command对象来执行了SELECT查询语句,Command对象在进行存储过程的调用中能真正体现它的作用。下次我们将详细介绍。 $ v S: A. w @0 ~6 o& C* } l
1 u2 n( y- f: y" r- F (3)直接用Recordset对象进行查询取得记录集
b; H9 m% V& X. S' ]" y: Q7 G6 ^ d* {5 Q9 N( J
实例—— & y0 k. v: T0 P+ a! i% J
" w* y- q6 U1 y( |. K6 |. ^
void CGmsaDlg::OnDBSelect()
, b% [$ z p5 M, I5 y{4 [3 {4 A! P, m& P: ]$ t' ]
// TOD Add your control notification handler code here" a/ ?8 ^* E! D8 f3 N# w
_RecordsetPtr Rs1; //定义Recordset对象. j6 C4 N- a& h1 [4 l0 ~4 Y
_bstr_t Connect("DSN=GMS;UID=sa WD=;");//定义连接字符串4 E& D1 j* U2 d1 r
_bstr_t Source ("SELECT count(*) FROM buaa.mdb010"); //要执行的SQL语句) m$ |- j0 q1 v) U8 \( L4 Q
::CoInitialize(NULL); //初始化Rs1对象
3 i# X3 \/ J3 xHRESUL hr = Rs1.CreateInstance( __uuidof( Recordset ) );" Q6 L" c8 ]' @
//省略对返回值hr的判断
; x( u' e9 R9 A* u. [Rs1->Open( Source,
$ e# e! f* B* s) IConnect,
# \: c0 H1 |: o) Q- U. }adOpenForwardOnly,
4 G+ h; [/ J! ]9 Q/ [5 o: {adLockReadOnly,
7 B& m+ r+ m8 Z/ L, [" n-1 );
/ F4 b# _7 @5 K* Y3 d5 q& F. \* Y_variant_t temp=Rs1->GetCollect(_variant_t((long)0));$ f4 S* }" {* H! S. ~. ^
CString strTemp=(char* )(_bstr_t)temp;) S% B- ?4 i m& ?; A' \: A
MessageBox("OK!"+strTemp);
6 `9 F. ^4 T+ |}! L7 d' v5 b. ^: `6 r
0 \' e: Q6 M% w# P$ z例如 9 ?- C# c+ L* [( |
m_pRecordset->Open("SELECT * FROM users",
3 }* l0 a1 P2 L/ t_variant_t((IDispatch *)m_pConnection,true),
! W; w2 \. I% k- u/ w7 padOpenStatic,
9 ^" n1 d6 B/ Z4 p2 oadLockOptimistic,
! T" p7 Z$ g6 \- g! madCmdText);. i" b, [+ d9 ?4 \- O/ \0 Q1 i
' P* p* ?( D+ c5 x/ zOpen方法的原型是这样的:
7 @- R$ f, k, H, L" c" S* NHRESULT Recordset15::Open ( const _variant_t & Source, $ }% [7 u7 l+ t$ H: X
const _variant_t & ActiveConnection, % ?) r7 l' Q# ]# n; B+ g
enum CursorTypeEnum CursorType, L" A0 Z+ |' n. r: D' K! ^! s
enum LockTypeEnum LockType, 3 M+ W) P* r% i4 n0 ^4 H
long Options )
' I( |! T1 d/ ] I0 R/ H4 G( V
2 j& ?8 t$ ?8 q, N/ x& U" Y其中:
! w7 S4 d( c" E( ?
& i) L* V& H: l9 v- i! }①Source是数据查询字符串
4 N3 P& P# W5 \6 N②ActiveConnection是已经建立好的连接(我们需要用Connection对象指针来构造一个_variant_t对象) , r) g5 r/ S8 w( B+ ]& V2 u! W
③CursorType光标类型,它可以是以下值之一,请看这个枚举结构:
N+ L8 v Z; Z) J$ T
, Z8 V2 M% Z8 T P( q1 _enum CursorTypeEnum
' x7 W2 Y5 g5 i" X4 G- j{5 n* W: y2 h. R/ N; N, E
adOpenUnspecified = -1,///不作特别指定
5 S: A# W" ^% d) LadOpenForwardOnly = 0,///前滚静态光标。这种光标只能向前浏览记录集,比如用MoveNext向前滚动,这种方式可以提高浏览速度。但诸如BookMark,RecordCount,AbsolutePosition,AbsolutePage都不能使用
, B! l/ T8 `6 e; `, i$ }adOpenKeyset = 1,///采用这种光标的记录集看不到其它用户的新增、删除操作,但对于更新原有记录的操作对你是可见的。
6 C1 _# ^, o& n/ H2 q& b0 r
' M3 b1 x2 O) DadOpenDynamic = 2,///动态光标。所有数据库的操作都会立即在各用户记录集上反应出来。/ Y$ V0 X& e: I0 l9 W$ `
adOpenStatic = 3///静态光标。它为你的记录集产生一个静态备份,但其它用户的新增、删除、更新操作对你的记录集来说是不可见的。
5 Z7 j7 v7 g3 e1 a8 q: ]: N" T};
7 F, l' _( G! U" r7 u0 v④LockType锁定类型,它可以是以下值之一,请看如下枚举结构:
5 J0 [+ R/ s5 g5 j1 s C: M
7 O( X% W9 L! t1 T: e2 ~" Venum LockTypeEnum
- A z+ t2 H- R, O) c, {{
, X+ p0 p2 Q+ FadLockUnspecified = -1,///未指定# @: Q2 ?! E! K/ I9 C
adLockReadOnly = 1,///只读记录集
2 V# P0 ]% ?& S0 ^# JadLockPessimistic = 2,悲观锁定方式。数据在更新时锁定其它所有动作,这是最安全的锁定机制/ C+ L' U! \: g% y* u
adLockOptimistic = 3,乐观锁定方式。只有在你调用Update方法时才锁定记录。在此之前仍然可以做数据的更新、插入、删除等动作
$ t: z; a$ r2 p8 O% N9 K+ YadLockBatchOptimistic = 4,乐观分批更新。编辑时记录不会锁定,更改、插入及删除是在批处理模式下完成。$ g- [+ H; ^# @9 F% O
}; 3 p" [1 _% |& J4 o% G3 I$ H- h2 f
& i2 `; J( G2 ^9 J2 d⑤Options可以取如下值之一:
* e. N2 M5 z+ ^! x# DadCmdText:表明CommandText是文本命令
. s: S6 K! H+ CadCmdTable:表明CommandText是一个表名* \3 T W4 H# b s1 ]4 ~
adCmdProc:表明CommandText是一个存储过程: M8 ~! V+ [/ N4 G# A* F
adCmdUnknown:未知 |
zan
|