QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 3499|回复: 0
打印 上一主题 下一主题

[转帖]在Visual C++中用ADO进行数据库编程(中)

[复制链接]
字体大小: 正常 放大
god        

206

主题

2

听众

882

积分

升级  70.5%

该用户从未签到

新人进步奖

跳转到指定楼层
1#
发表于 2005-3-30 22:53 |只看该作者 |正序浏览
|招呼Ta 关注Ta
4.执行SQL命令并取得结果记录集
) u8 o& ?- D* |: x% V! r
  i; ]4 z, w, d  为了取得结果记录集,我们定义一个指向Recordset对象的指针:_RecordsetPtr m_pRecordset;- ]( D* w  w' H0 k1 H3 F
并为其创建Recordset对象的实例: m_pRecordset.CreateInstance("ADODB.Recordset");. S( C0 O6 G4 s- b* U1 i: K9 W
SQL命令的执行可以采用多种形式,下面我们一进行阐述。8 \5 t( U# O0 |1 v

$ f3 O( S$ u( B2 s  ]" V  (1)利用Connection对象的Execute方法执行SQL命令, x- h2 {; _2 m6 k1 n# J7 m2 ?
* n( s& H: z9 N( b' g( Q
  Execute方法的原型如下所示:$ d1 D8 m* O/ ^9 y/ k. ~

" q, M! k" q2 m_RecordsetPtr Connection15::Execute ( _bstr_t CommandText, VARIANT * RecordsAffected, long Options )
, A( z/ t! F& t9 O
3 n6 {6 o5 J+ n其中CommandText是命令字串,通常是SQL命令。  O! I! z2 n3 o) [
参数RecordsAffected是操作完成后所影响的行数, $ o7 l4 d" X; T9 ?
参数Options表示CommandText中内容的类型,Options可以取如下值之一:# P. z! s2 g- i# z) L2 Y/ X- J
adCmdText:表明CommandText是文本命令+ c6 Q1 J) ~# n+ D# m( s
adCmdTable:表明CommandText是一个表名, |' s' L$ p5 y  H( O
adCmdProc:表明CommandText是一个存储过程
" M  z. }" I- f  G; k4 iadCmdUnknown:未知  c, m1 T9 i( a" u0 k7 {' z( E/ u

8 @. I: h1 P) ]' M6 q9 I# kExecute执行完后返回一个指向记录集的指针,下面我们给出具体代码并作说明。
' ]! h5 P* O- e_variant_t RecordsAffected;
1 C1 x+ P/ k+ T- Z- ]  e# i1 f0 I0 S///执行SQL命令:CREATE TABLE创建表格users,users包含四个字段:整形ID,字符串username,整形old,日期型birthday; l* V8 l4 H4 o  |$ {
m_pConnection->Execute("CREATE TABLE users(ID INTEGER,username TEXT,old INTEGER,birthday DATETIME)",
% \  M, @6 _, `, Z3 B7 m# g&RecordsAffected,
" p' N% |7 T6 Q9 w" [% ^# QadCmdText);' u: |! c- B' H3 u7 T2 g

1 B* A$ ^, Q: Y) h' {8 X///往表格里面添加记录, c  a' `( f7 G9 z
m_pConnection->Execute("INSERT INTO users(ID,username,old,birthday) valueS (1, ''''Washington'''',25,''''1970/1/1'''')",&RecordsAffected,adCmdText);
3 P6 g, E  y% G+ k* ^
: @7 p7 `. Z1 V- c///将所有记录old字段的值加一) m& L  J. l) |8 }. g* U1 \2 \7 F: I$ l
m_pConnection->Execute("UPDATE users SET old = old+1",&RecordsAffected,adCmdText);
& N% L% p; O6 x9 H  g+ E* S, W* i( b1 `. Y, t/ W
///执行SQL统计命令得到包含记录条数的记录集* c1 {7 \9 W. o0 q% c! v6 Y9 a
m_pRecordset = m_pConnection->Execute("SELECT COUNT(*) FROM users",&RecordsAffected,adCmdText);3 Z8 ?% |( y& U7 M
_variant_t vIndex = (long)0;# L; B- L! m* y8 @
_variant_t vCount = m_pRecordset->GetCollect(vIndex);///取得第一个字段的值放入vCount变量
8 X1 g5 H5 D7 d+ x" u上两句可以写成— _variant_t vCount = m_pRecordset->GetCollect((_variant_t)((long)0));* e" _- B6 F6 T( I7 p1 Y+ J" @  j  K
m_pRecordset->Close();///关闭记录集
: m$ A. `4 g; rCString message;
* t# Q& g$ R; |3 x. ~message.format("共有%d条记录",vCount.lVal);
1 Q* V% }0 \1 g8 C% {/ M( P. z+ DAfxMessageBox(message);///显示当前记录条数
! n7 q* ]" o. H
& X) Y; O* [" K' p2 T* G7 ^(2)利用Command对象来执行SQL命令 8 Y6 r5 f6 d* ^  `2 e6 [

$ A; |6 N" ^( u_CommandPtr m_pCommand;
  N4 }! P3 r) a  G/ C  d( ~2 am_pCommand.CreateInstance("ADODB.Command");+ z& |+ o5 A, V- O. [
_variant_t vNULL;. ^( `" p6 s( `: ?4 v, ~4 m
vNULL.vt = VT_ERROR;
, g; c& f8 d8 O0 [vNULL.scode = DISP_E_PARAMNOTFOUND;///定义为无参数
! A2 E) f- x: d$ t- }& m9 a, \m_pCommand->ActiveConnection = m_pConnection;///非常关键的一句,将建立的连接赋值给它
, c* [! A% f# u$ S/ _1 r' Zm_pCommand->CommandText = "SELECT * FROM users";///命令字串7 T5 N# r$ N; q0 [5 c2 D( {5 P5 w
m_pRecordset = m_pCommand->Execute(&vNULL,&vNULL,adCmdText);///执行命令,取得记录集/ f1 ?1 V* n7 F# ?  X- f

# C+ Y8 d+ D* H  在这段代码中我们只是用Command对象来执行了SELECT查询语句,Command对象在进行存储过程的调用中能真正体现它的作用。下次我们将详细介绍。 : t: W  B. \! H$ J( A
4 q0 d7 T) |& M/ U) |  E
  (3)直接用Recordset对象进行查询取得记录集
- ?& g1 F: A' W1 n' @6 w* Z4 A
, ]' ?7 c) F4 B& T' X  实例—— 6 k2 B, a7 A, r. Z( |! B! y
# }( i) ^- A( j/ \% G' m9 n
void CGmsaDlg::OnDBSelect()
" |- v2 G5 m2 Q- N+ N{
# w! O; V8 w3 U// TOD Add your control notification handler code here# S) Q% H* J+ m# U3 v% s
_RecordsetPtr Rs1; //定义Recordset对象
- v. N: \" Z$ B6 n" }7 q_bstr_t Connect("DSN=GMS;UID=saWD=;");//定义连接字符串$ b& v# @0 I: M( p5 I
_bstr_t Source ("SELECT count(*) FROM buaa.mdb010"); //要执行的SQL语句
. f  k- o' r: A3 J+ k::CoInitialize(NULL); //初始化Rs1对象
2 l3 D$ F2 ^9 m; \HRESUL hr = Rs1.CreateInstance( __uuidof( Recordset ) );
( M' C& j5 {6 t' B% l, o//省略对返回值hr的判断 + y! R2 m! r. c. [
Rs1->Open( Source,
- V- K, P5 N4 Y6 }* n' xConnect,
9 p2 B( M$ O0 c* H$ @adOpenForwardOnly,+ {! N/ ~/ S4 K( O9 Z9 L1 ]
adLockReadOnly,# F' G0 y9 V6 G+ q" L$ Z9 V
-1 );
' c& F8 T, j; L7 C+ x, e_variant_t temp=Rs1->GetCollect(_variant_t((long)0));
5 B' Y  e9 A& v) y5 T$ [CString strTemp=(char* )(_bstr_t)temp;# w( d5 f6 C/ R
MessageBox("OK!"+strTemp);
2 u: _4 f0 p$ l+ a}" n) Q; a) l$ Q" x7 z, _- e3 L7 z

# f$ Y5 s7 ^2 G6 q4 J例如 $ D+ F7 P0 a( \
m_pRecordset->Open("SELECT * FROM users",
7 P2 ?0 v5 |% `( }- \_variant_t((IDispatch *)m_pConnection,true),% c# N8 g& U$ t% Q
adOpenStatic," z4 X$ w  K! u& h
adLockOptimistic,
  ^, G9 ?- A( ~2 y% J; _* {adCmdText);
+ j. F# J" }, A- i1 L- y# ^7 C$ U  @6 W
Open方法的原型是这样的:6 p: M1 r( V; S) o7 O* {/ Q
HRESULT Recordset15::Open ( const _variant_t & Source, - t. ~) G. b( S( p6 ]6 \5 h
const _variant_t & ActiveConnection, ; b$ f. `2 o; q( V! t/ t/ H
enum CursorTypeEnum CursorType, ! W- G5 ~  @5 i% G, E; N: X
enum LockTypeEnum LockType, + E( q. R) I* h1 h, B7 j
long Options )
6 b0 M& q5 s4 C" x! T$ w4 l% Y5 [  L) x) d6 z
其中:' e8 s" f; U4 L% T5 O: K

+ Y$ x- n; M& Q6 e①Source是数据查询字符串
& t  B' B, l/ R& B②ActiveConnection是已经建立好的连接(我们需要用Connection对象指针来构造一个_variant_t对象) % [$ E2 e) d0 ]
③CursorType光标类型,它可以是以下值之一,请看这个枚举结构:
9 C* y6 K( S' s3 q  A# }+ A
7 h7 f# X7 a3 K1 B& {enum CursorTypeEnum9 t9 y6 h2 t! B( G) b# B& t
{' ~2 b: P0 _+ u6 e3 d
adOpenUnspecified = -1,///不作特别指定
/ i- e" }5 f/ {9 oadOpenForwardOnly = 0,///前滚静态光标。这种光标只能向前浏览记录集,比如用MoveNext向前滚动,这种方式可以提高浏览速度。但诸如BookMark,RecordCount,AbsolutePosition,AbsolutePage都不能使用
7 Y0 v/ H- y" e0 [' o* ^9 U9 ?adOpenKeyset = 1,///采用这种光标的记录集看不到其它用户的新增、删除操作,但对于更新原有记录的操作对你是可见的。. y, O  e) O: |6 c  e( o8 _" i

) B7 K" \$ J7 _0 `adOpenDynamic = 2,///动态光标。所有数据库的操作都会立即在各用户记录集上反应出来。4 `+ \6 P3 D7 X/ X. H
adOpenStatic = 3///静态光标。它为你的记录集产生一个静态备份,但其它用户的新增、删除、更新操作对你的记录集来说是不可见的。- t1 Z4 T. f( ?) g& l( V
};# M1 ]7 D: A' f  C& H; q0 m5 n
④LockType锁定类型,它可以是以下值之一,请看如下枚举结构:* L4 ~3 {, `$ G
0 u+ P. ]) c, D+ H3 ^0 k, T7 y* V
enum LockTypeEnum. E/ s0 P: b! i3 b6 J
{8 M3 x5 c* k" B" W
adLockUnspecified = -1,///未指定
2 y+ I5 P* C% ^adLockReadOnly = 1,///只读记录集; [; w# g3 c1 G$ u$ R) R, A
adLockPessimistic = 2,悲观锁定方式。数据在更新时锁定其它所有动作,这是最安全的锁定机制
/ M) i" T; y  t7 M6 T' PadLockOptimistic = 3,乐观锁定方式。只有在你调用Update方法时才锁定记录。在此之前仍然可以做数据的更新、插入、删除等动作0 I6 i  S& |$ u5 X. H, S" v1 M
adLockBatchOptimistic = 4,乐观分批更新。编辑时记录不会锁定,更改、插入及删除是在批处理模式下完成。4 d2 `8 _) `0 n" J7 q
};
- D; u- I1 n: I6 l/ X/ U* \& G' e9 r! ?) |4 c- M* E% G
⑤Options可以取如下值之一:
5 J& Z( B6 S2 M; L5 n3 @& jadCmdText:表明CommandText是文本命令
/ K# L) }* d4 i" d! K/ iadCmdTable:表明CommandText是一个表名
+ J/ \7 K. Y+ U! R: O1 VadCmdProc:表明CommandText是一个存储过程) M, h2 B* v5 N& H" R0 Q1 V* ~- u
adCmdUnknown:未知
zan
转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
如果我没给你翅膀,你要学会用理想去飞翔!!!
您需要登录后才可以回帖 登录 | 注册地址

qq
收缩
  • 电话咨询

  • 04714969085
fastpost

关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

手机版|Archiver| |繁體中文 手机客户端  

蒙公网安备 15010502000194号

Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

GMT+8, 2026-4-18 11:57 , Processed in 0.436676 second(s), 52 queries .

回顶部