|
|
请使用QQ关联注册PLM之家,学习更多关于内容,更多精彩原创视频供你学习!
您需要 登录 才可以下载或查看,没有账号?注册
×
UG NX二次开发访问数据库方式--ODBC访问图文教程
U( ]* }4 t, ], l+ k4 Z
2 B' _, w- {. y$ K5 Z. H. E2 ?
- [4 v% E; n8 e8 R# ] f3 P0 L. \1.1 配置ODBC数据源
h" [- U) d1 ^) h, H% W1、选择"控制面板"中的"管理工具"下面的"数据源 (ODBC)",如下图所示。; O4 _2 F. a. p2 z* B" u) A
2 x/ M+ v, l4 v
2、在弹出的ODBC数据源管理器对话框中,选择系统“DSN”,并单击"添加…"按钮,将出现创建新数据源对话框,如下图所示。2 S/ F! J' i. B, e$ ]+ u& ~
7 f) U. g7 a6 {# c
3、在创建新数据源对话框中,选择你将访问数据源相应的驱动程序,比如,我们将访问Access数据库中的数据,此时可选择“Microsoft Access Driver(*.mdb)”,选择后,单击“完成”按钮,此时,出现数据源相应驱动程序的选择界面,如下图所示。- n4 P& \9 F5 J/ a B
6 d9 Z8 j! |0 `$ M. u; c4、在驱动程序选择界面中,数据源名框中输入DSN的名称,比如,Screw。DSN的名称非常重要,它是后期访问数据源的唯一标识。输入DSN的名称后,可通过“选择(S) …”按钮选择相应数据源所在的路径,如果选择成功,将在界面出现已选中的数据源的完整路径和名称,如下图所示。
( t9 B8 j* U R2 u, y( ` ; M* a: n9 X4 y7 f! R! }* @
5、点击“确定”按钮,此时在“系统DSN”中就会出现你刚创建的ODBC数据源名,表明配置数据源成功。
7 p9 l) n. D, W: J
" w+ G2 x7 W& @# Q8 {5 ?. E! b1.2 读取ODBC数据源中的数据
) b# U- a- f6 P读取ODBC数据源中的数据时,经常使用到CDatabase(数据库类)、CRecordSet(记录集类) 。CDatabase类对象提供了对数据源的连接,通过它可以对数据源进行操作。CRecordSet类对象提供了从数据源中提取出的记录集进行操作。5 f1 ~9 {( l8 M& m. {
1、CDatabase类
& E: m' _0 {) g( r' }1 O4 n一个CDatabase对象代表与数据源的一个连接。创建一个CDatabase对象之后,调用Open或OpenEx成员函数指定一个DSN(数据源名)。一旦调用了这两个函数之一,就建立起了与DSN的底层数据源的连接。CDatabase对象通常与一个或多个记录集(CRecordset对象)一起使用。下面的例子是用一个CDatabase对象来建立与一个DSN的连接:
2 l5 e5 J7 W& r6 {& ]( o) W try{
; P; [, q+ G2 `) K) m: [7 M CDatabase db;
/ |, L7 E) R5 Y9 I+ A o4 _ db.Open("Screw"); // 建立与DSN(Screw)的连接; K- r" Q" ?: A7 x- g
// Use db8 b, G4 F6 T% a2 R" |9 m
...
4 d* l5 h! M* T& h! A db.Close(); //关闭先前建立的与DSN的连接. t: ~; z& R9 t$ H) j9 F
}
( a2 G+ {) ^: |1 L+ Q! kCDatabase构造函数并没有做很多事情,只有调用Open函数才能建立起与数据源的连接,因此,我们有必要先看一下这两个函数。2 D4 G) z* Z" ]& A/ @4 X
virtual BOOL Open(
; E3 d$ f9 I2 ?8 G% G LPCTSTR lpszDSN,. l0 B+ |# ]4 Z# ]2 Z6 q
BOOL bExclusive = FALSE,
) \4 V7 ]& Z9 ] BOOL bReadOnly = FALSE,
, ~3 ^8 x: R7 r LPCTSTR lpszConnect = _T("ODBC;"),5 T8 d7 _6 k( v h
BOOL bUseCursorLib = TRUE5 r2 R# Q a; B% E
);
" C& V/ N. I& \" \4 j% Q5 i4 p在Open函数原型中,有几个选项在打开数据库连接的时候可以指定,但通常只需要提供第一个参数。在前面的例子中,这第一个参数是我们在前面建立的DSN的名称。5 Z7 c1 b% r" U5 l2 T
bExclusive参数指定是否允许其他应用程序对数据源的连接。bExclusive为FALSE时表示允许多个程序共享打开的数据源。bExclusive为TRUE时,在老版本的类库中并不支持,会引发一个断言错误,在.net中应该支持。4 @3 N4 a1 N9 F9 M7 u
bReadOnly参数允许应用程序指定建立连接之后,是否可以更新数据源。FALSE是默认值,表示可以通过这个连接来更新数据源。任何被创建并附属于这个CDatabase的CRecordset对象都自动继承这个值。
) g0 }1 N$ T* V9 v1 p1 qlpszConnect参数指定连接字符串。使用这个参数的好处是灵活性,如果数据源指定了用户ID和密码,可以通过lpszConnect参数来实现。上面的例子中,如果我们的数据源指定了用户ID为UgUser,密码为110,那么可以有两种使用Open成员函数的方式:
# L4 i* \" d; A db.Open(
. ^& i8 A2 J8 H* ^6 k4 ~ _T("Standard Part"),
8 l( H5 M8 f6 z$ O FALSE,% m3 l. V) O) |3 p+ m
FALSE,
1 f7 B1 W, M" y; b _T("ODBC;UID=UgUser;PSW=110")," k$ T+ U% o# ^8 V# b7 ] ^
FALSE
: ?% Z$ R. Q$ s9 {- c" u, P$ R );5 x% ^* |' k3 L* I
db.Open(/ N* }. K: g5 I0 A
NULL,( b* _* W! p# R7 C- x
FALSE,
! n' h7 j" M2 ] FALSE,
" ]% ^* C5 n3 P) \# b% o _T("DSN=Standard Part;UID=UgUser;PSW=110"),- D) w' M, y/ f+ `. E; @
FALSE
: O- D* @7 p( G0 Q' X8 u );8 K5 v& A6 x( q
bUseCursorLib参数指定是否使用ODBC游标库,如果这个值被设置为TRUE(默认值),这个连接只允许静态快照或仅向前类型的游标。为了使用动态集,这个参数必须设置为FALSE。因为在后面我们要用到CRecordset类,所以上面程序段中的db.Open("Standard Pad")将会引起CRecordset类使用时的运行时错误(虽然与DSN的连接通过这一条语句能建立好),原因是bUseCursorLib参数未指定为FALSE。
7 z' c6 x5 n+ A8 A0 \9 \# VCDatabase::OpenEx仅使用两个参数:一个连接字符串和一个代表连接选项的DWORD。lpszConnectString向函数传递ODBC连接字符串,dwOptions参数设置这个连接的建立方式。下面的值可以通过逻辑操作符OR一起使用:
9 q0 ?4 h1 m% ~( w& j# GCDatabase::Exclusive
4 |1 f/ M7 t: i, I& C' aCDatabase::openReadOnly6 V+ `* B" d' I; q7 x; E- K
CDatabase::useCursorLib% f$ G( N; _+ a) w; T
CDatabase::noODBCDialog
/ t8 }" |: i5 ?* E \ B9 }% FCDatabase::forceODBCDialog
2 C( Y6 _% W, G9 E# r6 P$ p这些值与在Open函数中的使用方法完全一样,唯一的区别是增加了noODBCDialog和forceODBCDialog标志。这些标志确定当应用程序企图建立与数据源的连接时,ODBC Driver Manager是否给用户弹出ODBC连接对话框。
/ y- J" Y$ x* B I2、CRecordset类6 M" M4 E3 C e3 [ j
一个CDatabase对象代表与数据源的一个连接,而一个CRecordset对象(称为记录集)代表从一个数据源检索出的一组记录。
. [0 m d& A g- _% ACRecordset类支持动态集类型和快照类型。动态集,或称键集合驱动记录集,是数据的动态集合,它支持双向滚动并与数据源的其他用户做的更新保持同步。另一方面,快照则是在记录集被填充时数据的静态照片。这个记录集不受其他用户所做的更改的影响。如果使用快照类型记录集的应用程序需要查看其他用户做的改动,必须先关闭记录集再重新打开。快照类型记录集也支持双向滚动。! j, N7 q/ x: X# _3 Q" F0 m" Y! Q
+ f0 u- e8 V0 U# t
5 a9 i! ~5 `$ r& S
% Y: Z+ W+ y( c# w
9 Z* u- Z$ m# r1 d; Z, o' L& c! `8 D
2 h6 l: F2 T+ w6 m+ d+ |: U& o- K; O( x" n1 M T5 G# B& K
/ g% e2 z$ Y/ f# P
, q b$ } n* G) q+ \6 j* m
& h [( I! d, E( ]( O# Q$ T7 I+ u
|
|