QQ登录

只需要一步,快速开始

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

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

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

206

主题

2

听众

882

积分

升级  70.5%

该用户从未签到

新人进步奖

跳转到指定楼层
1#
发表于 2005-3-30 22:53 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
4.执行SQL命令并取得结果记录集* E, [+ D' [- T$ {8 N: L3 i
7 X. v2 r/ X: o. `
  为了取得结果记录集,我们定义一个指向Recordset对象的指针:_RecordsetPtr m_pRecordset;
' R" R2 u  t/ S, v9 G并为其创建Recordset对象的实例: m_pRecordset.CreateInstance("ADODB.Recordset");. x) n8 g( d5 f9 c) T/ f
SQL命令的执行可以采用多种形式,下面我们一进行阐述。
9 x5 O( X$ H! O9 B% m1 d  @& m. E  `, F& l* w" t1 {8 Z$ [$ V
  (1)利用Connection对象的Execute方法执行SQL命令
" F" F* v4 ?2 I+ S9 p: y1 }1 d
' f5 \* g% R# u1 N' M, c  Execute方法的原型如下所示:
7 O8 W% E7 j5 g. S5 S9 S+ O$ a. X" A0 D. Q
_RecordsetPtr Connection15::Execute ( _bstr_t CommandText, VARIANT * RecordsAffected, long Options )
5 p1 T$ D8 b' K" ^% W
- j: D: a" H8 e0 }其中CommandText是命令字串,通常是SQL命令。/ p$ {0 @$ q( w+ D1 C* C6 K3 r. r
参数RecordsAffected是操作完成后所影响的行数, # D8 }( X* t: e5 G9 x
参数Options表示CommandText中内容的类型,Options可以取如下值之一:
3 h% W: `2 i: g; r  S5 ~adCmdText:表明CommandText是文本命令
* D, V4 i2 U: Q. b, tadCmdTable:表明CommandText是一个表名
2 i+ v# L  G0 }adCmdProc:表明CommandText是一个存储过程
/ X+ g" Q) i* x- g6 j/ jadCmdUnknown:未知
3 C. y# Z: R+ I! L* }" I4 I$ T% K, r! M$ g; Q# S' z
Execute执行完后返回一个指向记录集的指针,下面我们给出具体代码并作说明。
/ R7 d0 E2 C, X7 |0 v_variant_t RecordsAffected;
0 f2 k& I% l. h4 u) ^  Q: a///执行SQL命令:CREATE TABLE创建表格users,users包含四个字段:整形ID,字符串username,整形old,日期型birthday5 ~0 }& y' O/ I- a% U! A' g
m_pConnection->Execute("CREATE TABLE users(ID INTEGER,username TEXT,old INTEGER,birthday DATETIME)",
' C' b- `" O7 t5 d&RecordsAffected,
% F% o3 d) B( s" N/ madCmdText);9 r+ V4 D8 O' L+ }2 `, P
3 n- f. }% Q9 d6 }2 Q, h! t
///往表格里面添加记录: T* ^& e; t" V/ L) b; d5 q
m_pConnection->Execute("INSERT INTO users(ID,username,old,birthday) valueS (1, ''''Washington'''',25,''''1970/1/1'''')",&RecordsAffected,adCmdText);1 }  _4 O2 V( q0 {( A' S

% Q% i* Q5 l+ N///将所有记录old字段的值加一' h! P* A  U' P1 R4 _
m_pConnection->Execute("UPDATE users SET old = old+1",&RecordsAffected,adCmdText);- l# L9 N: z, O3 S2 u
) Q# M+ D" ]; q8 m" _
///执行SQL统计命令得到包含记录条数的记录集+ v! E0 U, `$ b* j0 b; V  o
m_pRecordset = m_pConnection->Execute("SELECT COUNT(*) FROM users",&RecordsAffected,adCmdText);4 W1 i$ h( s% y& w
_variant_t vIndex = (long)0;# F, T( h9 N9 b$ D* D, o/ ?
_variant_t vCount = m_pRecordset->GetCollect(vIndex);///取得第一个字段的值放入vCount变量- D) p; h1 r9 b* ?
上两句可以写成— _variant_t vCount = m_pRecordset->GetCollect((_variant_t)((long)0));
7 I: ^% L+ x3 a3 ]. ^/ x7 K* a% Wm_pRecordset->Close();///关闭记录集
2 E9 I  B, b  X/ o& jCString message;
% S+ u# b6 m2 X6 O; @+ x; W$ tmessage.format("共有%d条记录",vCount.lVal);
$ ~: m6 e, x, ?% NAfxMessageBox(message);///显示当前记录条数! a/ Z6 \' B# g4 o

) j0 }  N8 v* W3 N2 h- ?9 [(2)利用Command对象来执行SQL命令
3 }# {& e& ~9 I8 R$ k& P; ]& o5 Y/ X) m' P7 e. [
_CommandPtr m_pCommand;+ B4 C0 |+ E' o! e+ X4 G
m_pCommand.CreateInstance("ADODB.Command");; P0 X9 S5 U0 b; D3 p
_variant_t vNULL;' x5 ^' H0 }, N8 Y" a1 S
vNULL.vt = VT_ERROR;
9 H! Y% a' x6 v, `% k" KvNULL.scode = DISP_E_PARAMNOTFOUND;///定义为无参数
; P8 P& h: ?; E* |9 K. g! W0 lm_pCommand->ActiveConnection = m_pConnection;///非常关键的一句,将建立的连接赋值给它
- `# {1 A. k3 g2 i/ L  T) `5 dm_pCommand->CommandText = "SELECT * FROM users";///命令字串  o" ?- ?! Q. y' U/ n
m_pRecordset = m_pCommand->Execute(&vNULL,&vNULL,adCmdText);///执行命令,取得记录集
$ E6 f/ _. d; Z
# @, `% r! Q5 ?% @9 d" e  在这段代码中我们只是用Command对象来执行了SELECT查询语句,Command对象在进行存储过程的调用中能真正体现它的作用。下次我们将详细介绍。 9 J) G& i( U6 L6 W! C8 j5 Q3 {
: I% j6 o: Z8 P# A+ V5 a0 A& E% f+ m
  (3)直接用Recordset对象进行查询取得记录集3 k6 S. A! D- c% t& v( U1 e: u

$ H; K. b" _) C  实例—— 5 g# |7 Z+ O& u

/ k# S' v7 D" d) j, w# d+ ^$ ^void CGmsaDlg::OnDBSelect()
7 d% _$ G( S2 {6 y1 ~{, [  I+ F- p( {
// TOD Add your control notification handler code here- ]/ h# `, c& H* C$ o
_RecordsetPtr Rs1; //定义Recordset对象
  @( h) R, R; `1 f_bstr_t Connect("DSN=GMS;UID=saWD=;");//定义连接字符串' m" ~" t  o# Z' \: ]+ O
_bstr_t Source ("SELECT count(*) FROM buaa.mdb010"); //要执行的SQL语句
6 o& C1 |. c1 h! m::CoInitialize(NULL); //初始化Rs1对象
% D9 H* ?4 h" e; c4 Y# M( cHRESUL hr = Rs1.CreateInstance( __uuidof( Recordset ) );
4 u2 {+ ~: b" J( e% w2 D//省略对返回值hr的判断 2 r  C. x( V& t* L: f8 K
Rs1->Open( Source,( W2 `0 n+ g/ K) f
Connect,+ @" e/ ^/ U* h& p" v
adOpenForwardOnly,
9 b8 ]( f7 ]3 ]7 r& i0 o* ~adLockReadOnly,
# x- v# h: a3 l: u4 D-1 );
  ^+ i  n% W* S_variant_t temp=Rs1->GetCollect(_variant_t((long)0));$ y6 b/ j$ t4 j8 w$ L7 h2 g
CString strTemp=(char* )(_bstr_t)temp;
- P" N& T+ h& OMessageBox("OK!"+strTemp);
* W, i/ w( M: Y/ O8 \, c, L}; }9 V/ ?7 H# P$ M$ Z! T. S8 }0 U

( A4 G1 D$ Q/ C例如 + R/ F% j; z9 [2 j: s
m_pRecordset->Open("SELECT * FROM users",
! \+ w) n% i; B8 }/ \# J5 e_variant_t((IDispatch *)m_pConnection,true),3 o$ I* f& z0 r
adOpenStatic,
- e. c: }* ]% U  g8 v2 @, C* q9 oadLockOptimistic,
' f% |) l# L- G* m8 YadCmdText);
* }  N+ h* r2 O. o% u" ?
" O; \% i: u: [' s* u* M; jOpen方法的原型是这样的:9 f. Z+ B) b& W  o
HRESULT Recordset15::Open ( const _variant_t & Source, * s+ {. }& {+ z8 l; U* j7 ~9 I" I& d
const _variant_t & ActiveConnection,
; K; ?9 j2 h4 `9 y$ uenum CursorTypeEnum CursorType, 2 Z; {$ O  W5 s4 w$ v- w
enum LockTypeEnum LockType, & Y, ~- M& P8 U' b% S
long Options )
7 L( D. L1 Q+ _$ x# r3 ~% S9 y  p
其中:5 [. ], B0 M# t: Y- R8 O5 Q
) S$ N$ `% u+ O  F6 P
①Source是数据查询字符串
" ]& y8 o' W* c- A②ActiveConnection是已经建立好的连接(我们需要用Connection对象指针来构造一个_variant_t对象)
# @/ p" Q8 J( d  I2 m# A/ P③CursorType光标类型,它可以是以下值之一,请看这个枚举结构:3 e( u" L2 \" a% }/ N; S

$ E  c- K% h9 L( V/ Z9 Fenum CursorTypeEnum+ v5 k0 K$ C: }8 o. K7 b/ y
{$ \5 }' S3 O4 J
adOpenUnspecified = -1,///不作特别指定# F+ [# k/ t$ M1 g9 \
adOpenForwardOnly = 0,///前滚静态光标。这种光标只能向前浏览记录集,比如用MoveNext向前滚动,这种方式可以提高浏览速度。但诸如BookMark,RecordCount,AbsolutePosition,AbsolutePage都不能使用
: U' X' r" x" n. C& uadOpenKeyset = 1,///采用这种光标的记录集看不到其它用户的新增、删除操作,但对于更新原有记录的操作对你是可见的。
9 n/ U7 \* _# j9 R& J' {
8 ?* i9 v. l6 l6 DadOpenDynamic = 2,///动态光标。所有数据库的操作都会立即在各用户记录集上反应出来。( T2 g' y+ H/ E
adOpenStatic = 3///静态光标。它为你的记录集产生一个静态备份,但其它用户的新增、删除、更新操作对你的记录集来说是不可见的。
+ @% i6 z: P6 D8 Z/ t2 w: \};
  x: k- {2 o- ?8 p④LockType锁定类型,它可以是以下值之一,请看如下枚举结构:
- N/ r( ]0 i7 [8 Y& W- Y: \
3 K" S$ R3 m5 ^! M+ Z, w  Denum LockTypeEnum( S1 [( F8 ?6 I. G7 i
{
4 D$ G/ B: A7 Y: {adLockUnspecified = -1,///未指定
2 y( ?1 [5 G. X+ ?' s6 o4 J& yadLockReadOnly = 1,///只读记录集
& A! B7 ]: S& ^adLockPessimistic = 2,悲观锁定方式。数据在更新时锁定其它所有动作,这是最安全的锁定机制* y) Z5 `9 E9 q* Q2 A( v- Z& V
adLockOptimistic = 3,乐观锁定方式。只有在你调用Update方法时才锁定记录。在此之前仍然可以做数据的更新、插入、删除等动作
, @$ k9 C) H* P5 \) g# oadLockBatchOptimistic = 4,乐观分批更新。编辑时记录不会锁定,更改、插入及删除是在批处理模式下完成。4 y0 }* q  u) N8 s* u
};   D( ~# O" Y5 z& V: R* |7 F+ g

; S+ L. S9 c) `0 f⑤Options可以取如下值之一:
1 y- ?5 q; S2 S. j3 radCmdText:表明CommandText是文本命令
: V+ A% b  Q. ]! B  e7 H2 ]adCmdTable:表明CommandText是一个表名9 @  l" ~, P% A4 a6 J
adCmdProc:表明CommandText是一个存储过程
4 O$ S3 k. X% F8 \8 _0 D" X" g+ \, o' WadCmdUnknown:未知
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-6-3 17:12 , Processed in 0.445359 second(s), 51 queries .

回顶部