- 在线时间
- 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命令并取得结果记录集6 T# N0 o! v; Q8 f3 x& E Y
) G$ v! N, x# Z9 M5 J. M8 Q 为了取得结果记录集,我们定义一个指向Recordset对象的指针:_RecordsetPtr m_pRecordset;6 G& l1 g5 I, S w' \# T1 c9 x4 I
并为其创建Recordset对象的实例: m_pRecordset.CreateInstance("ADODB.Recordset");+ X) d/ T1 G$ l5 M. B, l
SQL命令的执行可以采用多种形式,下面我们一进行阐述。/ `. q9 ^, w) x4 W; y
/ y3 ]9 {9 }6 J (1)利用Connection对象的Execute方法执行SQL命令
( U- j* b0 z) P# ]- `2 p% H( Q3 _6 |% l% A8 z8 h) O% x+ C% T
Execute方法的原型如下所示:
6 I' n( m4 v& Z& l8 ^0 y& R
$ v2 }# k0 p2 G( P; ?_RecordsetPtr Connection15::Execute ( _bstr_t CommandText, VARIANT * RecordsAffected, long Options )
6 A% Q- {) \% r& p" A7 T$ `9 Z
F- V* N% T: }其中CommandText是命令字串,通常是SQL命令。! k) y7 H& ]* F
参数RecordsAffected是操作完成后所影响的行数,
% @6 q4 R X: x. n- }9 s参数Options表示CommandText中内容的类型,Options可以取如下值之一:
, S5 }! a9 @0 r& X" L# ]2 `8 ?adCmdText:表明CommandText是文本命令- `& J2 ]1 \/ _; [$ o
adCmdTable:表明CommandText是一个表名
6 b \2 s P& X0 t0 ladCmdProc:表明CommandText是一个存储过程# r" L0 o& E9 j( n3 b% L7 C& H
adCmdUnknown:未知
c& [& z' w8 P$ K( F. f: p# z! D n& y' F) N
Execute执行完后返回一个指向记录集的指针,下面我们给出具体代码并作说明。
$ R& P+ f: }+ F6 G_variant_t RecordsAffected;
; t7 c( i' C. y( ~8 z; W ?1 V- o///执行SQL命令:CREATE TABLE创建表格users,users包含四个字段:整形ID,字符串username,整形old,日期型birthday# ~1 n3 E9 E0 C i% X/ K
m_pConnection->Execute("CREATE TABLE users(ID INTEGER,username TEXT,old INTEGER,birthday DATETIME)",! R; O5 j1 [) Y, {! j5 K6 T
&RecordsAffected,% f }: V% v) i
adCmdText); P% a7 @. r0 A* l
* m+ y* T9 u% z- W' k
///往表格里面添加记录5 b7 k1 F! E# l* p
m_pConnection->Execute("INSERT INTO users(ID,username,old,birthday) valueS (1, ''''Washington'''',25,''''1970/1/1'''')",&RecordsAffected,adCmdText);6 G+ r7 Z7 B) }
0 J5 w# v0 O0 K! X) j6 L0 g8 C# x///将所有记录old字段的值加一
9 D" n8 j1 a, d2 s2 Im_pConnection->Execute("UPDATE users SET old = old+1",&RecordsAffected,adCmdText);
0 L- Z, {8 A* _0 l8 O
) A8 A, A& ], R0 B/ d///执行SQL统计命令得到包含记录条数的记录集
2 B. g. _+ c. I" Z, zm_pRecordset = m_pConnection->Execute("SELECT COUNT(*) FROM users",&RecordsAffected,adCmdText);* c0 D* y/ i8 R0 N
_variant_t vIndex = (long)0;& I+ ?7 F; i$ G
_variant_t vCount = m_pRecordset->GetCollect(vIndex);///取得第一个字段的值放入vCount变量
! p* c% Q) o$ }- Y& A( ?% g上两句可以写成— _variant_t vCount = m_pRecordset->GetCollect((_variant_t)((long)0));% c7 _* ^# C y+ X9 }- ?
m_pRecordset->Close();///关闭记录集0 q. O7 C& t o" ?' x1 U
CString message;8 E [" g6 n0 O5 T0 P
message.format("共有%d条记录",vCount.lVal);+ U: {7 A2 j3 l- @
AfxMessageBox(message);///显示当前记录条数
- f+ `: o- h7 J0 `& x- Q; l+ C% a; f/ O# r6 I
(2)利用Command对象来执行SQL命令 ( ~/ ? k* i/ T* w
6 B2 L! X0 `, |. F( U6 C
_CommandPtr m_pCommand;' y% S! b& g, C- O( [
m_pCommand.CreateInstance("ADODB.Command");
1 }3 U/ [7 v! M* c1 ^_variant_t vNULL;. A" Y3 `% T" N! W$ f. ?6 g
vNULL.vt = VT_ERROR;. E/ L" b8 F: n% v$ h, @ `
vNULL.scode = DISP_E_PARAMNOTFOUND;///定义为无参数+ M; s3 ^" n1 B, J
m_pCommand->ActiveConnection = m_pConnection;///非常关键的一句,将建立的连接赋值给它
9 r' A7 B. I+ S# N2 m5 o' wm_pCommand->CommandText = "SELECT * FROM users";///命令字串
7 Y3 L% t" b9 J) z+ w7 sm_pRecordset = m_pCommand->Execute(&vNULL,&vNULL,adCmdText);///执行命令,取得记录集
g% n4 b: [9 f* A& R
0 }7 u6 k4 n( p/ E 在这段代码中我们只是用Command对象来执行了SELECT查询语句,Command对象在进行存储过程的调用中能真正体现它的作用。下次我们将详细介绍。 ! S+ d, D$ h, z& [, a( Q! E6 f
8 l8 P2 ^! F7 s (3)直接用Recordset对象进行查询取得记录集
$ ^; o5 {$ F: u4 d9 u. G3 ?4 v z' j7 j. I' L- ~. L
实例—— + C* ~* ?5 F: p
- }$ z* o- ]2 ?3 [( Y2 f: {void CGmsaDlg::OnDBSelect()
& ~) A' M3 a i4 |, ]. S% p; ^{. B y* A& Z1 J8 a
// TOD Add your control notification handler code here* A, i& B7 D8 Y+ W( O; n. r
_RecordsetPtr Rs1; //定义Recordset对象
) j3 V4 ^: ]. X# M2 m_bstr_t Connect("DSN=GMS;UID=sa WD=;");//定义连接字符串# k( l- s3 | `" E$ V- ]% Z& D* u
_bstr_t Source ("SELECT count(*) FROM buaa.mdb010"); //要执行的SQL语句
. q9 @8 ~0 _( A K( I) A::CoInitialize(NULL); //初始化Rs1对象
6 h5 Y2 d7 P7 J# cHRESUL hr = Rs1.CreateInstance( __uuidof( Recordset ) );0 f. R: n/ R# Y, |: m) v0 U
//省略对返回值hr的判断
0 D1 G; } v7 P$ R. F$ s) X* s# VRs1->Open( Source,# @0 K0 p; ~( |4 P
Connect,- G4 N! Q I- `" p. m& L
adOpenForwardOnly,7 n. Q* m; [; E# c/ q# g, U
adLockReadOnly,
+ h, F6 R$ B4 A0 s-1 ); b! t) l8 d R9 G9 I# t" G
_variant_t temp=Rs1->GetCollect(_variant_t((long)0));$ I u& y( m% \' i8 s. G7 V/ F
CString strTemp=(char* )(_bstr_t)temp;
- ]* _# g0 j1 |' r( B8 }" @MessageBox("OK!"+strTemp);5 m4 U! ^! g: N& O5 p$ X
}
) ?; l$ X$ o! N: _# S) w2 D0 R% {4 J
例如 ! x/ l! q( k. X) d% T
m_pRecordset->Open("SELECT * FROM users",
. A! U/ C/ o- C7 |4 s_variant_t((IDispatch *)m_pConnection,true),9 x4 H2 L, h r9 J) b' Q4 c7 F
adOpenStatic,$ l6 ?2 M& }+ N$ U, g, M1 O
adLockOptimistic,
* r. K" l, D' Q$ g1 Y* d5 E) MadCmdText);( V0 X: D- j# M% M) ^
' A+ D8 M% l: X: _& R: E* hOpen方法的原型是这样的:
) I3 p3 G2 u9 d2 AHRESULT Recordset15::Open ( const _variant_t & Source, * {# V8 t$ j4 `2 j& p- v8 g, d
const _variant_t & ActiveConnection, ) Z8 X5 t% Y4 L! q5 x/ ~* M4 ]* _
enum CursorTypeEnum CursorType, 5 `) T; q( S$ f. ?
enum LockTypeEnum LockType,
$ \/ ]' v' ?4 N* n5 o+ }$ Klong Options ) % F2 d1 Y# q1 y. ?
1 R. M5 o4 U2 w* H
其中:
0 A2 R5 _7 J7 d% `9 V/ A, q y* v, u0 K( S7 f0 n
①Source是数据查询字符串3 Q$ s2 \2 P8 f1 D: ]- d
②ActiveConnection是已经建立好的连接(我们需要用Connection对象指针来构造一个_variant_t对象)
. B9 G- o& D8 `, n4 u8 S8 u1 Q% S③CursorType光标类型,它可以是以下值之一,请看这个枚举结构:5 \. z$ A$ D. c$ t# ]& G7 c
2 w% \7 p& a G$ e3 wenum CursorTypeEnum
5 `6 x* e U- u0 N3 A% Q{6 o& [, m- A2 H. ^) m
adOpenUnspecified = -1,///不作特别指定
: L/ ?! j* a, {2 madOpenForwardOnly = 0,///前滚静态光标。这种光标只能向前浏览记录集,比如用MoveNext向前滚动,这种方式可以提高浏览速度。但诸如BookMark,RecordCount,AbsolutePosition,AbsolutePage都不能使用
' p8 B7 u; _. @& p. c1 e) i- [) i& j4 `adOpenKeyset = 1,///采用这种光标的记录集看不到其它用户的新增、删除操作,但对于更新原有记录的操作对你是可见的。
# N t9 Q) P7 I4 ~. D
2 P$ L9 Z) U4 madOpenDynamic = 2,///动态光标。所有数据库的操作都会立即在各用户记录集上反应出来。" `1 B/ [5 t9 k; z' t' Y' Z
adOpenStatic = 3///静态光标。它为你的记录集产生一个静态备份,但其它用户的新增、删除、更新操作对你的记录集来说是不可见的。
0 i. _8 k1 d2 A};1 `+ r' D& T0 d/ g v8 r
④LockType锁定类型,它可以是以下值之一,请看如下枚举结构:
7 \* V7 V8 Y. h$ r! p. e! Y1 @1 L$ o
- d" v I2 E6 p( h0 M) W3 J. penum LockTypeEnum
8 R3 `4 P* u6 A{3 L/ U8 t# F2 W% b" T: j# f i+ B
adLockUnspecified = -1,///未指定- M, b$ j$ k6 n9 }
adLockReadOnly = 1,///只读记录集
- M1 {0 I( Z( ?/ c5 _6 n+ b0 wadLockPessimistic = 2,悲观锁定方式。数据在更新时锁定其它所有动作,这是最安全的锁定机制
* P% d! g$ x- h- M& H4 `adLockOptimistic = 3,乐观锁定方式。只有在你调用Update方法时才锁定记录。在此之前仍然可以做数据的更新、插入、删除等动作# b0 c) ^7 j8 S3 f. | M2 n' r
adLockBatchOptimistic = 4,乐观分批更新。编辑时记录不会锁定,更改、插入及删除是在批处理模式下完成。
% D3 s, r" R( B" K( S4 t4 H};
! \/ Z$ Z5 t5 |8 k% I+ l& f8 n8 y" [' l
⑤Options可以取如下值之一:7 _" Q( H Z# _! A# }
adCmdText:表明CommandText是文本命令
1 [& t$ E5 c# N7 ]adCmdTable:表明CommandText是一个表名
0 z4 W( Q: i1 [" LadCmdProc:表明CommandText是一个存储过程1 t6 F, H3 U# D; S( f" \! t
adCmdUnknown:未知 |
zan
|