QQ登录

只需要一步,快速开始

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

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

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

206

主题

2

听众

882

积分

升级  70.5%

该用户从未签到

新人进步奖

跳转到指定楼层
1#
发表于 2005-3-30 22:53 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
4.执行SQL命令并取得结果记录集: t6 a; U  i2 n- l& R2 H
/ H. A2 m" j& O/ z5 M- Y( f& d
  为了取得结果记录集,我们定义一个指向Recordset对象的指针:_RecordsetPtr m_pRecordset;( g% {0 q  D+ l2 ]0 X8 K9 U
并为其创建Recordset对象的实例: m_pRecordset.CreateInstance("ADODB.Recordset");
  Q& S4 _' O) DSQL命令的执行可以采用多种形式,下面我们一进行阐述。
1 V7 q7 i: I) v1 d# K* S# o: C/ F
* r$ s( r/ ~$ W7 v% y' j  (1)利用Connection对象的Execute方法执行SQL命令. ^1 P) R6 o8 ^5 g3 ^% t, r
0 g: j+ K" v& j4 J
  Execute方法的原型如下所示:
5 c$ @9 F. _0 D
7 k% B" U' R: g8 k_RecordsetPtr Connection15::Execute ( _bstr_t CommandText, VARIANT * RecordsAffected, long Options ) " y7 T: O9 F9 J$ Y

; N; `0 F- b8 a. ?其中CommandText是命令字串,通常是SQL命令。
2 ?/ R& U3 I" \3 M参数RecordsAffected是操作完成后所影响的行数,   Y' ~' K8 G( ?7 M7 [7 k
参数Options表示CommandText中内容的类型,Options可以取如下值之一:
9 T. }6 Z" o* P9 y2 IadCmdText:表明CommandText是文本命令3 d3 @) G0 n) k! J: p; m4 ~3 `
adCmdTable:表明CommandText是一个表名
, A8 z) ^5 p% g0 A; oadCmdProc:表明CommandText是一个存储过程. o0 H2 g  l3 V3 d/ P
adCmdUnknown:未知7 X" |5 a% B7 w" e) v  K
2 h, a4 B  W, c+ A. _1 b
Execute执行完后返回一个指向记录集的指针,下面我们给出具体代码并作说明。 ; S6 W1 u1 _8 B3 a. L
_variant_t RecordsAffected;/ B9 o. }% i" w! A" D
///执行SQL命令:CREATE TABLE创建表格users,users包含四个字段:整形ID,字符串username,整形old,日期型birthday- P" a8 Y6 y- M" E+ z
m_pConnection->Execute("CREATE TABLE users(ID INTEGER,username TEXT,old INTEGER,birthday DATETIME)",
8 u4 Z$ Y; ]+ w* Q( k# W5 S&RecordsAffected,
% r3 n6 U2 O# V! _. D" AadCmdText);" I! f+ t  f; K6 H; j4 e

8 p! e  o; _% O1 ^  l///往表格里面添加记录
4 h+ e' _7 J* @; r  |/ N( Tm_pConnection->Execute("INSERT INTO users(ID,username,old,birthday) valueS (1, ''''Washington'''',25,''''1970/1/1'''')",&RecordsAffected,adCmdText);4 B6 {* O+ V2 p5 K
5 s+ I* y( N5 k& N% M  ~
///将所有记录old字段的值加一4 K: f' L# n4 B
m_pConnection->Execute("UPDATE users SET old = old+1",&RecordsAffected,adCmdText);& y9 F- e' ~3 C
7 M/ p  g7 a6 U6 T7 [
///执行SQL统计命令得到包含记录条数的记录集  y% I2 ]$ H+ S9 @; x' l+ B
m_pRecordset = m_pConnection->Execute("SELECT COUNT(*) FROM users",&RecordsAffected,adCmdText);8 Z3 r. w0 r7 `  A# J& V, ?
_variant_t vIndex = (long)0;! `+ |3 m; ~$ b/ G
_variant_t vCount = m_pRecordset->GetCollect(vIndex);///取得第一个字段的值放入vCount变量* f7 W3 q- ~. G+ j, T
上两句可以写成— _variant_t vCount = m_pRecordset->GetCollect((_variant_t)((long)0));
0 E5 x' f! U9 _; R" U5 z, j5 R6 Gm_pRecordset->Close();///关闭记录集( F/ `' o+ t# @1 T4 m9 P9 h& k0 X
CString message;+ d% r, i- e% I% Z
message.format("共有%d条记录",vCount.lVal);
; Q8 z# R+ n2 ~1 K4 c; ~AfxMessageBox(message);///显示当前记录条数
, `0 z6 S# l# l6 I
3 }! u0 F. N, l# Z4 v4 N(2)利用Command对象来执行SQL命令
: [( O! o7 K& r" u1 d; m6 }
  J" ]/ F+ I5 }' R_CommandPtr m_pCommand;
5 A- \$ B+ l# d" \* o* {m_pCommand.CreateInstance("ADODB.Command");1 V1 j) v! G& z" y8 `% `: F; z) |! x
_variant_t vNULL;$ ]0 l# M% N, `# }
vNULL.vt = VT_ERROR;0 p% ^  V1 c9 ^1 U4 E6 _, C3 L
vNULL.scode = DISP_E_PARAMNOTFOUND;///定义为无参数. A" a' n* r" C: q/ ~7 Y. L  A
m_pCommand->ActiveConnection = m_pConnection;///非常关键的一句,将建立的连接赋值给它6 N9 C. V1 M% J' ], T! S6 q8 H
m_pCommand->CommandText = "SELECT * FROM users";///命令字串
! m% ?7 C! X$ gm_pRecordset = m_pCommand->Execute(&vNULL,&vNULL,adCmdText);///执行命令,取得记录集9 q. @; f3 h5 i4 Z  C: l& j( {

( c) x2 B  Z6 k% T& w  在这段代码中我们只是用Command对象来执行了SELECT查询语句,Command对象在进行存储过程的调用中能真正体现它的作用。下次我们将详细介绍。
5 m9 O  p. v& H, Z* S- i- z1 l$ `1 K/ f" @' Y* k0 y
  (3)直接用Recordset对象进行查询取得记录集5 X# f) I5 C" q+ W+ n2 [
; |: k4 A' H0 U0 \6 A9 T
  实例——
' m; q7 n" k+ g: ~. t$ Q8 {3 E% r0 c8 N& t
void CGmsaDlg::OnDBSelect()
& E& ?* |' Q* G{
3 w7 e" `/ i5 F0 m+ P) f/ @* J/ r// TOD Add your control notification handler code here+ w+ F& W* y: h7 E* |1 s/ ^
_RecordsetPtr Rs1; //定义Recordset对象
+ @' M3 f/ t$ J+ y, b' b0 j_bstr_t Connect("DSN=GMS;UID=saWD=;");//定义连接字符串7 ?! ^2 I8 `% K" n- Y$ F. w
_bstr_t Source ("SELECT count(*) FROM buaa.mdb010"); //要执行的SQL语句
4 \9 S% v. V; g::CoInitialize(NULL); //初始化Rs1对象+ {3 h7 v* a7 I( _2 W
HRESUL hr = Rs1.CreateInstance( __uuidof( Recordset ) );& l  u* }! g1 T, W, k
//省略对返回值hr的判断
* F8 ^% h" n7 ^/ W, s+ Q: pRs1->Open( Source,
) a" C$ B& Y" n6 }4 M, fConnect,
* `9 V8 Q* u( V9 @- \: J$ k+ dadOpenForwardOnly,
4 A# M3 y. ^9 h7 p- ~adLockReadOnly,2 g: t, q0 A! Y! s* d
-1 );
+ b: E& r+ y5 R_variant_t temp=Rs1->GetCollect(_variant_t((long)0));
7 H8 ?0 l# |2 L' _CString strTemp=(char* )(_bstr_t)temp;& k/ n! n; v8 e: @4 h
MessageBox("OK!"+strTemp);3 s& r) _& I2 S; }5 E+ L' ?
}
: t6 n' U% h& A. T; {
! Y8 J  p8 x6 x- Q% U例如
2 U/ G# G( x; m3 X7 y/ z+ Om_pRecordset->Open("SELECT * FROM users",
5 [. Y6 j  s& b" Y, I% S; a! r5 ~_variant_t((IDispatch *)m_pConnection,true),
" p4 W0 G5 {, d3 badOpenStatic,
% C% w2 H- x& ]. A* j2 IadLockOptimistic,
! c' N( r8 h  m% }: l/ U( Q0 RadCmdText);
- C! `# v/ {$ ^  L2 c5 o
& q3 O* [+ r3 g: F) b9 n& F& v0 B, COpen方法的原型是这样的:
4 U! k; ]" Q$ b6 _! E- rHRESULT Recordset15::Open ( const _variant_t & Source,
4 d9 H$ ], p" M+ \' Econst _variant_t & ActiveConnection, ! w$ {; l; |$ x$ c, u5 d
enum CursorTypeEnum CursorType, % C, K' ^) b, R1 H! ^9 ^/ \
enum LockTypeEnum LockType,
: z* ?; }  D3 ?3 m1 Olong Options )
3 a/ l: W- _/ T* j* A
8 i" n( h  T0 C; g* j) c其中:
& n/ M3 M0 R" S+ w( f1 k3 }2 L# f3 G* t& C$ G7 [2 S/ ~
①Source是数据查询字符串. B5 |/ Y- K. }  T0 [! @" O
②ActiveConnection是已经建立好的连接(我们需要用Connection对象指针来构造一个_variant_t对象) $ O9 ?( h) w* Q) N
③CursorType光标类型,它可以是以下值之一,请看这个枚举结构:, m8 t) c3 j. N" v1 @$ s, V/ k
1 G, k6 D! ~& j# S
enum CursorTypeEnum# ?8 u2 G8 Y9 ~- o3 [. `
{$ q; [1 p! R8 P& P& M9 X; k4 X4 ~
adOpenUnspecified = -1,///不作特别指定# k, X- \8 w# i7 _! u
adOpenForwardOnly = 0,///前滚静态光标。这种光标只能向前浏览记录集,比如用MoveNext向前滚动,这种方式可以提高浏览速度。但诸如BookMark,RecordCount,AbsolutePosition,AbsolutePage都不能使用
; A3 n+ {* n8 Y1 b" `+ fadOpenKeyset = 1,///采用这种光标的记录集看不到其它用户的新增、删除操作,但对于更新原有记录的操作对你是可见的。* P8 e. o) r$ N

7 p4 m. d5 U4 F: t; y8 w/ H9 XadOpenDynamic = 2,///动态光标。所有数据库的操作都会立即在各用户记录集上反应出来。
$ g7 J# q3 x0 X" k8 eadOpenStatic = 3///静态光标。它为你的记录集产生一个静态备份,但其它用户的新增、删除、更新操作对你的记录集来说是不可见的。
7 }2 y5 S% W" F+ u# K! K, j};
5 ?% c- a0 \0 i2 F④LockType锁定类型,它可以是以下值之一,请看如下枚举结构:
, g# h2 u6 D% o7 b6 H* Y5 e5 Y
2 [8 ^& o* s3 ?; aenum LockTypeEnum! A+ x( Y  D$ X2 U$ O6 W
{& E* j. J4 O. W% F# t
adLockUnspecified = -1,///未指定
$ y# l4 n. a$ H7 V% |* r4 ?adLockReadOnly = 1,///只读记录集" i) D/ E+ d2 Y6 j4 @+ J2 G
adLockPessimistic = 2,悲观锁定方式。数据在更新时锁定其它所有动作,这是最安全的锁定机制$ t+ \5 z+ @+ M% z' o9 U: P% n3 y: v
adLockOptimistic = 3,乐观锁定方式。只有在你调用Update方法时才锁定记录。在此之前仍然可以做数据的更新、插入、删除等动作
5 W1 ]; r+ d: @adLockBatchOptimistic = 4,乐观分批更新。编辑时记录不会锁定,更改、插入及删除是在批处理模式下完成。
+ Z4 }; j6 ]1 j( s% _/ r1 q}; - C( t" j# b: m9 X8 X# w

$ e) L4 a& a1 ^; @; C⑤Options可以取如下值之一:
. ~: p. p% f- O( m1 TadCmdText:表明CommandText是文本命令
5 Y! v7 e& Z5 [6 q0 RadCmdTable:表明CommandText是一个表名8 E# p, S' h+ J3 q
adCmdProc:表明CommandText是一个存储过程5 l& a) U( t# q, W& y
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-17 07:17 , Processed in 0.657445 second(s), 51 queries .

回顶部