找回密码
 注册会员

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 337|回复: 0

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

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

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

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

×
1 前言( w8 t7 M/ n4 x. [9 N+ x& h4 Z2 z
随着UG系统的推广和普及应用,基于UG平台的二次开发工作显得越来越重要,在UG的二次开发应用系统中,经常需要与各种外部数据打交道, UG/OPEN API提供了丰富的文件访问操作函数,利用这些操作函数及VC++的MFC类库,可以方便地实现外部数据读写访问编程。
8 A7 K) s5 f1 z2 ^7 Z3 q9 n0 h2 外部数据访问的主要方法2 S9 W, w+ {- k% H# F+ Z" M  Y
在UG二次开发应用系统中,主要访问的外部数据有文本文件、Excel表、关系型数据库表等,通常可以通过以下方法访问这些外部数据:
# n$ D6 G* L  z(1)通过UG/OPEN API提供的文件操作函数访问外部数据" N0 l# F* o1 }
(2)通过ODBC数据源访问外部数据5 T) a. u- v) u/ e; h8 [4 S
(3)通过ADO访问外部数据& Z" s# ~7 O. e- C: D0 r: s  C9 F
2.1 通过UG/OPEN API提供的文件操作函数访问文本文件数据
; |& @1 b1 G" oUG/OPEN API中有关文件操作的函数包含在头文件uf_cfi.h中,通过函数uc4500可以打开二进制文件,相关的文件操作函数有uc4510、uc4511、uc4512、uc4513及uc4520、uc4521、uc4522、uc4523,通过函数uc4504可以打开文本文件,相关的文件操作函数有uc4514、uc4524、uc4525,函数uc4540用于关闭文件,判断文件是否存在使用函数UF_CFI_ask_file_exist。- D$ z7 @8 C6 J4 t
通过UG/OPEN API提供的文件操作函数访问外部数据时,要注意以下问题:
! r- g1 d, t/ k. d! Y(1)UG/Manager 和 IMAN中的文件和文件夹操作不能使用uf_cfi.h中函数;& M6 f$ J4 ?, J5 B: F) Y: }
(2)UG/OPEN API中对文件和文件夹标识符的长度有如下限制:0 _( v& \/ L0 r- w+ }
文件名长度不能超过UF_CFI_MAX_FILE_NAME_LEN;文件夹路径的长度不能超过UF_CFI_MAX_PATH_NAME_LEN;整个文件路径的长度不能超过UF_CFI_MAX_PATH_NAME_LEN。
9 n. \2 ~1 W& F; G( A访问文本文件的程序流程如下图:
  Z! z0 K9 q: s# _& n+ Y( { 200812815134.jpg ' T, P! f$ x2 k
2.2 通过ODBC数据源访问Excel表或关系型数据库表数据) W& D3 r: P2 z% s0 |" J
ODBC(Open Database connectivity 开放式数据库互连)是由微软公司提出的一个用于访问数据库的统一界面标准,它提供了一个一致的应用程序编程接口,该接口使用一个针对数据库的驱动程序与不同的数据库协同工作。
/ y, d9 k& C2 p, g- u8 t0 Y' U. R- W通过ODBC访问外部数据时,需要先指定访问的数据源DSN(Data Source Name),以指定ODBC与相关的驱动程序相对应的入口。在控制面板的管理工具中可以打开ODBC数据源管理器,指定DSN。  [% I2 B( j( H& g  F3 \
建立MFC数据库类Cdatabse对象可以实现对外部数据的访问编程。一个CDatabase对象代表与数据源的一个连接。创建一个CDatabase对象之后,调用Open或OpenEx成员函数指定一个DSN,就建立起了与DSN的底层数据源的连接(打开数据库)。成员函数Close关闭数据库。CDatabase对象通常与一个或多个记录集(CRecordset对象)一起使用,通过CRecordset类的各成员函数完成对数据源的读写操作。
; O$ i% D$ Z4 _# P7 k通过ODBC访问一个Excel表的编程实例代码如下:& f% t, {  Y0 _3 F; z/ I" L/ W
static void do_ugopen_api(void). J  }+ R4 U# ~9 Q
{
1 ?$ r& t7 Q3 I- gCDatabase Database; // 定义一个MFC的CDatabse数据库类对象Databse
/ G/ `& T7 Y. k0 E, nCString SQLCommand = "select `Serial_Number`, `Outer_Diameter`, `Inner_Diameter`,`Height` from `Sheet1$`"; // SQL查询语句
! O3 v- E9 N0 z* D  Z/ nDWORD dwOptions = 0;// 设置连接的建立方式
) E+ P) |( [' F0 ]9 q* OCDBVariant temp;// 数据库数据通用类型# Y& E: }6 P" G" O/ Y% e+ r
int result; // 储存返回值的变量
# Q! h2 M$ k, v- n$ S2 Mchar buf[133];
! P* B; }9 {5 H* S$ ?! n) [try, z, Q8 S+ L7 \1 E' P0 H7 h- \
{
4 T4 C; D. n% N+ M- T. Bresult = Database.OpenEx( "DSN=Standard Part", dwOptions ); // 打开数据库
3 I8 ^/ {4 j- d  O8 X3 L6 A- iif( result != 0 ) // 如果成功打开
3 o1 c. \8 y$ b7 ^' g6 |% X{
0 X! s& P: j& Q) k1 j! Z9 T8 P7 jCRecordset rs( &Database ); // 定义记录集
. J, q$ }- H) Y3 A- C% zif ( rs.Open( CRecordset::snapshot, SQLCommand ) != false )4 d, Z# L4 @( w6 K4 ^  f: `8 e  H
{, m& _$ a- E: G6 @
rs.MoveFirst( );' j3 V/ b" v. N$ L3 O
short nFields = rs.GetODBCFieldCount( );// 获取记录的字段数目
& j$ T) \  u8 W9 F3 YUF_UI_open_listing_window( );
2 d. H* L& M, a5 f8 B) ~/ `* \  Ywhile( !rs.IsEOF( ) )9 o% @+ D& l" i
{' d. C7 G! k+ h& X+ ^- L# U2 i& H0 c
for( short index = 1; index m_strError );
7 k. H5 J. ~. x, X& ?- w- Z& epe -> Delete( );0 Z6 \2 [2 ~# E+ n" `" b8 i( t
}2 x7 {7 j0 A& N8 s0 \2 Y7 e% Q1 F
}4 K& z+ y- ?& z6 G, P
2.3 通过ADO访问外部数据
/ n# @0 O# {% B7 x& U& lADO(ActiveX Data Objects)是微软的数据库对象技术,ADO里面包括连接数据库的对象,从查询语句中返回数据的记录集对象和表现数据元素的字段对象。支持ADO编程的库文件是msado15.dll,它默认保存在“c:\program files\common siles\system\ado\”目录下,动态链接库msado15.dll封装了ADO的所有功能。在默认情况下,Visual C++不支持ADO对象。要在程序中使用ADO对象,需要使用#import命令将ADO库文件导入到工程中,代码如下:
1 }5 J7 @6 T; ^& E' @5 }#import “c:\Program Files\Common Files\System\ado\msado15.dll” no_namespace rename(“EOF”,”adoEOF”) rename(“BOF”,”adoBOF”)& p/ G( q, U, U& a( J# `/ B
参数no_namespace 表示不使用ADO的名字空间。为了避免出现常量名冲突,需要将EOF改名为adoEOF、BOF改名为adoBOF。
7 }8 p. d* a3 W: R& s% `  [' RADO库包含3个基本接口,即_ConnectionPtr接口、_CommandPtr接口和_RecordsetPtr接口。它们分别对应Connection对象、Command对象和Recordset对象。通过这三个基本接口可实现对数据库的访问。  ^& @) O6 @3 l7 Y0 f9 [# T3 E
通过ADO访问数据库的一般步骤如下:- U: r  H5 e8 F  g7 p
(1)连接到数据源;
. s; s+ Z, o% a. }7 u(2)指定访问数据源的命令(查询、更新、删除等操作命令);
1 a0 ~- u9 K4 _1 M4 r; A! i1 Q(3)执行命令。  O! }' }7 p" Q# O6 w1 U
有关ADO库基本接口的使用方法请参见相关的参考手册,下面给出通过ADO访问Access数据库表的实例程序代码段:* d  h! \- C! m0 s3 [; i. x. k2 I; g  g
bool DoAdoTest( void )- D( i- \" {2 S. U* x! Q7 i
{0 v( p4 {% S. l) u3 ?! ?
// 初始化对COM的调用
# c: G5 i  A# x8 nCoInitialize( 0 );
( }5 T( A2 S% H% l5 {_ConnectionPtr pConnection = NULL; // 连接
1 j* p9 r7 W) t; d- i' E_RecordsetPtr pRecordset = NULL; // 记录集
  g& S+ Y* e- BHRESULT hr = E_UNEXPECTED;' I( J4 X4 ^" z# X# V& P4 l5 n
CString strConnectionString( "Provider=Microsoft.Jet.OLEDB.4.0;Data 落Source=f:\\ug\\chapter3_4\\screw.mdb" ); // 连接字符串
+ `" N; O3 {. D; ~8 B/ VCString strSqlCommandString( "SELECT * From screw_table " ); // SQL语句
& ]6 f9 {' O# y" `pConnection.CreateInstance( __uuidof( Connection ) ); // ( "ADODB.Connection" );
' F' h6 x2 ~: k0 l" \; n0 b4 p: gpRecordset.CreateInstance( __uuidof( Recordset ) ); // ( "ADODB.Recordset" );
/ R' Y% s5 V0 e2 m0 rtry
, u5 U/ c, W; Z7 n{ hr = pConnection->Open( ( _bstr_t )strConnectionString, "", "", adModeUnknown ); // 连接数据库
- |; h1 z! Q8 N+ YMessageBox( NULL, "连接数据库成功!", "提示", MB_OK | MB_ICONINFORMATION );; `2 k; Z- B& B1 q* n$ T6 B
}
& ?* e. D, b% q  Kcatch ( _com_error e )
  b" E3 \$ U. g5 t9 G{! S5 @. C& P' c4 Y; @" L2 U' P: S" ^
MessageBox( NULL, "连接数据库失败!", "错误", MB_OK | MB_ICONERROR );: G) I% [: G1 X/ v8 W  b
return false;# `) u( A, ]( Y4 R; i1 }( L
}
7 C1 e( \, L+ I- j+ p# w: }try" f, Z0 {- K: F7 L7 y4 ~0 R
{2 J- j1 N# a/ s' V% X5 H
hr = pRecordset->Open( ( _bstr_t )strSqlCommandString,+ F! {: b/ G4 S+ W
_variant_t((IDispatch*)pConnection,true),# h7 A. H7 a& p& Q
adOpenStatic,/ u  G6 @% Y  f+ ?/ |
adLockOptimistic,
. a9 F8 J( u4 ^/ n3 ^adCmdText ); // 获取记录集
* n5 R. q8 e7 }+ J5 a8 Z8 l; Q" S3 }' X}' B# n+ C- Z' O
catch ( _com_error* e )  r& A8 k; W3 G% {5 x2 _
{
- l; f$ O  S" U" y9 c+ d+ d4 De->ErrorMessage();
; X' K5 Z7 G% Z. X: r/ dMessageBox( NULL, "打开记录集失败!", "错误", MB_OK | MB_ICONERROR );) p# V8 l7 i+ e# L
}9 S* x9 J* x& Q4 f, k6 P$ |+ |& r
CString tmp;% k$ k+ U0 i3 g% o  @- v/ n
UF_UI_open_listing_window();$ Y5 N8 ]# O( Q# E+ }+ K& Q7 {# U
// 输出字段名
' k  U) O" Y, l9 \0 w! olong lFieldsCount = -1;+ W3 A. w9 V7 `$ u6 e% h6 |2 e
lFieldsCount = pRecordset->GetFields()->Count;
3 d/ g" i& f2 g6 m" b; O/ Lfor ( long i = 0; i GetFields()->Item[ i ]->Name );: r4 ?- [2 Z$ }
UF_UI_write_listing_window( ( LPTSTR )( LPCSTR )tmp );; v; O4 X! l! |7 _; `' G% {
UF_UI_write_listing_window( "\t" );( d* |$ w( w9 C' m# v) D
}  ~1 x, U$ a% O! A7 z0 L2 }
UF_UI_write_listing_window( "\n\n" );3 v/ A7 J  q: Y1 m7 \
// 输出所有记录1 s( n+ I4 }( |0 g( }/ ^3 \
pRecordset->MoveFirst();
4 H  L2 }# F) x5 M. D0 X% \$ b! fwhile(!pRecordset->adoEOF): H- K$ K3 E; \4 R$ R( c
{8 ^% {# A( Y! F8 V/ K# S
tmp = pRecordset->GetCollect( 0L );
- i2 l* A; @" c. Q- W6 QUF_UI_write_listing_window( ( LPTSTR )( LPCSTR )tmp );
- Z: s8 J/ F8 {3 [" S4 E$ V, Z# y……//输出记录中其他字段值! c4 j/ f4 k5 ]. ~! X1 s
pRecordset->MoveNext();9 Q3 n+ L$ Q/ o, s; B; h7 }1 n
}
1 ^" Q/ _; Z. XpRecordset->Close();
3 Y1 R; I  c8 X1 f1 Z/ {pRecordset = NULL;* A+ X7 B) H6 U, V4 X* Q
pConnection->Close();
* m/ l4 d8 p: t* ?# F8 v/ ?% fpConnection = NULL;. q+ N8 k+ Y- J8 g% M" k
CoUninitialize();
1 v- d) N0 A: e9 v3 k. zreturn true;
) J* T9 n, I$ K0 T# p}
! ?  T/ b! K& b, Z3 结论4 N6 q7 b8 ]0 W$ u* J
在UG二次开发过程中,确定选择哪种方法访问外部数据,取决于具体的应用系统要求。通过UG/OPEN API编程较适合于对外部文本文件的访问,可方便实现用户与UG信息窗口交互等功能;通过ODBC和ADO技术可以访问各种支持的数据源,包括文本文件、Excel表及各种关系型数据库表等,ADO与ODBC相比,使用更加简便,免去了繁琐的配置数据源工作,但有些数据库仅支持ODBC,不直接支持ADO数据库技术。
0 q$ {4 Z7 Z0 g文章关键词:
您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

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

中国磨削网

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

GMT+8, 2024-11-16 06:43 , Processed in 0.159627 second(s), 27 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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