找回密码
 注册会员

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 360|回复: 0

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

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

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

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

×
1 前言9 @6 E/ i" }3 b+ D+ _6 [
随着UG系统的推广和普及应用,基于UG平台的二次开发工作显得越来越重要,在UG的二次开发应用系统中,经常需要与各种外部数据打交道, UG/OPEN API提供了丰富的文件访问操作函数,利用这些操作函数及VC++的MFC类库,可以方便地实现外部数据读写访问编程。4 v" {. D2 \9 }& e( K
2 外部数据访问的主要方法
$ b' J% n) p9 Y$ M$ z9 j9 x在UG二次开发应用系统中,主要访问的外部数据有文本文件、Excel表、关系型数据库表等,通常可以通过以下方法访问这些外部数据:
7 h" P4 v/ l0 i. s! ^# b(1)通过UG/OPEN API提供的文件操作函数访问外部数据! ^0 }) e' U: N0 u" W1 b- f
(2)通过ODBC数据源访问外部数据: i5 i. U# z' n) |6 s' p7 O
(3)通过ADO访问外部数据+ J2 ^& x9 Q; _
2.1 通过UG/OPEN API提供的文件操作函数访问文本文件数据$ v' ~  p# p' x
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。2 W' Q6 [) C" R! x1 U
通过UG/OPEN API提供的文件操作函数访问外部数据时,要注意以下问题:
* k: O  a" C+ x0 c7 d1 {9 e2 N(1)UG/Manager 和 IMAN中的文件和文件夹操作不能使用uf_cfi.h中函数;0 t) Y0 w! p0 Q# H2 C- H
(2)UG/OPEN API中对文件和文件夹标识符的长度有如下限制:
/ y3 d  s0 O4 d文件名长度不能超过UF_CFI_MAX_FILE_NAME_LEN;文件夹路径的长度不能超过UF_CFI_MAX_PATH_NAME_LEN;整个文件路径的长度不能超过UF_CFI_MAX_PATH_NAME_LEN。" @. n& ?% J/ ]
访问文本文件的程序流程如下图:5 V2 L# o7 k, Y2 J
200812815134.jpg
+ T" g/ C. U! ~  j; W6 c2.2 通过ODBC数据源访问Excel表或关系型数据库表数据* q/ ?. f. N. d6 p
ODBC(Open Database connectivity 开放式数据库互连)是由微软公司提出的一个用于访问数据库的统一界面标准,它提供了一个一致的应用程序编程接口,该接口使用一个针对数据库的驱动程序与不同的数据库协同工作。9 b* d$ U5 P# W% c/ m  L
通过ODBC访问外部数据时,需要先指定访问的数据源DSN(Data Source Name),以指定ODBC与相关的驱动程序相对应的入口。在控制面板的管理工具中可以打开ODBC数据源管理器,指定DSN。
  @) G0 I9 u5 v! h1 T建立MFC数据库类Cdatabse对象可以实现对外部数据的访问编程。一个CDatabase对象代表与数据源的一个连接。创建一个CDatabase对象之后,调用Open或OpenEx成员函数指定一个DSN,就建立起了与DSN的底层数据源的连接(打开数据库)。成员函数Close关闭数据库。CDatabase对象通常与一个或多个记录集(CRecordset对象)一起使用,通过CRecordset类的各成员函数完成对数据源的读写操作。
