QQ登录

只需要一步,快速开始

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

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

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

206

主题

2

听众

882

积分

升级  70.5%

该用户从未签到

新人进步奖

跳转到指定楼层
1#
发表于 2005-3-30 22:53 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
4.执行SQL命令并取得结果记录集
6 Z8 ~4 v8 u- x: c" ~3 n& L/ F9 ]. Y2 y, r2 u& {/ ^0 l
  为了取得结果记录集,我们定义一个指向Recordset对象的指针:_RecordsetPtr m_pRecordset;
! r* H5 u4 o1 J# {  s  ~并为其创建Recordset对象的实例: m_pRecordset.CreateInstance("ADODB.Recordset");" C$ M: |5 m; U* n# H' d& f6 P
SQL命令的执行可以采用多种形式,下面我们一进行阐述。$ d, i; j4 H. z

& s, Q  G; B: E( \  (1)利用Connection对象的Execute方法执行SQL命令5 t3 X1 ?, ~, k  ?

' f. r; g; n' P9 }  Execute方法的原型如下所示:# h( |* ~# ]( o% M  B5 F
! d. x9 m1 {! Y* A* ]  v; [' n
_RecordsetPtr Connection15::Execute ( _bstr_t CommandText, VARIANT * RecordsAffected, long Options )
2 u; k9 c0 j9 v. B% \+ S: Z
3 r% i7 T' ^: f+ M- j其中CommandText是命令字串,通常是SQL命令。2 k3 E; z7 J4 H4 T: Q3 s
参数RecordsAffected是操作完成后所影响的行数, 1 V/ ~# s9 ~  n. h. Q; Y% m
参数Options表示CommandText中内容的类型,Options可以取如下值之一:
) {4 Q, @  A7 F* w% u9 HadCmdText:表明CommandText是文本命令- c$ {( P6 B% D) c
adCmdTable:表明CommandText是一个表名- Z8 H! Y- w0 z% M
adCmdProc:表明CommandText是一个存储过程
% d: K3 d: h) w7 }/ o( QadCmdUnknown:未知
; c' T2 S. u" Q7 Y) u" l  @% @! Y8 S6 M" `8 W
Execute执行完后返回一个指向记录集的指针,下面我们给出具体代码并作说明。
: ^2 I' w7 }# v- j_variant_t RecordsAffected;; ^& j9 h8 l. l* X
///执行SQL命令:CREATE TABLE创建表格users,users包含四个字段:整形ID,字符串username,整形old,日期型birthday
4 w' U6 O% u' z( B( om_pConnection->Execute("CREATE TABLE users(ID INTEGER,username TEXT,old INTEGER,birthday DATETIME)",  }% h9 c, x5 I1 n4 W8 t+ t9 `
&RecordsAffected,
$ ?- x! @& Z5 M$ NadCmdText);
$ l# }! i5 g- X$ O( x/ ?0 `% `7 R
4 C- ^  @0 e* |7 X1 D4 O" ?- P///往表格里面添加记录
" H2 Z4 s( L0 W9 h9 R& lm_pConnection->Execute("INSERT INTO users(ID,username,old,birthday) valueS (1, ''''Washington'''',25,''''1970/1/1'''')",&RecordsAffected,adCmdText);" {8 l9 U" y+ F# U

, {+ ?, r( a+ F$ R& }- _///将所有记录old字段的值加一! z0 e3 `& N6 a( t* B
m_pConnection->Execute("UPDATE users SET old = old+1",&RecordsAffected,adCmdText);8 ~5 k2 o2 s5 F# j0 X: O
- o: f6 w% ~+ t+ t' h* A6 N
///执行SQL统计命令得到包含记录条数的记录集% A; H) ]1 H% W3 C! I2 `
m_pRecordset = m_pConnection->Execute("SELECT COUNT(*) FROM users",&RecordsAffected,adCmdText);' m9 r+ {7 b2 a
_variant_t vIndex = (long)0;# X- K: X( p$ u8 ?
_variant_t vCount = m_pRecordset->GetCollect(vIndex);///取得第一个字段的值放入vCount变量
+ p( E. A7 L5 _. L9 q上两句可以写成— _variant_t vCount = m_pRecordset->GetCollect((_variant_t)((long)0));
1 x" V/ `. I; u. Q2 K* b- H! m/ W( m- nm_pRecordset->Close();///关闭记录集7 j* L8 _1 j" N' n3 g; i. \
CString message;( _) w4 w$ u7 ^+ P
message.format("共有%d条记录",vCount.lVal);7 L) }: J" ?2 W. s, u, j7 z- F
AfxMessageBox(message);///显示当前记录条数8 D: H/ ?( Y' i1 Q

2 V0 y! G) W3 A! K* |# J) K& m(2)利用Command对象来执行SQL命令 $ C/ E4 j: a# V
( ^; Y" o% c3 z) a
_CommandPtr m_pCommand;, H/ _0 a, G# C, G
m_pCommand.CreateInstance("ADODB.Command");% S! B: p" d8 M6 W: j+ [, {
_variant_t vNULL;
" ]; n1 L9 K* _& Y: j1 ]vNULL.vt = VT_ERROR;. I# z. J& Q$ T2 `7 V
vNULL.scode = DISP_E_PARAMNOTFOUND;///定义为无参数
  \4 _4 x3 y1 O, Nm_pCommand->ActiveConnection = m_pConnection;///非常关键的一句,将建立的连接赋值给它4 Q" q6 P! O+ g0 g# }
m_pCommand->CommandText = "SELECT * FROM users";///命令字串
+ B5 M/ W0 \* U7 N* i5 o$ S* lm_pRecordset = m_pCommand->Execute(&vNULL,&vNULL,adCmdText);///执行命令,取得记录集
0 t$ x" Z  d$ A
8 N. o' H+ e  T# c( V) q  在这段代码中我们只是用Command对象来执行了SELECT查询语句,Command对象在进行存储过程的调用中能真正体现它的作用。下次我们将详细介绍。 & s/ R! _* G& T. K3 j' V
, J8 @7 K4 h1 {1 J9 K0 d! N0 K
  (3)直接用Recordset对象进行查询取得记录集
$ A+ O3 h9 Q* ^$ m" F2 P2 W& z0 q& o% V6 F5 _! d! ~
  实例—— 0 p( b9 v9 L) `9 V9 V3 H
; o* [$ m" f! o" H: G# p4 [
void CGmsaDlg::OnDBSelect() / a! D+ w3 i: d9 U) j
{
- i* R/ z4 Y6 b2 [& K( m4 V" p% j5 ^// TOD Add your control notification handler code here, B) m6 f# D* s) K( d* o- f- ?7 u
_RecordsetPtr Rs1; //定义Recordset对象5 }" A5 c! a) Y" i6 d
_bstr_t Connect("DSN=GMS;UID=saWD=;");//定义连接字符串  p0 t$ D7 s$ \" [
_bstr_t Source ("SELECT count(*) FROM buaa.mdb010"); //要执行的SQL语句
2 n& r( h# W4 O( N$ f::CoInitialize(NULL); //初始化Rs1对象& u" ~( s8 }+ A. x6 X: {
HRESUL hr = Rs1.CreateInstance( __uuidof( Recordset ) );2 {5 x* I( R% b4 l) r! }
//省略对返回值hr的判断
, B" n. g. W9 t8 X  qRs1->Open( Source,
! d! l' k' h6 ^4 w* JConnect,
  Q. L( m! }$ O' k: k/ r( ?adOpenForwardOnly,7 ~! l. \9 ]) ^9 F7 M( f" F+ u9 s
adLockReadOnly,
3 Q/ g4 \% t4 D( L  ~6 S-1 ); + |2 N; w/ F2 d, r. j
_variant_t temp=Rs1->GetCollect(_variant_t((long)0));
; T3 l) e. [2 \$ zCString strTemp=(char* )(_bstr_t)temp;3 H- k, v/ M- q" m
MessageBox("OK!"+strTemp);$ S2 v! O5 V/ c1 W! d
}
7 v. U$ f  b) k& Z; _, S4 K% E' `- p8 A; G
例如
/ Y9 U7 v) L2 L; u/ L7 `m_pRecordset->Open("SELECT * FROM users",
8 Y' n8 [7 f9 ]5 ?6 j/ M0 q_variant_t((IDispatch *)m_pConnection,true),
4 s: P4 ^- I+ V; R; kadOpenStatic,. Y, B- ~6 G+ y9 ^- T  M- @4 T
adLockOptimistic,* k9 d7 ^% |) g
adCmdText);& o' {+ Z& |6 |5 [; {( b3 C( E

# @) `3 P) k/ f+ E0 f& COpen方法的原型是这样的:, k3 N- C7 e1 E$ K
HRESULT Recordset15::Open ( const _variant_t & Source, $ m) W1 K3 l( k) E6 M5 ^
const _variant_t & ActiveConnection,
- d# Y; j9 T; S; Oenum CursorTypeEnum CursorType,
8 b4 l2 Z& d) @* henum LockTypeEnum LockType,
7 I2 I$ |+ s! J  `6 U' qlong Options ) ! C8 V0 U# w6 Z3 M# m. q

; _- @, L2 ]4 [# x其中:
; a! T! K, C% [/ F4 a- \6 N$ W# M, ^2 @
①Source是数据查询字符串
7 a2 F' G' Q* j0 q) [②ActiveConnection是已经建立好的连接(我们需要用Connection对象指针来构造一个_variant_t对象) 2 Q  M9 e8 ]# N  t" d1 \- l0 Z3 M
③CursorType光标类型,它可以是以下值之一,请看这个枚举结构:  K( r7 H6 H2 M$ L" W6 u
, Q9 f5 U7 s3 e& K( j: v& `
enum CursorTypeEnum- T3 W  w+ z0 q. K9 p9 U' }; `
{
6 ]/ R6 z9 y, j( u/ u: @adOpenUnspecified = -1,///不作特别指定
$ h6 a/ I3 l% K* s7 ]5 ladOpenForwardOnly = 0,///前滚静态光标。这种光标只能向前浏览记录集,比如用MoveNext向前滚动,这种方式可以提高浏览速度。但诸如BookMark,RecordCount,AbsolutePosition,AbsolutePage都不能使用
: X$ D# @; Z  r6 |9 qadOpenKeyset = 1,///采用这种光标的记录集看不到其它用户的新增、删除操作,但对于更新原有记录的操作对你是可见的。2 ~. \9 V6 a- Q
, }& c0 w, F: w
adOpenDynamic = 2,///动态光标。所有数据库的操作都会立即在各用户记录集上反应出来。9 P+ M4 ~5 V8 [# u$ f" I% j$ U
adOpenStatic = 3///静态光标。它为你的记录集产生一个静态备份,但其它用户的新增、删除、更新操作对你的记录集来说是不可见的。
) Y* |( y0 \1 B8 I/ _# b/ W  s$ X};2 P% T5 L3 j3 |
④LockType锁定类型,它可以是以下值之一,请看如下枚举结构:! \8 @4 B6 {/ P' E

& `) |( D& M1 l" e" |, L! Uenum LockTypeEnum! ^. N6 c; W- R  E) N. D
{
' {* I' w( K/ o; YadLockUnspecified = -1,///未指定
# F0 i1 F; W, ?3 O- }: WadLockReadOnly = 1,///只读记录集
8 S9 J8 ]4 w6 a& R) e, z! C8 k9 zadLockPessimistic = 2,悲观锁定方式。数据在更新时锁定其它所有动作,这是最安全的锁定机制
: q* R1 L8 s* R0 k& T2 PadLockOptimistic = 3,乐观锁定方式。只有在你调用Update方法时才锁定记录。在此之前仍然可以做数据的更新、插入、删除等动作5 {  d% N/ K, h& q3 p
adLockBatchOptimistic = 4,乐观分批更新。编辑时记录不会锁定,更改、插入及删除是在批处理模式下完成。
! W& ]" q/ t7 d( y6 j# R5 ?}; % G. J; H! O6 U  R0 u
9 B! l  o8 _+ C
⑤Options可以取如下值之一:
1 t, v5 H5 n3 `' q+ o* {adCmdText:表明CommandText是文本命令
/ a. E9 f8 ]) e4 _) z/ V0 t9 AadCmdTable:表明CommandText是一个表名
5 F% e4 G* E, Q! zadCmdProc:表明CommandText是一个存储过程
# Y  P3 |% V: f! gadCmdUnknown:未知
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 15:59 , Processed in 0.421523 second(s), 52 queries .

回顶部