QQ登录

只需要一步,快速开始

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

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

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

206

主题

2

听众

882

积分

升级  70.5%

该用户从未签到

新人进步奖

跳转到指定楼层
1#
发表于 2005-3-30 22:53 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
4.执行SQL命令并取得结果记录集
% |! i2 e  k/ U8 y1 c7 @7 O$ b
& L& ^* t. D- |% N; r( @  为了取得结果记录集,我们定义一个指向Recordset对象的指针:_RecordsetPtr m_pRecordset;
3 [, d# d, I: j: q$ `+ l* J并为其创建Recordset对象的实例: m_pRecordset.CreateInstance("ADODB.Recordset");3 N$ b; v8 n' m% B% a, {
SQL命令的执行可以采用多种形式,下面我们一进行阐述。5 @1 H* n& C+ l' d

* j  R2 d- \+ L  ]+ b( S  (1)利用Connection对象的Execute方法执行SQL命令; {& [' Q5 D& A' ~
, P/ \! O+ z- s/ A) Y) @6 R
  Execute方法的原型如下所示:" z  o1 b9 _8 M4 G5 \' {7 w
5 E% ~& J) E+ r) n* [
_RecordsetPtr Connection15::Execute ( _bstr_t CommandText, VARIANT * RecordsAffected, long Options ) - ~; S9 j3 j+ W3 C! S3 g( b/ ?

; N" e; z: R2 h1 u其中CommandText是命令字串,通常是SQL命令。
& b% H) t3 T  d9 t* e8 ~4 B参数RecordsAffected是操作完成后所影响的行数,
  ~5 t5 \+ {# ]* L: D1 I* n+ C! u参数Options表示CommandText中内容的类型,Options可以取如下值之一:
$ T( c% C5 C/ }  r  W* U* XadCmdText:表明CommandText是文本命令. s# `3 F; J5 h7 C* G  c9 S
adCmdTable:表明CommandText是一个表名" a7 v3 a3 A: i" n- I4 l1 _# }- r
adCmdProc:表明CommandText是一个存储过程
2 R  k2 B8 f' h: a- x$ j( IadCmdUnknown:未知
5 {' u( n* ~) b) v# x+ Y7 P+ N& U& g
Execute执行完后返回一个指向记录集的指针,下面我们给出具体代码并作说明。
+ E( p  ?* E3 }* b_variant_t RecordsAffected;& B7 [- C+ O; o
///执行SQL命令:CREATE TABLE创建表格users,users包含四个字段:整形ID,字符串username,整形old,日期型birthday
1 l& `. O  {1 a" b1 l* Rm_pConnection->Execute("CREATE TABLE users(ID INTEGER,username TEXT,old INTEGER,birthday DATETIME)",
% V# Q! b# X' F$ _1 n&RecordsAffected,
' L0 \% K! t6 m+ P; X5 O0 NadCmdText);
* {! a3 S3 {( Y7 @! i; B7 ]' f! ~" A# H. |. [$ V8 P/ M5 Z
///往表格里面添加记录9 n4 U3 y$ i% g- E; j+ ~
m_pConnection->Execute("INSERT INTO users(ID,username,old,birthday) valueS (1, ''''Washington'''',25,''''1970/1/1'''')",&RecordsAffected,adCmdText);- D9 I: Q# \% E8 a

- m" g& }# s" O! M# G* l///将所有记录old字段的值加一7 x) c* O4 ]5 Y1 e0 |
m_pConnection->Execute("UPDATE users SET old = old+1",&RecordsAffected,adCmdText);8 M' d/ j( @. Q9 K2 B6 K, J
! L" S0 }3 s" Z4 K7 a# E
///执行SQL统计命令得到包含记录条数的记录集5 f; K+ R! `1 l; {
m_pRecordset = m_pConnection->Execute("SELECT COUNT(*) FROM users",&RecordsAffected,adCmdText);
1 s/ z6 w$ t, Z_variant_t vIndex = (long)0;% a% G+ [! N0 j; \( f% G/ W; k
_variant_t vCount = m_pRecordset->GetCollect(vIndex);///取得第一个字段的值放入vCount变量
# R5 X; {6 W) c5 p上两句可以写成— _variant_t vCount = m_pRecordset->GetCollect((_variant_t)((long)0));6 a  ~  C/ _" `$ O5 D
m_pRecordset->Close();///关闭记录集. S- b/ F' t3 ^. K) _2 O
CString message;
4 Q1 Q0 k9 N2 y. A3 Zmessage.format("共有%d条记录",vCount.lVal);
9 E7 }" {& E4 H2 {AfxMessageBox(message);///显示当前记录条数
2 l/ U5 b! B4 W: q  d: T2 e! V' m
9 }/ z% x- r; n+ f) }! @(2)利用Command对象来执行SQL命令
( n9 F* D; p" H9 _: b- L" V+ [3 l0 i  q  \  d6 E
_CommandPtr m_pCommand;
2 t/ D2 r' F) q9 l3 em_pCommand.CreateInstance("ADODB.Command");  x7 _! n6 s% ~+ [. Z: _" K1 R2 K: W
_variant_t vNULL;
3 j$ C  H  E! @8 F( \9 j; HvNULL.vt = VT_ERROR;: d# r8 E+ V- f5 {2 V! U8 z# H
vNULL.scode = DISP_E_PARAMNOTFOUND;///定义为无参数6 w+ A. R( ^+ N& M! E% b
m_pCommand->ActiveConnection = m_pConnection;///非常关键的一句,将建立的连接赋值给它% L/ Z4 x- _, s( Y# v7 q
m_pCommand->CommandText = "SELECT * FROM users";///命令字串
" e+ X5 }9 x/ E, P/ xm_pRecordset = m_pCommand->Execute(&vNULL,&vNULL,adCmdText);///执行命令,取得记录集
) }" V, L- N$ S5 d0 l8 N4 U  ?5 D/ j5 s. O
  在这段代码中我们只是用Command对象来执行了SELECT查询语句,Command对象在进行存储过程的调用中能真正体现它的作用。下次我们将详细介绍。 " D/ l) u! U8 F9 w6 l) `

: g) f6 V! H) m* c# e4 q, P( W) \  (3)直接用Recordset对象进行查询取得记录集# q) o) N- {$ J  W
% A' ?) M7 d2 i
  实例—— 7 V- V: E: U8 i* W- W1 }
. s$ X( _' F% J: |
void CGmsaDlg::OnDBSelect() ! o% K1 M. t1 l
{, g7 D; J" o' Q/ w8 l
// TOD Add your control notification handler code here9 ~  Q/ c. E5 n+ i3 \8 s0 j+ O
_RecordsetPtr Rs1; //定义Recordset对象+ j5 a& Z( ~9 ~& N
_bstr_t Connect("DSN=GMS;UID=saWD=;");//定义连接字符串' f/ k% T9 C0 M/ {  y6 b8 }8 C
_bstr_t Source ("SELECT count(*) FROM buaa.mdb010"); //要执行的SQL语句
/ E$ z/ E, K, M4 ^2 `::CoInitialize(NULL); //初始化Rs1对象
% |2 X! W, p. X% ~8 L6 r) zHRESUL hr = Rs1.CreateInstance( __uuidof( Recordset ) );6 j6 v2 I. X( J$ A( w+ W
//省略对返回值hr的判断
# K- ^! s  G) I: t- BRs1->Open( Source,
" ~, l0 j; {9 T& ?, N1 I' f* H/ @9 yConnect,
' |" H! n* f7 |; r9 ?, HadOpenForwardOnly,
0 O5 H* ]4 P7 Y& B5 CadLockReadOnly,
( w* r! ?3 q4 u' f-1 );
. p7 I/ @  N; l' ?& E" V) E_variant_t temp=Rs1->GetCollect(_variant_t((long)0));
- P! z' {: T" T; Z# D, dCString strTemp=(char* )(_bstr_t)temp;
# y5 r# x  g! t" {9 HMessageBox("OK!"+strTemp);; f6 g2 e( M. ~: c+ d( t7 m5 [' b# N  b
}
7 Y) [: H8 U* K6 P& \+ T1 L) F5 c2 `( [
例如 , ]9 V  b, p! }( n& v$ ]4 p9 W0 m
m_pRecordset->Open("SELECT * FROM users",% j- x9 [( r& N& O! t
_variant_t((IDispatch *)m_pConnection,true),# l2 D; T. l9 w
adOpenStatic,4 i" ~- R$ s2 a" d2 i6 f5 X. f
adLockOptimistic,
5 o; w2 \- Q- P3 [, b- k* d( V! radCmdText);
# c% s3 H2 C& C  B! D/ H* h
" A8 R& f! H: z. D( AOpen方法的原型是这样的:  `; C. e9 H, X* u8 o
HRESULT Recordset15::Open ( const _variant_t & Source,
0 }  u" Q, `# c6 Uconst _variant_t & ActiveConnection,
! V* L0 S+ `" V  `* s, xenum CursorTypeEnum CursorType,
/ K& o; E) L: Cenum LockTypeEnum LockType, - @5 E3 N8 J5 f, y. K0 w% i/ ]
long Options )
7 B2 h0 C4 T' v  l( c! j, X5 F$ f1 L8 ?7 k& X0 t
其中:. A- D8 Y9 f2 {" c; w

# v  U8 ?* d, N& r0 S% s; a1 K①Source是数据查询字符串
2 k) {$ ^3 s) R; P" d: [②ActiveConnection是已经建立好的连接(我们需要用Connection对象指针来构造一个_variant_t对象) $ W) n& U% s8 n" ?
③CursorType光标类型,它可以是以下值之一,请看这个枚举结构:
# n2 v+ [+ R. }! B: B! Q6 Z% }" D+ j% P- x
enum CursorTypeEnum
9 R' [9 W3 h' o3 b9 S. N{
& L. n! ^( M6 g9 jadOpenUnspecified = -1,///不作特别指定7 a# E+ O0 }0 \- X  T: ]) P4 }
adOpenForwardOnly = 0,///前滚静态光标。这种光标只能向前浏览记录集,比如用MoveNext向前滚动,这种方式可以提高浏览速度。但诸如BookMark,RecordCount,AbsolutePosition,AbsolutePage都不能使用
5 L5 V/ R7 y, u  M) s2 ]0 zadOpenKeyset = 1,///采用这种光标的记录集看不到其它用户的新增、删除操作,但对于更新原有记录的操作对你是可见的。$ R0 V8 E' W1 Q+ C

# s. i3 ~. }  _adOpenDynamic = 2,///动态光标。所有数据库的操作都会立即在各用户记录集上反应出来。
& c; D2 G) }! V( N& H, madOpenStatic = 3///静态光标。它为你的记录集产生一个静态备份,但其它用户的新增、删除、更新操作对你的记录集来说是不可见的。2 X" B7 A$ _/ [6 Y9 R+ Y
};& u" [) V3 x& z* E+ R4 A. z
④LockType锁定类型,它可以是以下值之一,请看如下枚举结构:1 s0 a" M; B* x9 S8 }6 s6 v/ [0 c

! k; n3 S4 `3 senum LockTypeEnum
/ a" w$ h: S/ m5 F" Z) S" a{6 Q" K/ j& n4 w' O# f1 n
adLockUnspecified = -1,///未指定3 @: S) w, j- `' ^% Y5 a# }
adLockReadOnly = 1,///只读记录集
& G$ C0 P% V( ]$ h/ padLockPessimistic = 2,悲观锁定方式。数据在更新时锁定其它所有动作,这是最安全的锁定机制- @! B2 R0 k8 R- C( {  a( T/ j/ H
adLockOptimistic = 3,乐观锁定方式。只有在你调用Update方法时才锁定记录。在此之前仍然可以做数据的更新、插入、删除等动作
) Q2 i8 ?. e4 J- f, DadLockBatchOptimistic = 4,乐观分批更新。编辑时记录不会锁定,更改、插入及删除是在批处理模式下完成。5 }1 q5 S2 Y; P- ^- `
}; & j5 V% M# M& {; ~

: T2 n. Z/ {, ^) ]# M⑤Options可以取如下值之一:: `- c5 H+ B/ s/ C
adCmdText:表明CommandText是文本命令& b: I9 k! d1 b# ^5 _8 T
adCmdTable:表明CommandText是一个表名# O8 b  B' M- |" h: `
adCmdProc:表明CommandText是一个存储过程  E, q8 ]* _$ y6 F
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-7-19 16:59 , Processed in 0.567655 second(s), 52 queries .

回顶部