|
|
请使用QQ关联注册PLM之家,学习更多关于内容,更多精彩原创视频供你学习!
您需要 登录 才可以下载或查看,没有账号?注册
×
UG NX二次开发访问数据库方式--ODBC访问图文教程
/ V9 {* |( C( a1 U/ U0 l1 B8 ^" I4 l2 e% `! U
8 V0 }% o0 ^0 I* \9 t1.1 配置ODBC数据源& @3 e v% Q9 @$ e! [
1、选择"控制面板"中的"管理工具"下面的"数据源 (ODBC)",如下图所示。
! [" f" }9 r2 B/ d8 H# _, L9 u" g
9 d e8 G; D" w+ B1 f V
2、在弹出的ODBC数据源管理器对话框中,选择系统“DSN”,并单击"添加…"按钮,将出现创建新数据源对话框,如下图所示。
/ N+ M3 p' ^8 q* g
% ?, g. e2 v% `! P# o9 f% [' V% G3、在创建新数据源对话框中,选择你将访问数据源相应的驱动程序,比如,我们将访问Access数据库中的数据,此时可选择“Microsoft Access Driver(*.mdb)”,选择后,单击“完成”按钮,此时,出现数据源相应驱动程序的选择界面,如下图所示。
% V2 I3 M7 D( L C
( W/ J3 L( F" Q
4、在驱动程序选择界面中,数据源名框中输入DSN的名称,比如,Screw。DSN的名称非常重要,它是后期访问数据源的唯一标识。输入DSN的名称后,可通过“选择(S) …”按钮选择相应数据源所在的路径,如果选择成功,将在界面出现已选中的数据源的完整路径和名称,如下图所示。+ Q7 f7 D1 g- m2 s( M( u
, p& O2 Q: C, Q! D5、点击“确定”按钮,此时在“系统DSN”中就会出现你刚创建的ODBC数据源名,表明配置数据源成功。
* S( B3 o8 N3 j/ @ D, Q9 ^
- G) d0 {7 N( f1 b7 E1.2 读取ODBC数据源中的数据# o/ N( ~& Y# ^$ p
读取ODBC数据源中的数据时,经常使用到CDatabase(数据库类)、CRecordSet(记录集类) 。CDatabase类对象提供了对数据源的连接,通过它可以对数据源进行操作。CRecordSet类对象提供了从数据源中提取出的记录集进行操作。
* ~/ v; D& Q, P& w. e1、CDatabase类, X; N2 U. b8 d i9 h" i1 ~) c
一个CDatabase对象代表与数据源的一个连接。创建一个CDatabase对象之后,调用Open或OpenEx成员函数指定一个DSN(数据源名)。一旦调用了这两个函数之一,就建立起了与DSN的底层数据源的连接。CDatabase对象通常与一个或多个记录集(CRecordset对象)一起使用。下面的例子是用一个CDatabase对象来建立与一个DSN的连接:) J" ~2 W, C% I# ~9 X
try{
8 W5 [3 H! e% j CDatabase db;/ c3 a+ V6 {+ Y8 f! Y
db.Open("Screw"); // 建立与DSN(Screw)的连接
% B8 t6 U8 ~7 v) A n- t // Use db( V# @7 c$ H2 b' {" u0 `$ n
...
1 x6 B5 {, s4 {1 @, L* h db.Close(); //关闭先前建立的与DSN的连接, X! ?* D' d2 F8 ~* a1 n+ v; O5 t
}
' E* L9 G; a1 t( z, [CDatabase构造函数并没有做很多事情,只有调用Open函数才能建立起与数据源的连接,因此,我们有必要先看一下这两个函数。6 T ^% m3 F- C) \; j
virtual BOOL Open(
_' V4 A# q! X" X% j4 P LPCTSTR lpszDSN,* f+ h1 K2 J/ B7 C+ D, Z
BOOL bExclusive = FALSE,
' g! n: ~* h: ~8 M8 ~. S BOOL bReadOnly = FALSE,+ ~! L' K. @+ T/ C+ ?7 `2 O- a
LPCTSTR lpszConnect = _T("ODBC;"),$ U% y2 k( g& ]4 c
BOOL bUseCursorLib = TRUE
t: W, S- u$ h1 |( G);4 n2 h- d: k+ a# Y! l- \- }1 W2 m; @
在Open函数原型中,有几个选项在打开数据库连接的时候可以指定,但通常只需要提供第一个参数。在前面的例子中,这第一个参数是我们在前面建立的DSN的名称。9 w2 h8 V! ~" q; |5 y
bExclusive参数指定是否允许其他应用程序对数据源的连接。bExclusive为FALSE时表示允许多个程序共享打开的数据源。bExclusive为TRUE时,在老版本的类库中并不支持,会引发一个断言错误,在.net中应该支持。7 L* Y0 Q' z0 W0 P" X. Z9 i* t4 @
bReadOnly参数允许应用程序指定建立连接之后,是否可以更新数据源。FALSE是默认值,表示可以通过这个连接来更新数据源。任何被创建并附属于这个CDatabase的CRecordset对象都自动继承这个值。6 b5 S+ `, I' ?3 q: o* V9 |( G
lpszConnect参数指定连接字符串。使用这个参数的好处是灵活性,如果数据源指定了用户ID和密码,可以通过lpszConnect参数来实现。上面的例子中,如果我们的数据源指定了用户ID为UgUser,密码为110,那么可以有两种使用Open成员函数的方式:9 R7 O/ V& O1 v9 K1 |! q, ]0 K) _
db.Open(
9 q0 o! Y, j: }. N' @1 E _T("Standard Part"),9 i5 D' |9 S" O/ o
FALSE,
) s/ t/ i F( V1 l# r$ ~ FALSE,* ]3 s8 B m6 B+ g/ ?* J
_T("ODBC;UID=UgUser;PSW=110"),
9 k- v$ I1 g7 {+ h3 d B* T- B# X FALSE$ S* M" A0 s1 c0 d0 b8 C+ a) v
);
* s2 q9 ?. @9 S/ Y) I7 U db.Open(. P9 B1 g6 J; E3 U, t+ ~
NULL,
- A. j1 X/ j; p( N2 K7 z FALSE,
/ q/ ^6 }& E4 Y8 c) q3 g# U7 m3 c FALSE,7 U+ O7 \2 ?. B3 Z! q
_T("DSN=Standard Part;UID=UgUser;PSW=110"),
7 c+ }' |4 O7 m5 ^ FALSE
7 _& U+ S: Z: T7 T );
3 Z7 N% l' E7 {) [( b; LbUseCursorLib参数指定是否使用ODBC游标库,如果这个值被设置为TRUE(默认值),这个连接只允许静态快照或仅向前类型的游标。为了使用动态集,这个参数必须设置为FALSE。因为在后面我们要用到CRecordset类,所以上面程序段中的db.Open("Standard Pad")将会引起CRecordset类使用时的运行时错误(虽然与DSN的连接通过这一条语句能建立好),原因是bUseCursorLib参数未指定为FALSE。, W: T5 E* M4 Z6 g5 U0 S- J
CDatabase::OpenEx仅使用两个参数:一个连接字符串和一个代表连接选项的DWORD。lpszConnectString向函数传递ODBC连接字符串,dwOptions参数设置这个连接的建立方式。下面的值可以通过逻辑操作符OR一起使用:
; W$ d6 E( T4 Z' iCDatabase::Exclusive! K! G) J0 L( A2 M' f0 n: j
CDatabase::openReadOnly5 x! k( V, _7 O" B- D& i
CDatabase::useCursorLib6 k* ]* H d" Y: H
CDatabase::noODBCDialog' n+ _6 G( {( h2 o/ Q% N
CDatabase::forceODBCDialog
8 r; j" G/ L) N) M0 v7 I" G这些值与在Open函数中的使用方法完全一样,唯一的区别是增加了noODBCDialog和forceODBCDialog标志。这些标志确定当应用程序企图建立与数据源的连接时,ODBC Driver Manager是否给用户弹出ODBC连接对话框。
9 {# ~+ w( g1 S t; n6 d2、CRecordset类8 f: @ g2 R" t7 b9 r" x; e
一个CDatabase对象代表与数据源的一个连接,而一个CRecordset对象(称为记录集)代表从一个数据源检索出的一组记录。
4 o5 [# Z9 {9 {' Z! C" ~2 G: QCRecordset类支持动态集类型和快照类型。动态集,或称键集合驱动记录集,是数据的动态集合,它支持双向滚动并与数据源的其他用户做的更新保持同步。另一方面,快照则是在记录集被填充时数据的静态照片。这个记录集不受其他用户所做的更改的影响。如果使用快照类型记录集的应用程序需要查看其他用户做的改动,必须先关闭记录集再重新打开。快照类型记录集也支持双向滚动。0 {+ L. F1 y. y9 v0 W3 W
( |0 \5 [8 l1 Z" J0 }" F, E
9 G, [ Z( B" c2 k0 d7 o
& d" h& e0 [6 I9 H) G) L+ q5 d5 ]6 b) J( F6 \2 y" y
) L5 O& I1 J3 }: ?% H C4 ]4 t
4 i/ S& W5 m7 g% G: `
' ^( j' I: m6 X0 ^8 Z4 k% ?; ~
% A: N0 ^- G9 x, ^: F% R
7 |5 b' D9 f" `5 P8 v3 ?" ]% w7 r9 G |
|