找回密码
 注册会员

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 340|回复: 0

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

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

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

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

×
1 前言3 w* _$ t& \- u# M
随着UG系统的推广和普及应用,基于UG平台的二次开发工作显得越来越重要,在UG的二次开发应用系统中,经常需要与各种外部数据打交道, UG/OPEN API提供了丰富的文件访问操作函数,利用这些操作函数及VC++的MFC类库,可以方便地实现外部数据读写访问编程。
) i7 N1 S7 u3 O$ f5 C. \2 外部数据访问的主要方法3 j$ a3 P9 E9 K
在UG二次开发应用系统中,主要访问的外部数据有文本文件、Excel表、关系型数据库表等,通常可以通过以下方法访问这些外部数据:
2 ?% u( L" Z& W- U3 a8 a5 |(1)通过UG/OPEN API提供的文件操作函数访问外部数据; ^% H' e$ H! }9 [% A
(2)通过ODBC数据源访问外部数据
( N' d- y; H: D. E1 ](3)通过ADO访问外部数据
6 i+ e! S: B+ u) {* @! s2.1 通过UG/OPEN API提供的文件操作函数访问文本文件数据
) Y. ]. K+ V9 E+ }! y2 E' E) Z' dUG/OPEN API中有关文件操作的函数包含在头文件uf_cfi.h中,通过函数uc4500可以打开二进制文件,相关的文件操作函数有uc4510、uc4511、uc4512、uc4513及uc4520、uc4521、uc4522、uc4523,通过函数uc4504可以打开文本文件,相关的文件操作函数有uc4514、uc4524、uc4525,函数uc4540用于关闭文件,判断文件是否存在使用函数UF_CFI_ask_file_exist。
  F* j; D+ y  L$ E) ?4 s0 A通过UG/OPEN API提供的文件操作函数访问外部数据时,要注意以下问题:
- m& C5 P; ^7 I(1)UG/Manager 和 IMAN中的文件和文件夹操作不能使用uf_cfi.h中函数;: J. G' D* @0 J* g" @
(2)UG/OPEN API中对文件和文件夹标识符的长度有如下限制:
0 Q/ ?" v( I( V2 ~. w文件名长度不能超过UF_CFI_MAX_FILE_NAME_LEN;文件夹路径的长度不能超过UF_CFI_MAX_PATH_NAME_LEN;整个文件路径的长度不能超过UF_CFI_MAX_PATH_NAME_LEN。
" ^6 `: ]9 K8 Y8 F访问文本文件的程序流程如下图:' L! I4 O5 O! }* y# y: A7 n
200812815134.jpg
$ i; @$ ]0 Q1 j* \9 v9 }2.2 通过ODBC数据源访问Excel表或关系型数据库表数据
9 W1 s  b1 L% m1 h+ G! ~! l; OODBC(Open Database connectivity 开放式数据库互连)是由微软公司提出的一个用于访问数据库的统一界面标准,它提供了一个一致的应用程序编程接口,该接口使用一个针对数据库的驱动程序与不同的数据库协同工作。
/ Q( T% f* d% q% H& o) n6 Y通过ODBC访问外部数据时,需要先指定访问的数据源DSN(Data Source Name),以指定ODBC与相关的驱动程序相对应的入口。在控制面板的管理工具中可以打开ODBC数据源管理器,指定DSN。3 K6 Q: k4 s+ q) L6 t
建立MFC数据库类Cdatabse对象可以实现对外部数据的访问编程。一个CDatabase对象代表与数据源的一个连接。创建一个CDatabase对象之后,调用Open或OpenEx成员函数指定一个DSN,就建立起了与DSN的底层数据源的连接(打开数据库)。成员函数Close关闭数据库。CDatabase对象通常与一个或多个记录集(CRecordset对象)一起使用,通过CRecordset类的各成员函数完成对数据源的读写操作。
/ ^1 v+ d# `/ b4 l' K- Q- c通过ODBC访问一个Excel表的编程实例代码如下:
9 w- ~) v  S( }) ^7 z7 hstatic void do_ugopen_api(void)
; q5 P* s3 T7 v0 v{7 i5 o2 D' E- q& e( C5 T& J  ?8 X
CDatabase Database; // 定义一个MFC的CDatabse数据库类对象Databse. z0 R4 i1 n! }3 @: Y! d
CString SQLCommand = "select `Serial_Number`, `Outer_Diameter`, `Inner_Diameter`,`Height` from `Sheet1$`"; // SQL查询语句
  F, W8 p; f0 M& e; [  WDWORD dwOptions = 0;// 设置连接的建立方式7 J' @9 c( D$ E" x. p, S
CDBVariant temp;// 数据库数据通用类型
) D% ^5 q$ Z. s% f6 `" `int result; // 储存返回值的变量" w- }- V; y6 j! b! |4 n$ C8 _
char buf[133];$ I6 d% t" ?5 a$ R8 ]+ b: H1 D
try
4 P& K% b0 _; [6 N, p# b. t" K2 j  ]- r{& V8 y4 k: j  t! p$ j9 B) |( o
result = Database.OpenEx( "DSN=Standard Part", dwOptions ); // 打开数据库! P& x4 u4 K# x  U0 l: T: D5 _
if( result != 0 ) // 如果成功打开
% X# l3 c3 |* D" z4 e1 W{- e7 y( x6 @7 M0 i# ^6 O' Z- F$ v
CRecordset rs( &Database ); // 定义记录集
6 Z1 N0 e- V, ]' V6 M  u1 j7 M3 _if ( rs.Open( CRecordset::snapshot, SQLCommand ) != false )' T+ T  d2 |' v; y% n& O8 Q
{
$ n* b0 O7 |0 W" l0 l  }2 zrs.MoveFirst( );
  P$ J; e3 N9 a8 Q9 cshort nFields = rs.GetODBCFieldCount( );// 获取记录的字段数目1 u- I; S0 \. A' }) M9 J7 j) O% Z
UF_UI_open_listing_window( );7 o, _/ B) I# f& n+ V8 y+ Z
while( !rs.IsEOF( ) )
: ^5 v0 E) H# x1 O$ K4 ]{. Z$ V3 d3 \: W5 f+ C
for( short index = 1; index m_strError );
7 @. n8 X1 G# U$ cpe -> Delete( );$ _/ ~; h; y& a' ?/ P; s! p
}3 V: t7 ]' e  U; t0 F
}
) e6 R9 v# j1 x% H2.3 通过ADO访问外部数据
$ E# U8 m7 k+ ]' d, pADO(ActiveX Data Objects)是微软的数据库对象技术,ADO里面包括连接数据库的对象,从查询语句中返回数据的记录集对象和表现数据元素的字段对象。支持ADO编程的库文件是msado15.dll,它默认保存在“c:\program files\common siles\system\ado\”目录下,动态链接库msado15.dll封装了ADO的所有功能。在默认情况下,Visual C++不支持ADO对象。要在程序中使用ADO对象,需要使用#import命令将ADO库文件导入到工程中,代码如下:
6 ]0 w2 w6 @% w- I2 _7 e; O#import “c:\Program Files\Common Files\System\ado\msado15.dll” no_namespace rename(“EOF”,”adoEOF”) rename(“BOF”,”adoBOF”)
) o8 X- {) c/ [3 t; |. j# h- h7 f参数no_namespace 表示不使用ADO的名字空间。为了避免出现常量名冲突,需要将EOF改名为adoEOF、BOF改名为adoBOF。
9 V5 E4 z2 b& B" \- RADO库包含3个基本接口,即_ConnectionPtr接口、_CommandPtr接口和_RecordsetPtr接口。它们分别对应Connection对象、Command对象和Recordset对象。通过这三个基本接口可实现对数据库的访问。
1 b1 Z+ s, Y/ _5 p  Z% \7 }3 V6 Y通过ADO访问数据库的一般步骤如下:
6 @) ^( R  o8 U0 d  B* V- J(1)连接到数据源;
3 Z  u# m! |9 K4 n' F: z' t; ^' C(2)指定访问数据源的命令(查询、更新、删除等操作命令);
  T6 g/ ~# N! O% `- d$ q( Z(3)执行命令。9 R5 t' z+ o" p9 |' K5 Q
有关ADO库基本接口的使用方法请参见相关的参考手册,下面给出通过ADO访问Access数据库表的实例程序代码段:' B% l( _8 k9 }
bool DoAdoTest( void )
0 s4 U6 `6 s  R4 d{8 h- D. b0 f; u- {
// 初始化对COM的调用
% ?$ [: g2 A& k, ?1 S* P; u# b# ACoInitialize( 0 );
+ I# G( E5 s' H) N4 z% N3 N* \_ConnectionPtr pConnection = NULL; // 连接
( |. ]( q; p6 g! a1 E; n( A: |5 g_RecordsetPtr pRecordset = NULL; // 记录集0 X: X: U$ G% I) U# a: o
HRESULT hr = E_UNEXPECTED;
' _* V$ p+ {6 k/ ICString strConnectionString( "Provider=Microsoft.Jet.OLEDB.4.0;Data 落Source=f:\\ug\\chapter3_4\\screw.mdb" ); // 连接字符串) m$ t3 y; _8 ]; D& d* X
CString strSqlCommandString( "SELECT * From screw_table " ); // SQL语句
; \( C, o& s4 ~  c5 a$ tpConnection.CreateInstance( __uuidof( Connection ) ); // ( "ADODB.Connection" );- l+ [  S7 N* Q* }' Q* [
pRecordset.CreateInstance( __uuidof( Recordset ) ); // ( "ADODB.Recordset" );- N1 R6 N0 T, E
try* z2 ~1 u$ J) g5 q" M, z  E
{ hr = pConnection->Open( ( _bstr_t )strConnectionString, "", "", adModeUnknown ); // 连接数据库/ v2 {: {" O1 i, Z
MessageBox( NULL, "连接数据库成功!", "提示", MB_OK | MB_ICONINFORMATION );; r. v9 ~: B2 u- n& j) W
}. d4 h% s4 D7 T: A; D
catch ( _com_error e )
" C* @  ~% L% u! T& }6 B{# N6 ]# y* U% K& S& v
MessageBox( NULL, "连接数据库失败!", "错误", MB_OK | MB_ICONERROR );4 T0 f" p; k, ]1 L: n+ X# i
return false;" p) P) m" I8 Z1 m. N7 B
}8 T' _( ~7 W, v+ e
try! L: {  q/ g- D5 @: L# r* C
{
$ E9 |. d* r2 P# f, p6 p# E1 mhr = pRecordset->Open( ( _bstr_t )strSqlCommandString,2 L0 ?# |1 K' v5 x: f' w
_variant_t((IDispatch*)pConnection,true),3 ]$ g/ j6 ^2 T* T
adOpenStatic,: c2 g8 y% Z. x; O, z* ~
adLockOptimistic,- v+ ]0 t9 t4 \6 e6 y' c  A
adCmdText ); // 获取记录集/ g  }# D% k4 N; Z0 f* z7 v3 K
}
, l. |. q: _5 c) g8 W5 Ecatch ( _com_error* e )% B6 m' T6 a. a# O; a& n# ^4 O  E
{
& Y0 V; a6 E4 B; l* b! Oe->ErrorMessage();
9 H$ J) ?3 d' A# Z, a8 [7 [MessageBox( NULL, "打开记录集失败!", "错误", MB_OK | MB_ICONERROR );
$ w' t! I$ f: n- J. w% A}
. t8 C1 r4 \; ?! p& dCString tmp;
6 d4 M6 u0 h& ^/ ~/ S0 TUF_UI_open_listing_window();' _0 t; H! b( Z. p' j
// 输出字段名$ f% U2 v! d9 S0 C# n, P9 }
long lFieldsCount = -1;0 _% p1 w7 ^4 U$ s, @: A4 b& r: K
lFieldsCount = pRecordset->GetFields()->Count;8 l8 c; @4 N. ]0 E; z0 n
for ( long i = 0; i GetFields()->Item[ i ]->Name );
7 f+ K2 k) M5 qUF_UI_write_listing_window( ( LPTSTR )( LPCSTR )tmp );1 }# H9 [3 v+ E, E1 T/ x
UF_UI_write_listing_window( "\t" );
5 r/ X+ y0 [+ k# S}
* b; d' i+ q8 R' A8 B  y  n# e- FUF_UI_write_listing_window( "\n\n" );
8 h3 f0 v' M) ^// 输出所有记录
1 e& O6 f7 H! U  {3 V7 C% W3 N  W3 m! DpRecordset->MoveFirst();$ E- T9 |+ B& g5 l# n
while(!pRecordset->adoEOF)
. {6 Z1 I% p1 q! J: F4 N$ ?  b" R) D{3 L- f) R: g* e1 E1 \% ?4 W
tmp = pRecordset->GetCollect( 0L );4 Z7 j. s+ F7 z( W1 f
UF_UI_write_listing_window( ( LPTSTR )( LPCSTR )tmp );$ i8 K/ W6 g' Q8 a% d' _
……//输出记录中其他字段值
. U8 @8 V: }" H4 E1 n1 npRecordset->MoveNext();. G: W$ L" o! z6 l
}
- O  f" i2 y( o1 a6 x( ~pRecordset->Close();9 r3 H8 n8 l) Q. O+ b- G% y1 P
pRecordset = NULL;! T/ x1 ^/ g+ B: G" k" d
pConnection->Close();1 {9 q# ~9 H" q
pConnection = NULL;
4 r" s+ \$ @' }0 i' {( ?, ^8 N  DCoUninitialize();
  I* K1 n$ L$ W/ W5 areturn true;
9 P2 z/ w( c' ^1 G( i}
* O- ~, P6 }. E7 N; b( x% I' f3 结论
& J- m6 T1 D& W4 o2 g) Z在UG二次开发过程中,确定选择哪种方法访问外部数据,取决于具体的应用系统要求。通过UG/OPEN API编程较适合于对外部文本文件的访问,可方便实现用户与UG信息窗口交互等功能;通过ODBC和ADO技术可以访问各种支持的数据源,包括文本文件、Excel表及各种关系型数据库表等,ADO与ODBC相比,使用更加简便,免去了繁琐的配置数据源工作,但有些数据库仅支持ODBC,不直接支持ADO数据库技术。. s: V2 s# `2 X* }
文章关键词:
您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

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

中国磨削网

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

GMT+8, 2025-1-5 21:28 , Processed in 0.152205 second(s), 27 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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