青华模具培训学校

 找回密码
 注册

QQ登录

只需一步,快速开始

青华模具培训学院
查看: 3930|回复: 1

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

[复制链接]
发表于 2010-10-15 09:14 | 显示全部楼层 |阅读模式
ug二次开发中外部数据访问方法研究                                                                                                                                1 前言
: G, q, W4 k- W/ e  A随着UG系统的推广和普及应用,基于UG平台的二次开发工作显得越来越重要,在UG的二次开发应用系统中,经常需要与各种外部数据打交道, 7 W( {' g" p7 [# Q1 \& \; K
( L; W6 t" e1 T# o3 ~
UG/OPEN API提供了丰富的文件访问操作函数,利用这些操作函数及VC++的MFC类库,可以方便地实现外部数据读写访问编程。
; a8 V# H* R( I8 |$ O& Z7 H4 [5 C  v2 外部数据访问的主要方法
" X8 H+ S* v8 `. E% f) ^' p在UG二次开发应用系统中,主要访问的外部数据有文本文件、Excel表、关系型数据库表等,通常可以通过以下方法访问这些外部数据: 9 H' J8 M2 W1 M. p. i
(1)通过UG/OPEN API提供的文件操作函数访问外部数据 ( B" ^- V6 t- u; Z& Q9 U( k
(2)通过ODBC数据源访问外部数据
" n9 {. e- o3 V& o! h( C0 P1 M( {(3)通过ADO访问外部数据 ) g- f- s( |5 g4 C$ g
2.1 通过UG/OPEN API提供的文件操作函数访问文本文件数据
) F3 i! m2 J, Y& B7 kUG/OPEN API中有关文件操作的函数包含在头文件uf_cfi.h中,通过函数uc4500可以打开二进制文件,相关的文件操作函数有uc4510、uc4511
+ N& ]$ T( _9 @+ g2 L$ v% D8 d4 I& l. P! S
、uc4512、uc4513及uc4520、uc4521、uc4522、uc4523,通过函数uc4504可以打开文本文件,相关的文件操作函数有uc4514、uc4524、uc4525
; R% c; S% w' N/ W8 t+ R+ `6 W" v9 \7 s6 l' C, {
,函数uc4540用于关闭文件,判断文件是否存在使用函数UF_CFI_ask_file_exist。
; Y! Z8 @- i9 s; L: D0 R! B: @通过UG/OPEN API提供的文件操作函数访问外部数据时,要注意以下问题:   |2 f& E+ Y4 g5 x1 g" P1 ~8 I6 X
(1)UG/Manager 和 IMAN中的文件和文件夹操作不能使用uf_cfi.h中函数; $ y* d! o7 s2 r8 W
(2)UG/OPEN API中对文件和文件夹标识符的长度有如下限制: ' C& z* J% ~8 R9 w( `" R" Y0 X
文件名长度不能超过UF_CFI_MAX_FILE_NAME_LEN;文件夹路径的长度不能超过UF_CFI_MAX_PATH_NAME_LEN;整个文件路径的长度不能超过
: r6 ?# w, u' @  w+ v; m/ n/ a& A" w# u" H% a1 ^% p! M' N
UF_CFI_MAX_PATH_NAME_LEN。 ' R( F- f3 u2 K
访问文本文件的程序流程如下图: 2 k) c  U1 b0 j( b
' e5 c8 h" ?* l' A2 W' E2 _7 q) F9 Y
2.2 通过ODBC数据源访问Excel表或关系型数据库表数据 ' u0 t8 ^1 h' a' L& j+ O
ODBC(Open Database connectivity 开放式数据库互连)是由微软公司提出的一个用于访问数据库的统一界面标准,它提供了一个一致的应
2 c+ O# y, [! x; G8 L& A8 c7 D7 [' H5 c# i" l4 Z
用程序编程接口,该接口使用一个针对数据库的驱动程序与不同的数据库协同工作。
  I  U6 i+ i. Y& w/ ]# M通过ODBC访问外部数据时,需要先指定访问的数据源DSN(Data Source Name),以指定ODBC与相关的驱动程序相对应的入口。在控制面板的
3 b5 o- t+ z! `! m1 K+ P/ }5 {
- P0 c3 H. g' x+ t7 |- M" w# ]. O管理工具中可以打开ODBC数据源管理器,指定DSN。
5 E& w( g6 N6 p: d建立MFC数据库类Cdatabse对象可以实现对外部数据的访问编程。一个CDatabase对象代表与数据源的一个连接。创建一个CDatabase对象之后4 k$ Z0 o) g+ C$ c2 ]$ X! q' O# ?' g3 J( Z

, S, T3 N$ N# j: P' a: A,调用Open或OpenEx成员函数指定一个DSN,就建立起了与DSN的底层数据源的连接(打开数据库)。成员函数Close关闭数据库。CDatabase对
, I1 G* H7 j$ j9 b+ s" [, l: b0 K; `; _+ k. d" j; y+ z
象通常与一个或多个记录集(CRecordset对象)一起使用,通过CRecordset类的各成员函数完成对数据源的读写操作。 4 _3 ]- q" [+ B8 m: A
通过ODBC访问一个Excel表的编程实例代码如下:
4 g* k- H# B9 \1 F3 H2 l+ d& bstatic void do_ugopen_api(void)
3 k1 J6 t% O* h1 A{ 1 w" j$ |, V6 o% o: Y
CDatabase Database; // 定义一个MFC的CDatabse数据库类对象Databse
" A2 y( G2 H) o& Y" D2 UCString SQLCommand = "select `Serial_Number`, `Outer_Diameter`, `Inner_Diameter`,`Height` from `Sheet1$`"; // SQL查询语句
, R1 a- c6 V/ B8 L. Y  \DWORD dwOptions = 0;// 设置连接的建立方式
. ~$ i( d& l0 }6 \, Y/ `4 o; {CDBVariant temp;// 数据库数据通用类型 4 O9 h! {5 V' O6 E
int result; // 储存返回值的变量 & ~; `* E3 \1 w4 c* n
char buf[133]; * K& Q* d5 u( ~7 S
try
0 o2 {7 Y/ ]1 W. I. v' [% s{
9 I7 Z2 @) g5 B9 i4 Jresult = Database.OpenEx( "DSN=Standard Part", dwOptions ); // 打开数据库 - F2 t. I/ A: x* \" v; m/ K2 Y
if( result != 0 ) // 如果成功打开
  c5 B! h- t6 k  R{ $ t, |- {# u) O
CRecordset rs( &Database ); // 定义记录集
% p; y# k; M2 V2 |& Gif ( rs.Open( CRecordset::snapshot, SQLCommand ) != false ) $ b! G" W3 I5 E* w: g( K% q2 Q; I
{
) H/ r" ?8 a; n  p, Nrs.MoveFirst( );   H) {( A9 U+ M$ \2 Y
short nFields = rs.GetODBCFieldCount( );// 获取记录的字段数目 # o6 y( i# f# G  S% ^; ?% c
UF_UI_open_listing_window( );
; D3 u" G! A6 B8 G) n; jwhile( !rs.IsEOF( ) ) ( D( [5 j0 ]  H
{
8 y# \& O& J% @# A6 cfor( short index = 1; index < nFields; index++ ) - z# E9 ?" Q! q2 Q
{
* I; o. A0 K% J4 q# U& {7 J$ grs.GetFieldValue( index, temp );
0 J, m  i9 q3 z' Xsprintf(buf,"%f",temp.m_dblVal );
4 ]) |1 l% y6 S: D* f1 mUF_UI_write_listing_window(buf ); ! o6 E6 ~& _# Y4 V/ y9 t
UF_UI_write_listing_window( "\t" ); 9 M: ^( ?# b4 P1 M# g! R
} ) B& s% n  F& P" P, m  d' J5 C3 S
UF_UI_write_listing_window( "\n" );
" Y, L0 _1 I  s' `6 k5 I8 A. K0 irs.MoveNext( ); ) y) W: w* K- [. V# Q
}
6 t) `' J8 H5 F2 Xrs.Close( );// 关闭记录集
) Z; N) g( ]* _) g& g; q}
4 v, ^3 m( M3 U  }1 t6 n9 NDatabase.Close(); // 关门数据库连接 4 i& \2 @- U0 R, p0 D0 W! p
} 5 x6 k" r( Q; y4 `1 G1 u9 E% @
}
5 Y" F/ V0 m- o9 R8 tcatch( CDBException *pe ) // 出错处理
# H- H  g# G$ t" M& {{
, s2 F' d' {. w; |AfxMessageBox( "Exception!" ); 4 `1 n& `1 F. c8 ~+ s6 t/ t& [
AfxMessageBox( pe->m_strError ); & b# X( d8 T7 F; {
pe -> Delete( );
0 C/ ?& G- v$ C0 n, S}
( E9 i, C6 X  j; x5 K} ( n& m; k& `2 @# L% v
2.3 通过ADO访问外部数据
. D5 ~) I: u- ^8 lADO(ActiveX Data Objects)是微软的数据库对象技术,ADO里面包括连接数据库的对象,从查询语句中返回数据的记录集对象和表现数据元素: _$ I2 `* x0 i0 k
- N, |; t% |8 J- q1 I! T! W- o
的字段对象。支持ADO编程的库文件是msado15.dll,它默认保存在“c:\program files\common siles\system\ado\”目录下,动态链接库9 L; H5 t* k* Q$ G6 Z! E
( B0 N' ]& o/ n/ F+ v. D; M
msado15.dll封装了ADO的所有功能。在默认情况下,Visual C++不支持ADO对象。要在程序中使用ADO对象,需要使用#import命令将ADO库文件/ S/ X9 ~4 z& ^! [+ V# w

! t8 m  k2 O: C导入到工程中,代码如下:
: f- q5 @( R& l9 ?7 B- g#import “c:\Program Files\Common Files\System\ado\msado15.dll” no_namespace rename(“EOF”,”adoEOF”) rename(“BOF”,”9 u' n" t) }. M! }
6 Z( V8 f5 c, t" K
adoBOF”) 9 C9 L/ z8 d! k" h: n. N9 |
参数no_namespace 表示不使用ADO的名字空间。为了避免出现常量名冲突,需要将EOF改名为adoEOF、BOF改名为adoBOF。
# U7 E: l: N: e5 Z' z3 L5 _ADO库包含3个基本接口,即_ConnectionPtr接口、_CommandPtr接口和_RecordsetPtr接口。它们分别对应Connection对象、Command对象和2 i/ T) u5 s& `; g& C2 g7 }  K" Q
# w$ X/ g1 [5 `
Recordset对象。通过这三个基本接口可实现对数据库的访问。 / ~7 _& w3 _' B* y" m: s! Q
通过ADO访问数据库的一般步骤如下: # P& G- H2 D0 \8 B2 S
(1)连接到数据源;
4 r3 n0 k6 }1 c3 I0 K. X(2)指定访问数据源的命令(查询、更新、删除等操作命令);
- [" p2 @; K) j+ m& u(3)执行命令。
: ]/ p3 x! S( ?! O0 c/ D+ V) D+ {2 p有关ADO库基本接口的使用方法请参见相关的参考手册,下面给出通过ADO访问Access数据库表的实例程序代码段:
) S; x) @* |+ [, l1 xbool DoAdoTest( void )
9 Q0 _* q9 y( a0 U8 a9 t{ 5 _* X9 w8 q) @
// 初始化对COM的调用
0 e" q  u; S% T4 \CoInitialize( 0 ); - @8 O4 _: j2 Q: S' z8 f5 t9 w
_ConnectionPtr pConnection = NULL; // 连接 8 x7 T& v. ~3 Z$ I0 G: [4 \
_RecordsetPtr pRecordset = NULL; // 记录集 9 R" _6 C6 O& a# y' f
HRESULT hr = E_UNEXPECTED;
  Y# D( V2 Z+ ICString strConnectionString( "Provider=Microsoft.Jet.OLEDB.4.0;Data 落Source=f:\\ug\\chapter3_4\\screw.mdb" ); // 连接字符串 1 t+ C' G; @  W& ?7 B
CString strSqlCommandString( "SELECT * From screw_table " ); // SQL语句 ' D! P$ n# L: C( K
pConnection.CreateInstance( __uuidof( Connection ) ); // ( "ADODB.Connection" ); / P; c8 n" f8 Y
pRecordset.CreateInstance( __uuidof( Recordset ) ); // ( "ADODB.Recordset" ); 5 d& K7 y6 m% O. g: O3 |# Q
try
/ u: @' i9 {3 ?1 Z* V, K4 p{ hr = pConnection->Open( ( _bstr_t )strConnectionString, "", "", adModeUnknown ); // 连接数据库 - x1 [7 m& i6 @/ v" u; a# T
MessageBox( NULL, "连接数据库成功!", "提示", MB_OK | MB_ICONINFORMATION );
3 c8 }) H& e, t% b! {! `: \} ( y$ v' q- j* u+ J- o' }9 ]3 N
catch ( _com_error e )
; j$ D/ j4 @. B" V: d{
; ^4 ~  V- R! r" T3 ZMessageBox( NULL, "连接数据库失败!", "错误", MB_OK | MB_ICONERROR ); 4 \1 |4 `* l- E6 \- R" I1 H
return false;
8 n7 _9 l' Z6 \( i} ) F8 V- {8 d" [7 ~& K
try
4 ?& z+ X* o7 D+ |# F# H! U{ ) H1 W8 P/ z$ M
hr = pRecordset->Open( ( _bstr_t )strSqlCommandString,
; G  w7 E2 F5 J6 K_variant_t((IDispatch*)pConnection,true), ! X2 L" d1 ^) }
adOpenStatic,
( d# J8 \, v# G; I% q' AadLockOptimistic, 8 N# ]0 K* T; s2 H  d* U/ N
adCmdText ); // 获取记录集
2 Q1 |0 S! M( c5 M4 x. T( ]1 }} # V2 b6 y3 E) F
catch ( _com_error* e ) # _3 t0 K  l4 U4 i# S
{ 0 {  @* _* L/ l& W; v7 T
e->ErrorMessage();
9 L9 z/ E+ y- O% s" S- [: x. GMessageBox( NULL, "打开记录集失败!", "错误", MB_OK | MB_ICONERROR );
8 R+ s9 {* D* j5 ~' w} 3 e; T# _* g4 h  H: P- f; H
CString tmp;
  W9 a; k6 P; S* {! oUF_UI_open_listing_window();
, J0 X  i2 L3 R/ j3 k// 输出字段名
* j+ u" b, X  R6 r7 U9 y' x( ?0 C7 Flong lFieldsCount = -1;
: b2 G3 O" l8 T3 p2 ?lFieldsCount = pRecordset->GetFields()->Count;
; b- p0 Z; Z0 x+ N& k; zfor ( long i = 0; i < lFieldsCount; i++ ) ) f% K0 Y/ B/ P: v0 v4 H) y
{ # l) R+ W, q+ u
tmp.Format( "%-7s", ( LPCSTR )pRecordset->GetFields()->Item[ i ]->Name );
3 p' s/ n# t; U9 L+ d, D8 IUF_UI_write_listing_window( ( LPTSTR )( LPCSTR )tmp ); + w: x' X" E- R# W+ N$ o7 r
UF_UI_write_listing_window( "\t" ); # l: ~; G- m. S. q
} $ s' T, o" c2 n( ?2 i% R- f. G
UF_UI_write_listing_window( "\n\n" ); ' V8 A" L4 t3 m( C; |
// 输出所有记录
- F- Y  \! @+ k/ x1 h# z# }pRecordset->MoveFirst();
  u8 X% L6 M- h! gwhile(!pRecordset->adoEOF) ) l2 U4 p: w, x% p8 K
{
9 m$ E- x/ c7 @9 g! a! K/ J3 itmp = pRecordset->GetCollect( 0L ); 5 G# z4 J7 {' W9 p+ s  L, H9 H1 f
UF_UI_write_listing_window( ( LPTSTR )( LPCSTR )tmp ); ' E9 Y- J' v8 \
……//输出记录中其他字段值 ' W6 D$ K3 ]. _3 g' _0 l
pRecordset->MoveNext();
* o/ K- v# _. C# \* ~+ H}
+ W( q" H1 M% @0 m8 EpRecordset->Close();
* Z1 S& W* f! \pRecordset = NULL; 8 O% x' g% B/ P, v/ Q
pConnection->Close(); ( V% L4 _, R+ A* w% f
pConnection = NULL;   f: {% T: [( u
CoUninitialize();
) B: u% n: r" X; ~2 Zreturn true; ! t; k* \- @7 n" H. [1 X- Z
}
! H) E) @" \/ Q: W1 L, V% P3 结论 3 ?+ |* Y: f6 B8 L6 M
在UG二次开发过程中,确定选择哪种方法访问外部数据,取决于具体的应用系统要求。通过UG/OPEN API编程较适合于对外部文本文件的访问
3 D* c. ]3 M# o- L" u8 r0 e7 l9 f2 U' x# D; ]9 {) z
,可方便实现用户与UG信息窗口交互等功能;通过ODBC和ADO技术可以访问各种支持的数据源,包括文本文件、Excel表及各种关系型数据库表
9 C. o' B& K7 k" w$ |2 N7 z3 V3 Z3 p# s% `, F# |) i# s! k
等,ADO与ODBC相比,使用更加简便,免去了繁琐的配置数据源工作,但有些数据库仅支持ODBC,不直接支持ADO数据库技术
发表于 2011-2-8 11:55 | 显示全部楼层
高薪诚聘CAD2D\3D软件二次开发工程师6 D# ~3 R# J' A
職位要求:4 G# }& U1 T( ~: C0 {, B4 E
1、軟件開發相關專業專科以上學歷;
3 d" Y8 @3 _4 c- q( ]3 f2、熟悉VB或VC編程技術,具有AutoCAD或Solidworks、PROE、UG等相关的
% g5 I) ~$ ~$ C5 k" E( yCAD2D或3D软件的二次開發經驗均可;; b  F" T3 K8 T$ h6 U5 r7 v- d
3、具備良好的軟件工程意識,具有參與或獨立開發過成功案例;5 H; p6 d! `) G5 p( U
4、能獨立完成各項交付的任務,有很強的責任心及團隊合作精神,有良好的合# o* \+ f2 h# G9 n
作技巧和溝通能力; 0 j- R1 F4 d7 k4 f" j
工作職責:
2 H; y/ c; u( @8 v6 y, c負責系統技術開發和技術支援工作,包括軟件規劃、軟體測試、系統維護、編寫說明書等。完成上級交辦的其他工作。
1 `/ y7 A5 k0 H2 U7 h$ ~薪資待遇:高薪诚聘,电话约谈或面议均可。
5 r4 {0 m! F" o! y( g( [7 s0 k- RTEL: 0769-83608793、83608792 FAX: 0769-83608795, m: c! q8 l4 Z% _' L% s
E_mial:presscad@changan.net1 m. }; D& x: A: `  }/ T  b) }

+ D( z7 Z9 x2 g聯絡人:林小姐13532880988   QQ81488593
# q& j# J" k: u  \2 J9 e備注:可將簡歷發至我公司郵箱,或傳真至我公司。
回复 支持 1 反对 0

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|关于我们|sitemap|小黑屋|Archiver|手机版|UG网-UG技术论坛-青华数控模具培训学校 ( 粤ICP备15108561号 )

GMT+8, 2024-6-5 09:40 , Processed in 0.061762 second(s), 26 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2023 Discuz! Team.

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