找回密码
 注册会员

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 345|回复: 0

UG二次开发中外部数据访问方法研究

[复制链接]
发表于 2011-6-18 09:25:12 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转磨削论坛

您需要 登录 才可以下载或查看,没有账号?注册会员

×
1 前言) W5 z/ n1 s1 A) \
随着UG系统的推广和普及应用,基于UG平台的二次开发工作显得越来越重要,在UG的二次开发应用系统中,经常需要与各种外部数据打交道, UG/OPEN API提供了丰富的文件访问操作函数,利用这些操作函数及VC++的MFC类库,可以方便地实现外部数据读写访问编程。7 y# x+ k1 o- [) M
2 外部数据访问的主要方法' }% J' E: O/ j: {0 A
在UG二次开发应用系统中,主要访问的外部数据有文本文件、Excel表、关系型数据库表等,通常可以通过以下方法访问这些外部数据:: E$ p9 u5 p+ D2 ^9 F: J1 o
(1)通过UG/OPEN API提供的文件操作函数访问外部数据
3 W8 J7 N) O# `& G(2)通过ODBC数据源访问外部数据
2 M  U; N/ ]5 S$ W8 |# u7 q(3)通过ADO访问外部数据! W  ^% d$ L5 j
2.1 通过UG/OPEN API提供的文件操作函数访问文本文件数据1 a/ ~. o) g3 i- a0 c+ K
UG/OPEN API中有关文件操作的函数包含在头文件uf_cfi.h中,通过函数uc4500可以打开二进制文件,相关的文件操作函数有uc4510、uc4511、uc4512、uc4513及uc4520、uc4521、uc4522、uc4523,通过函数uc4504可以打开文本文件,相关的文件操作函数有uc4514、uc4524、uc4525,函数uc4540用于关闭文件,判断文件是否存在使用函数UF_CFI_ask_file_exist。
0 E' t/ [( f  R" a! M通过UG/OPEN API提供的文件操作函数访问外部数据时,要注意以下问题:
# Y$ q/ |7 R$ e( |2 ^) I(1)UG/Manager 和 IMAN中的文件和文件夹操作不能使用uf_cfi.h中函数;6 }5 D- T5 X/ `& y
(2)UG/OPEN API中对文件和文件夹标识符的长度有如下限制:
8 \$ B4 r1 G' l! s; D' V& U文件名长度不能超过UF_CFI_MAX_FILE_NAME_LEN;文件夹路径的长度不能超过UF_CFI_MAX_PATH_NAME_LEN;整个文件路径的长度不能超过UF_CFI_MAX_PATH_NAME_LEN。
1 @. Y# w% ]9 W! t访问文本文件的程序流程如下图:# Z3 @; P& B8 t% n
200812815134.jpg
$ C, B9 P% ~' k$ L2.2 通过ODBC数据源访问Excel表或关系型数据库表数据
5 i' Q" S! j" X  r5 a3 A) r# lODBC(Open Database connectivity 开放式数据库互连)是由微软公司提出的一个用于访问数据库的统一界面标准,它提供了一个一致的应用程序编程接口,该接口使用一个针对数据库的驱动程序与不同的数据库协同工作。
" M; C0 _+ Y; y/ H* ]! w通过ODBC访问外部数据时,需要先指定访问的数据源DSN(Data Source Name),以指定ODBC与相关的驱动程序相对应的入口。在控制面板的管理工具中可以打开ODBC数据源管理器,指定DSN。8 B8 J& o# ~2 M5 ?5 O( D
建立MFC数据库类Cdatabse对象可以实现对外部数据的访问编程。一个CDatabase对象代表与数据源的一个连接。创建一个CDatabase对象之后,调用Open或OpenEx成员函数指定一个DSN,就建立起了与DSN的底层数据源的连接(打开数据库)。成员函数Close关闭数据库。CDatabase对象通常与一个或多个记录集(CRecordset对象)一起使用,通过CRecordset类的各成员函数完成对数据源的读写操作。$ w( R9 t/ p" g& _7 p/ \
通过ODBC访问一个Excel表的编程实例代码如下:3 A5 N- ~: t; Y! u) o
static void do_ugopen_api(void)* F+ G, G  ], ~; @- {* P' n" f
{
, B5 ~7 Z" E7 N: x$ i  ?CDatabase Database; // 定义一个MFC的CDatabse数据库类对象Databse4 R+ ]  ~6 ]" f+ W" M  g- k
CString SQLCommand = "select `Serial_Number`, `Outer_Diameter`, `Inner_Diameter`,`Height` from `Sheet1$`"; // SQL查询语句0 v4 Z% a7 x, |/ {& f  g: h' x' w
DWORD dwOptions = 0;// 设置连接的建立方式* z4 x+ {' n6 t6 z$ P2 f
CDBVariant temp;// 数据库数据通用类型
# K, x. T/ ]' [0 X+ h" X1 k$ w$ Aint result; // 储存返回值的变量' a2 X; B/ w' d1 q
char buf[133];7 W4 y: J; D, M2 @5 a! z% S
try
4 W/ `% W4 `$ L1 W; c{5 Z5 d) z& J+ R3 P! J) ~
result = Database.OpenEx( "DSN=Standard Part", dwOptions ); // 打开数据库
  k  t1 E* Q* T* _  w1 Jif( result != 0 ) // 如果成功打开. _9 q: K+ f& K; a5 b$ F$ G9 G; Z
{
% ^& l8 E4 p( ^0 N3 @1 z  ECRecordset rs( &Database ); // 定义记录集6 D3 w' n2 Y: _# x# r8 X. i
if ( rs.Open( CRecordset::snapshot, SQLCommand ) != false )
0 |" {; X# q* X) d{) E* y& M1 _& d, C) k& _5 A: f/ `
rs.MoveFirst( );
2 V' W) ^6 Z* vshort nFields = rs.GetODBCFieldCount( );// 获取记录的字段数目
9 b9 n0 A3 k8 C+ UUF_UI_open_listing_window( );
7 k1 w0 a/ \+ Swhile( !rs.IsEOF( ) )
! A$ j( i6 A4 d" R! R0 c{
8 v, I% J  r0 ?! Pfor( short index = 1; index m_strError );8 q& n$ I) \, ?5 K* W; }; y& U: Z6 t
pe -> Delete( );
2 s# U7 `8 D7 k( I/ g1 b}
9 p+ h% O* h) }}
: r+ y3 a  [5 \  `2.3 通过ADO访问外部数据# n' G2 b2 e( i8 g& W
ADO(ActiveX Data Objects)是微软的数据库对象技术,ADO里面包括连接数据库的对象,从查询语句中返回数据的记录集对象和表现数据元素的字段对象。支持ADO编程的库文件是msado15.dll,它默认保存在“c:\program files\common siles\system\ado\”目录下,动态链接库msado15.dll封装了ADO的所有功能。在默认情况下,Visual C++不支持ADO对象。要在程序中使用ADO对象,需要使用#import命令将ADO库文件导入到工程中,代码如下:
6 v# _8 J. W8 [' d6 a#import “c:\Program Files\Common Files\System\ado\msado15.dll” no_namespace rename(“EOF”,”adoEOF”) rename(“BOF”,”adoBOF”)
2 K. o8 N' u# k参数no_namespace 表示不使用ADO的名字空间。为了避免出现常量名冲突,需要将EOF改名为adoEOF、BOF改名为adoBOF。  A( I9 B' ~4 ~( f/ |2 Y
ADO库包含3个基本接口,即_ConnectionPtr接口、_CommandPtr接口和_RecordsetPtr接口。它们分别对应Connection对象、Command对象和Recordset对象。通过这三个基本接口可实现对数据库的访问。
% b  V7 e. r9 ]1 E  p通过ADO访问数据库的一般步骤如下:
4 b4 q* G- r( }0 T(1)连接到数据源;
% E  V* [$ z: A0 _(2)指定访问数据源的命令(查询、更新、删除等操作命令);
2 u; n& u) m1 L' G(3)执行命令。
4 ~$ `9 r; S* [  T有关ADO库基本接口的使用方法请参见相关的参考手册,下面给出通过ADO访问Access数据库表的实例程序代码段:
! l# Z/ v* G# n" X* t3 {: Hbool DoAdoTest( void )7 a8 V7 {/ J& x0 F
{
# t9 e7 `- R: J" E. ]) Z/ w// 初始化对COM的调用
  h& m) x/ v8 M  H! c0 Y$ @  l$ tCoInitialize( 0 );& f8 R8 Z( U3 l/ g
_ConnectionPtr pConnection = NULL; // 连接, ]* D; H/ M2 [: n4 y
_RecordsetPtr pRecordset = NULL; // 记录集% ?8 l8 ~: Q3 z, E# @
HRESULT hr = E_UNEXPECTED;) O# q) ?7 w1 y
CString strConnectionString( "Provider=Microsoft.Jet.OLEDB.4.0;Data 落Source=f:\\ug\\chapter3_4\\screw.mdb" ); // 连接字符串
, p. F" f, c$ D6 H, f3 a% Y2 rCString strSqlCommandString( "SELECT * From screw_table " ); // SQL语句
4 y2 `/ R# {( RpConnection.CreateInstance( __uuidof( Connection ) ); // ( "ADODB.Connection" );
7 X/ {- R+ a- Z; k, p* x. V+ MpRecordset.CreateInstance( __uuidof( Recordset ) ); // ( "ADODB.Recordset" );
8 G1 I$ M. A6 ^6 f9 M. Dtry
0 l- L7 \7 F7 M+ ?! q* i: C{ hr = pConnection->Open( ( _bstr_t )strConnectionString, "", "", adModeUnknown ); // 连接数据库
6 x7 |1 G( q  l/ M9 y( X9 w  b# `MessageBox( NULL, "连接数据库成功!", "提示", MB_OK | MB_ICONINFORMATION );, y' J7 O4 A" ?1 v! n  C
}$ W% `+ y# v+ _. _
catch ( _com_error e )
( a( C$ k" _& T{
% [1 u0 `+ O% |) ?3 w2 WMessageBox( NULL, "连接数据库失败!", "错误", MB_OK | MB_ICONERROR );
4 z5 b; g# Y7 G) Preturn false;
0 Z$ m' P! o: D}2 e) C! s0 v7 C" B: ~3 K7 m: ~
try. K! l7 F( Q7 i( W, R+ F
{% W, f: B  t1 ~0 |
hr = pRecordset->Open( ( _bstr_t )strSqlCommandString,' f3 @. a) F7 E& J
_variant_t((IDispatch*)pConnection,true),
( u& x  c. i3 z) X- N3 radOpenStatic,; e9 M, _" T2 ^
adLockOptimistic,
; t  j( G" c4 W- w! h# {adCmdText ); // 获取记录集
0 R, j2 b$ D$ k' s1 P}% t4 B9 z8 Z8 S5 c/ b# _
catch ( _com_error* e )
( J* L. _7 w& I) Q- A7 m{& F8 H- }( ^% j+ H# B  Z
e->ErrorMessage();
1 }- j7 `, V3 ?9 ^  S' E: M9 OMessageBox( NULL, "打开记录集失败!", "错误", MB_OK | MB_ICONERROR );
. v* a, V1 `/ D- U  X5 t+ \7 Q8 K3 n+ I}
" ]' Q4 W% A' }CString tmp;
: t; z& e- K: Y# X' T/ k) TUF_UI_open_listing_window();  l+ m, S5 a0 B+ T! n( ]3 B5 B" ?
// 输出字段名
# t% \7 D0 w7 l8 G# Flong lFieldsCount = -1;8 C- c' r) U2 }: ~+ u# o' ?
lFieldsCount = pRecordset->GetFields()->Count;
- g% h0 s8 F. y" _2 A# V: D& Sfor ( long i = 0; i GetFields()->Item[ i ]->Name );
0 F8 K& E7 V4 w  Z. {) l) qUF_UI_write_listing_window( ( LPTSTR )( LPCSTR )tmp );( |! r$ k/ j& n/ R8 o
UF_UI_write_listing_window( "\t" );3 U6 R* N4 z' U* G- j
}
* p6 T- r& P1 u' q9 ?+ fUF_UI_write_listing_window( "\n\n" );  g( ^# u; n. o$ q" w( T4 Y
// 输出所有记录% ]0 G0 C) g8 L% t- ]3 A; s" D
pRecordset->MoveFirst();; v. U! c* U2 w& D; j2 J8 N# g
while(!pRecordset->adoEOF). f4 C1 Z$ z. ?6 {0 ]/ u7 F+ F, i
{
& P7 j3 A5 G' p0 Itmp = pRecordset->GetCollect( 0L );
2 q8 U' |) p5 Y4 V: d! @UF_UI_write_listing_window( ( LPTSTR )( LPCSTR )tmp );
5 ?! @) w2 H. Z0 P  r: _2 z7 R9 O……//输出记录中其他字段值/ A6 h/ t4 w8 T, X4 K! _
pRecordset->MoveNext();
; [3 X* v2 T) \# o. N0 ^}8 I5 [& }9 x7 @; p3 U  l
pRecordset->Close();
% y/ L) z8 Z2 p, d$ k; ]pRecordset = NULL;2 H2 u; q: N; d& {
pConnection->Close();
$ K$ w$ _! r% @: e0 ZpConnection = NULL;/ O8 t# t* o) g, m; y- C! u
CoUninitialize();& c# W6 h3 s5 u6 v+ T& Q/ v
return true;
2 G0 O0 X8 W. O$ L2 y' B8 j}
0 ~0 ^" p( C( O# I3 结论
/ N; n' K0 S( i* C4 V在UG二次开发过程中,确定选择哪种方法访问外部数据,取决于具体的应用系统要求。通过UG/OPEN API编程较适合于对外部文本文件的访问,可方便实现用户与UG信息窗口交互等功能;通过ODBC和ADO技术可以访问各种支持的数据源,包括文本文件、Excel表及各种关系型数据库表等,ADO与ODBC相比,使用更加简便,免去了繁琐的配置数据源工作,但有些数据库仅支持ODBC,不直接支持ADO数据库技术。
0 D5 I2 b) ?7 {文章关键词:
您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

中国磨床技术论坛
论 坛 声 明 郑重声明:本论坛属技术交流,非盈利性论坛。本论坛言论纯属发表者个人意见,与“中国磨削技术论坛”立场无关。 涉及政治言论一律删除,请所有会员注意.论坛资源由会员从网上收集整理所得,版权属于原作者. 论坛所有资源是进行学习和科研测试之用,请在下载后24小时删除, 本站出于学习和科研的目的进行交流和讨论,如有侵犯原作者的版权, 请来信告知,我们将立即做出整改,并给予相应的答复,谢谢合作!

中国磨削网

QQ|Archiver|手机版|小黑屋|磨削技术网 ( 苏ICP备12056899号-1 )

GMT+8, 2025-3-1 18:27 , Processed in 0.168139 second(s), 27 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表