( C4 A+ m/ {1 \" C/ H! M0 L通过ODBC访问一个Excel表的编程实例代码如下:
4 N+ E1 F# }1 i4 B8 Fstatic void do_ugopen_api(void)
. k. y  L$ j& l2 P* U$ H4 C/ t{" l, N6 v9 U, c6 S
CDatabase Database; // 定义一个MFC的CDatabse数据库类对象Databse& g  G# ^6 D# L1 O, M7 j
CString SQLCommand = "select `Serial_Number`, `Outer_Diameter`, `Inner_Diameter`,`Height` from `Sheet1$`"; // SQL查询语句
+ x. m' J( j# |: SDWORD dwOptions = 0;// 设置连接的建立方式' o9 ~" P( H5 M- @: s
CDBVariant temp;// 数据库数据通用类型
5 D' n/ }. f6 Qint result; // 储存返回值的变量
# I6 W7 F; j3 l* ^! Ochar buf[133];
1 F1 I( o  s! W0 dtry+ H7 s1 P# M# z: C  _+ N) l
{
1 S9 \) ~# K  B* L" m& p- ~result = Database.OpenEx( "DSN=Standard Part", dwOptions ); // 打开数据库
/ }# P# k3 y( Uif( result != 0 ) // 如果成功打开
* M$ g$ D0 @) p9 e( J{9 y! @1 G3 n  M6 P/ m  p
CRecordset rs( &Database ); // 定义记录集$ {1 \: e' Y0 y7 |( L2 C  b0 P" D
if ( rs.Open( CRecordset::snapshot, SQLCommand ) != false )
5 |/ y- N$ z, Q6 M# E2 k6 R{
' J% \2 k' j" M& `$ \rs.MoveFirst( );
: v9 O; l; }6 Yshort nFields = rs.GetODBCFieldCount( );// 获取记录的字段数目
# E3 C- \) B, K$ zUF_UI_open_listing_window( );
- N  _& k7 i0 awhile( !rs.IsEOF( ) )3 w$ u8 S/ p* r, {' @  M+ r, u( c( O
{
! c1 _4 R& B$ ^3 h2 z1 ]for( short index = 1; index m_strError );
+ c) {. |. q" N) }& F. C* _1 [pe -> Delete( );
. C7 t# g9 X: }) }& X}) I! N. j/ J( ?% Y6 _- A5 E
}
! U8 a) n+ @7 T) [0 U* O2.3 通过ADO访问外部数据
2 M, G0 m( S& ]2 ^ADO(ActiveX Data Objects)是微软的数据库对象技术,ADO里面包括连接数据库的对象,从查询语句中返回数据的记录集对象和表现数据元素的字段对象。支持ADO编程的库文件是msado15.dll,它默认保存在“c:\program files\common siles\system\ado\”目录下,动态链接库msado15.dll封装了ADO的所有功能。在默认情况下,Visual C++不支持ADO对象。要在程序中使用ADO对象,需要使用#import命令将ADO库文件导入到工程中,代码如下:& U; n' @* q) E' X
#import “c:\Program Files\Common Files\System\ado\msado15.dll” no_namespace rename(“EOF”,”adoEOF”) rename(“BOF”,”adoBOF”)1 j/ F# U  D7 Z0 l7 r, d
参数no_namespace 表示不使用ADO的名字空间。为了避免出现常量名冲突,需要将EOF改名为adoEOF、BOF改名为adoBOF。* o( a; H7 Z2 h) H/ F: L
ADO库包含3个基本接口,即_ConnectionPtr接口、_CommandPtr接口和_RecordsetPtr接口。它们分别对应Connection对象、Command对象和Recordset对象。通过这三个基本接口可实现对数据库的访问。
. o, ?  B- s; Z$ T% w5 |; i$ \通过ADO访问数据库的一般步骤如下:# |7 C9 N$ ]$ ?6 d2 P8 b/ j$ e  m# {
(1)连接到数据源;
4 P. A4 J8 Q6 P# R2 d% h( N2 l(2)指定访问数据源的命令(查询、更新、删除等操作命令);
5 f- A0 c5 |. y" P, k9 L; y& W: s(3)执行命令。
+ r: N* K* ^1 Z8 g1 K有关ADO库基本接口的使用方法请参见相关的参考手册,下面给出通过ADO访问Access数据库表的实例程序代码段:
0 ~" W2 [5 L( \bool DoAdoTest( void )
: z6 E6 E+ E! z' \4 n2 b* |{6 s! j0 d' B' I5 B5 K  M' Y
// 初始化对COM的调用" Z7 m' ]9 X1 i# n4 D' [, d* m
CoInitialize( 0 );7 ^% A- |: M( C8 i# \4 y
_ConnectionPtr pConnection = NULL; // 连接
) V( v4 N" P/ Q8 p. y& a_RecordsetPtr pRecordset = NULL; // 记录集
1 U- A; |; U# f, a. x6 WHRESULT hr = E_UNEXPECTED;1 T& k6 J( J2 N$ W
CString strConnectionString( "Provider=Microsoft.Jet.OLEDB.4.0;Data 落Source=f:\\ug\\chapter3_4\\screw.mdb" ); // 连接字符串6 [: q' Q/ {2 Z
CString strSqlCommandString( "SELECT * From screw_table " ); // SQL语句
1 B+ f& |; V$ k& W5 J. tpConnection.CreateInstance( __uuidof( Connection ) ); // ( "ADODB.Connection" );
2 M8 ~4 S" d3 Q( QpRecordset.CreateInstance( __uuidof( Recordset ) ); // ( "ADODB.Recordset" );5 S' I; _5 @0 u- a2 B4 E/ x
try
8 d5 I& [2 ^- O4 J5 Q{ hr = pConnection->Open( ( _bstr_t )strConnectionString, "", "", adModeUnknown ); // 连接数据库
- ]% f* u3 h  b" a' z& r$ ZMessageBox( NULL, "连接数据库成功!", "提示", MB_OK | MB_ICONINFORMATION );
$ s# b0 \/ }& _1 |}
& ?4 Z& Y' Z5 N# N0 m% ]catch ( _com_error e )
0 R! T* x* D$ ]$ s' E/ R  W1 G( [{2 L2 ]' ]/ S+ x! u. M
MessageBox( NULL, "连接数据库失败!", "错误", MB_OK | MB_ICONERROR );8 Y; Y* F$ W& a
return false;
0 u! |! k" Z( D}
+ j6 w1 y' u( e4 Q) L$ ~% Etry
  ?4 ~5 y9 e+ m7 X0 z. Z" _{) F$ e. h7 o% f6 }; [' \$ E5 y$ J
hr = pRecordset->Open( ( _bstr_t )strSqlCommandString,% v$ R0 h! t4 _" K" i" w* Y
_variant_t((IDispatch*)pConnection,true),( M0 I' `7 P# W6 G) c8 a, n
adOpenStatic,2 p9 F( S" g% B  {  q
adLockOptimistic,
) _3 K! a& q  WadCmdText ); // 获取记录集
( I/ M+ P% j" m) \3 I}2 V5 U+ i# s$ |# h
catch ( _com_error* e )7 l4 V$ g+ |/ @* o. E
{1 B: ~) X0 t8 e9 a  f) g
e->ErrorMessage();
1 o& {3 W/ [! Y( r1 o6 \MessageBox( NULL, "打开记录集失败!", "错误", MB_OK | MB_ICONERROR );* \' e) u! \, b+ S- I/ A3 Z
}% a# }/ L0 c! k2 n7 J8 n
CString tmp;
' b1 j, n+ l- `UF_UI_open_listing_window();
4 x( g, ]+ [/ b7 B  C// 输出字段名* b5 w" d2 a& H3 M) ?
long lFieldsCount = -1;
! O, x% Y" t" o8 \1 OlFieldsCount = pRecordset->GetFields()->Count;/ s$ y8 t( n, q$ Y5 y4 n( j) [) K
for ( long i = 0; i GetFields()->Item[ i ]->Name );0 a) F1 M* K* z4 P. g* E' x# N
UF_UI_write_listing_window( ( LPTSTR )( LPCSTR )tmp );
( X# t8 c! l( w' [UF_UI_write_listing_window( "\t" );6 G1 l! N! D, m& `0 p, B
}& W! M4 }- I& Z6 a
UF_UI_write_listing_window( "\n\n" );3 i: G0 ^$ h& S/ V' t0 l  U
// 输出所有记录
$ ~, q3 y- B$ [6 V6 Y' P6 PpRecordset->MoveFirst();5 _* \0 y6 ~4 ^" Z# |2 [. E  R
while(!pRecordset->adoEOF)
7 t1 X6 n, A; J* o4 `3 h1 ^{* P3 R9 q+ k" M/ y: y0 H5 e
tmp = pRecordset->GetCollect( 0L );
0 N9 [9 E& T3 J2 nUF_UI_write_listing_window( ( LPTSTR )( LPCSTR )tmp );
: e+ p& {  C; d0 t6 }……//输出记录中其他字段值* p# ^% z. L3 ?0 s! z  [
pRecordset->MoveNext();4 ?& w) Q7 J" Y" q" K& w: Y
}
) U# g& P! Y" P* H7 QpRecordset->Close();0 \8 |  P: t8 p& j3 S( y
pRecordset = NULL;" d" w- k; Q2 K: \" V2 U
pConnection->Close();# Q: E# w; B3 h& \5 t! z7 ^
pConnection = NULL;
6 S. K  l& s/ G5 W& M* O5 cCoUninitialize();
4 |; x) n; t( _$ g) d: M% Rreturn true;
- \8 l- X" c! d}0 V3 R! ^5 P% h( u; F
3 结论% J5 [, W5 i+ ]) `5 Q0 @
在UG二次开发过程中,确定选择哪种方法访问外部数据,取决于具体的应用系统要求。通过UG/OPEN API编程较适合于对外部文本文件的访问,可方便实现用户与UG信息窗口交互等功能;通过ODBC和ADO技术可以访问各种支持的数据源,包括文本文件、Excel表及各种关系型数据库表等,ADO与ODBC相比,使用更加简便,免去了繁琐的配置数据源工作,但有些数据库仅支持ODBC,不直接支持ADO数据库技术。
, N/ J) O  \. ~4 ^, G文章关键词:
您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

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

中国磨削网

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

GMT+8, 2025-4-18 10:37 , Processed in 0.176609 second(s), 27 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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