- 在线时间
- 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命令并取得结果记录集
+ P9 {# f6 U/ ], V7 \$ ~! [7 v' r: _; e
为了取得结果记录集,我们定义一个指向Recordset对象的指针:_RecordsetPtr m_pRecordset;
+ `# T- r7 n8 I' P- |并为其创建Recordset对象的实例: m_pRecordset.CreateInstance("ADODB.Recordset");9 z) S' n, o) {; ?/ q% m
SQL命令的执行可以采用多种形式,下面我们一进行阐述。
! k7 r8 J- S5 i0 b; r2 q
) X+ R' V- o5 n/ A0 I (1)利用Connection对象的Execute方法执行SQL命令4 b1 ?! ~& B- P
& x7 ~- Q! A. W( T4 U
Execute方法的原型如下所示:
$ c; L. ?, B# ^% z$ Z& l
$ S3 \" U; |& s. H7 |_RecordsetPtr Connection15::Execute ( _bstr_t CommandText, VARIANT * RecordsAffected, long Options ) - x& ]+ p( X$ l' i3 W
& u- ?" i0 X- t, B其中CommandText是命令字串,通常是SQL命令。' o0 a/ a1 d7 h
参数RecordsAffected是操作完成后所影响的行数,
+ b4 `) k/ a) P# d! |% l参数Options表示CommandText中内容的类型,Options可以取如下值之一:& Y u o4 E3 o1 B- C
adCmdText:表明CommandText是文本命令 z" _9 a2 I9 B* g l5 c
adCmdTable:表明CommandText是一个表名
% Z' O0 k& u, D9 T( @( ?6 N* sadCmdProc:表明CommandText是一个存储过程
( H) | j( v6 a0 ~' T( WadCmdUnknown:未知
7 ~; R) U3 {: M0 K2 E: v0 U7 ^% `0 J
Execute执行完后返回一个指向记录集的指针,下面我们给出具体代码并作说明。
6 d! O% H, K% [: t) e_variant_t RecordsAffected;
! S ~, H/ ]$ W+ J///执行SQL命令:CREATE TABLE创建表格users,users包含四个字段:整形ID,字符串username,整形old,日期型birthday1 i3 ^6 g( Y1 S3 C
m_pConnection->Execute("CREATE TABLE users(ID INTEGER,username TEXT,old INTEGER,birthday DATETIME)",9 w" F6 {+ X7 @; K& t3 f0 c. T4 I
&RecordsAffected,1 w, i1 T; r9 H+ c+ i H$ w2 R* l
adCmdText);" A" y0 D0 D, [* B
& j+ A6 ? C% F! n% f* W: ]& ]///往表格里面添加记录
; a6 F: {- u) n% Zm_pConnection->Execute("INSERT INTO users(ID,username,old,birthday) valueS (1, ''''Washington'''',25,''''1970/1/1'''')",&RecordsAffected,adCmdText);* d; k9 c ?" Z9 N J: N. U
3 z& a7 I! o0 U: o2 J2 e///将所有记录old字段的值加一) G! s' K2 a# q i. U6 Z! d
m_pConnection->Execute("UPDATE users SET old = old+1",&RecordsAffected,adCmdText);7 w" X. T# p" H, ], y% `# B, S
& u; B9 l/ j" ]+ r" u
///执行SQL统计命令得到包含记录条数的记录集0 E2 t+ L+ L3 g$ Q; @- r4 q8 K
m_pRecordset = m_pConnection->Execute("SELECT COUNT(*) FROM users",&RecordsAffected,adCmdText);3 ^8 Q/ {; X5 a( K' \/ ?
_variant_t vIndex = (long)0;
# x* C" w6 l$ `_variant_t vCount = m_pRecordset->GetCollect(vIndex);///取得第一个字段的值放入vCount变量
, E6 p+ D( ?+ x" k- Q上两句可以写成— _variant_t vCount = m_pRecordset->GetCollect((_variant_t)((long)0));& ?* k* E2 A+ d& K& p0 w
m_pRecordset->Close();///关闭记录集# n1 ]3 N& p: ?% |: e; p) z
CString message;9 o- i8 o$ V; q$ ]: V
message.format("共有%d条记录",vCount.lVal);* W4 P l' y0 F4 z! J) v1 S5 k6 u
AfxMessageBox(message);///显示当前记录条数
a" V1 Q+ k# p& z+ }4 j) D5 A
' t7 e7 w b( F7 r0 n' {2 ~9 O(2)利用Command对象来执行SQL命令 8 i. h% W; O* t8 t. M" Q' _
: Y" O% r0 A. T) C! a_CommandPtr m_pCommand;
: Z$ Q8 m4 C# F+ u, J9 Am_pCommand.CreateInstance("ADODB.Command");* ^% ~! q6 B+ Y; \: M
_variant_t vNULL;% ~1 d1 a9 C6 E# L5 P& s4 Q
vNULL.vt = VT_ERROR;
9 c, Q, S, b! {7 }1 \/ IvNULL.scode = DISP_E_PARAMNOTFOUND;///定义为无参数
: t; F6 Q) c) @2 p7 Cm_pCommand->ActiveConnection = m_pConnection;///非常关键的一句,将建立的连接赋值给它9 F1 `" E. X3 ?) |9 N6 i1 ?8 G7 I
m_pCommand->CommandText = "SELECT * FROM users";///命令字串! r$ a1 |1 C: x, {5 J
m_pRecordset = m_pCommand->Execute(&vNULL,&vNULL,adCmdText);///执行命令,取得记录集+ l; W& R: R3 Q$ _
6 \, t: m4 z5 }3 l, X" q
在这段代码中我们只是用Command对象来执行了SELECT查询语句,Command对象在进行存储过程的调用中能真正体现它的作用。下次我们将详细介绍。
* E4 x W. h! v
3 L$ b s, ~. }' I (3)直接用Recordset对象进行查询取得记录集
( H4 D# y0 @9 q6 D i0 R/ w c1 c" h. k% o- H
实例—— ( {! _! I: l: I+ l! Q+ ], m
7 q, n) R/ d( mvoid CGmsaDlg::OnDBSelect() , z; e4 b, ]1 s( V) G
{* R0 F% W" Y: h: k0 |
// TOD Add your control notification handler code here
5 ~1 q5 Q; i! \_RecordsetPtr Rs1; //定义Recordset对象
2 v* ~" {' B+ J) n3 w% q_bstr_t Connect("DSN=GMS;UID=sa WD=;");//定义连接字符串" G3 y: ~# {! s# b( y, G
_bstr_t Source ("SELECT count(*) FROM buaa.mdb010"); //要执行的SQL语句
! i7 c0 t" g' H" n1 l1 s2 X, L::CoInitialize(NULL); //初始化Rs1对象
3 R+ X) f! v$ ^0 `) \HRESUL hr = Rs1.CreateInstance( __uuidof( Recordset ) );* T& Y ^6 v% z0 S$ c
//省略对返回值hr的判断
; v1 F) e3 Q6 J7 c" ^6 o! CRs1->Open( Source,' I4 P9 p) o9 Z8 g3 v6 u; h* V
Connect,9 ?, f7 a: b- U
adOpenForwardOnly,) p2 g4 {: L& k$ G/ ^
adLockReadOnly,
( |2 Y7 f5 d# Y7 B4 y-1 ); " D' b u2 j8 w7 }' p
_variant_t temp=Rs1->GetCollect(_variant_t((long)0));+ J9 a8 m9 t6 [, t/ d6 }( C
CString strTemp=(char* )(_bstr_t)temp;
' T: D4 i0 B, k7 UMessageBox("OK!"+strTemp);3 }7 ?6 J8 H/ L
}
/ O. n( Z! E" K2 N1 p9 ?, s/ J3 o, ` J( X
例如 ' @( l0 E% `! ?" y( `$ a+ t# l( N
m_pRecordset->Open("SELECT * FROM users",' r _/ s# T! ~' U" U+ i
_variant_t((IDispatch *)m_pConnection,true),. [7 c+ s/ J7 R& a
adOpenStatic,3 E" Z' d3 p& L9 I, ?) u
adLockOptimistic,
) Y) d2 p! B) ?# x1 x. D n" `1 \adCmdText);1 g2 b7 f; b* b/ e
9 f* y0 u2 G" Q* d+ A
Open方法的原型是这样的:: v7 C* [3 i2 N; c0 H
HRESULT Recordset15::Open ( const _variant_t & Source, / x$ ?) r# v9 D: s
const _variant_t & ActiveConnection,
! a$ h, G; R/ y1 B& P2 ^9 L% O( Benum CursorTypeEnum CursorType,
1 @" z8 y. X$ j2 P3 y' s: [( Fenum LockTypeEnum LockType, ' @. h3 \4 R9 l5 h
long Options ) 1 L8 k5 D* p' o; |
6 A$ o' _4 }1 X3 e0 A" z5 B
其中:% @- [" J) f) j
* e+ L( y0 ^# F: p2 v' u& b- k
①Source是数据查询字符串1 `9 Z* p$ S! ^. j. J
②ActiveConnection是已经建立好的连接(我们需要用Connection对象指针来构造一个_variant_t对象) q1 k6 e( n. v1 t/ i
③CursorType光标类型,它可以是以下值之一,请看这个枚举结构:) b. F' X$ U' [, [: U" }
/ n) a. Z6 I- E# P& O0 xenum CursorTypeEnum
6 ~$ r! c' ~0 I$ E Y# j. B6 s: W{
5 E7 [% X: \3 e" R1 z9 I" MadOpenUnspecified = -1,///不作特别指定3 h; X' W6 K! |! Z/ o: v# i2 {
adOpenForwardOnly = 0,///前滚静态光标。这种光标只能向前浏览记录集,比如用MoveNext向前滚动,这种方式可以提高浏览速度。但诸如BookMark,RecordCount,AbsolutePosition,AbsolutePage都不能使用& M Q( }. h% R$ z6 P3 A
adOpenKeyset = 1,///采用这种光标的记录集看不到其它用户的新增、删除操作,但对于更新原有记录的操作对你是可见的。
" y9 N8 j; x6 V: V, q b3 X& C U6 ?- E
adOpenDynamic = 2,///动态光标。所有数据库的操作都会立即在各用户记录集上反应出来。6 }1 R- J: H. W8 Z* R$ C
adOpenStatic = 3///静态光标。它为你的记录集产生一个静态备份,但其它用户的新增、删除、更新操作对你的记录集来说是不可见的。: t s" [; F) l) y% ?% N" z2 k) x
};
# R( Q+ R# Y# X7 {: C }; Y④LockType锁定类型,它可以是以下值之一,请看如下枚举结构:
; O/ J" T1 M5 U0 W
$ o1 ]* ]9 w: E+ e5 m9 R- \enum LockTypeEnum
" F/ `# G8 Q) u' F! y! _, Q{9 k1 ^) z2 S; E
adLockUnspecified = -1,///未指定
+ y# A- Q" {2 ~adLockReadOnly = 1,///只读记录集
" y9 q) Y+ L2 ~* h7 I( j I) s6 sadLockPessimistic = 2,悲观锁定方式。数据在更新时锁定其它所有动作,这是最安全的锁定机制
$ G, G/ F' O, @: yadLockOptimistic = 3,乐观锁定方式。只有在你调用Update方法时才锁定记录。在此之前仍然可以做数据的更新、插入、删除等动作/ W/ |" U4 G& n
adLockBatchOptimistic = 4,乐观分批更新。编辑时记录不会锁定,更改、插入及删除是在批处理模式下完成。* J$ x( a1 w1 i9 U
}; ' ?1 D6 u, A( Z# z3 I6 P0 H
- g' o6 b c! q; j* F⑤Options可以取如下值之一:. i: C4 c2 d& B8 V _8 @; B3 s
adCmdText:表明CommandText是文本命令
7 d+ y/ Q6 B: f" J' D2 HadCmdTable:表明CommandText是一个表名
8 ]* `2 `2 Y8 k- Z% uadCmdProc:表明CommandText是一个存储过程) b, Z& N# M8 w ]7 K& Q$ p
adCmdUnknown:未知 |
zan
|