久久国产色av_国产人妻777人伦精品hd_欧美 国产 日本_好吊色欧美一区二区三区

您的位置:網(wǎng)站首頁(yè) > UG教程下載

UG二次開發(fā)中外部數(shù)據(jù)訪問方法研究

時(shí)間:2010-11-15 09:48:22 來(lái)源:

1 前言

    隨著UG系統(tǒng)的推廣和普及應(yīng)用,基于UG平臺(tái)的二次開發(fā)工作顯得越來(lái)越重要,在UG的二次開發(fā)應(yīng)用系統(tǒng)中,經(jīng)常需要與各種外部數(shù)據(jù)打交道, UG/OPEN API提供了豐富的文件訪問操作函數(shù),利用這些操作函數(shù)及VC++的MFC類庫(kù),可以方便地實(shí)現(xiàn)外部數(shù)據(jù)讀寫訪問編程。

2 外部數(shù)據(jù)訪問的主要方法

    在UG二次開發(fā)應(yīng)用系統(tǒng)中,主要訪問的外部數(shù)據(jù)有文本文件、Excel表、關(guān)系型數(shù)據(jù)庫(kù)表等,通常可以通過以下方法訪問這些外部數(shù)據(jù):

(1)通過UG/OPEN API提供的文件操作函數(shù)訪問外部數(shù)據(jù)
(2)通過ODBC數(shù)據(jù)源訪問外部數(shù)據(jù)
(3)通過ADO訪問外部數(shù)據(jù)

2.1 通過UG/OPEN API提供的文件操作函數(shù)訪問文本文件數(shù)據(jù)

    UG/OPEN API中有關(guān)文件操作的函數(shù)包含在頭文件uf_cfi.h中,通過函數(shù)uc4500可以打開二進(jìn)制文件,相關(guān)的文件操作函數(shù)有uc4510、uc4511、uc4512、uc4513及uc4520、uc4521、uc4522、uc4523,通過函數(shù)uc4504可以打開文本文件,相關(guān)的文件操作函數(shù)有uc4514、uc4524、uc4525,函數(shù)uc4540用于關(guān)閉文件,判斷文件是否存在使用函數(shù)UF_CFI_ask_file_exist。

    通過UG/OPEN API提供的文件操作函數(shù)訪問外部數(shù)據(jù)時(shí),要注意以下問題:

(1)UG/Manager 和 IMAN中的文件和文件夾操作不能使用uf_cfi.h中函數(shù);

(2)UG/OPEN API中對(duì)文件和文件夾標(biāo)識(shí)符的長(zhǎng)度有如下限制:

    文件名長(zhǎng)度不能超過UF_CFI_MAX_FILE_NAME_LEN;文件夾路徑的長(zhǎng)度不能超過UF_CFI_MAX_PATH_NAME_LEN;整個(gè)文件路徑的長(zhǎng)度不能超過UF_CFI_MAX_PATH_NAME_LEN。

訪問文本文件的程序流程如下:

2.2 通過ODBC數(shù)據(jù)源訪問Excel表或關(guān)系型數(shù)據(jù)庫(kù)表數(shù)據(jù)

    ODBC(Open Database connectivity 開放式數(shù)據(jù)庫(kù)互連)是由微軟公司提出的一個(gè)用于訪問數(shù)據(jù)庫(kù)的統(tǒng)一界面標(biāo)準(zhǔn),它提供了一個(gè)一致的應(yīng)用程序編程接口,該接口使用一個(gè)針對(duì)數(shù)據(jù)庫(kù)的驅(qū)動(dòng)程序與不同的數(shù)據(jù)庫(kù)協(xié)同工作。

    通過ODBC訪問外部數(shù)據(jù)時(shí),需要先指定訪問的數(shù)據(jù)源DSN(Data Source Name),以指定ODBC與相關(guān)的驅(qū)動(dòng)程序相對(duì)應(yīng)的入口。在控制面板的管理工具中可以打開ODBC數(shù)據(jù)源管理器,指定DSN。

    建立MFC數(shù)據(jù)庫(kù)類Cdatabse對(duì)象可以實(shí)現(xiàn)對(duì)外部數(shù)據(jù)的訪問編程。一個(gè)CDatabase對(duì)象代表與數(shù)據(jù)源的一個(gè)連接。創(chuàng)建一個(gè)CDatabase對(duì)象之后,調(diào)用Open或OpenEx成員函數(shù)指定一個(gè)DSN,就建立起了與DSN的底層數(shù)據(jù)源的連接(打開數(shù)據(jù)庫(kù))。成員函數(shù)Close關(guān)閉數(shù)據(jù)庫(kù)。CDatabase對(duì)象通常與一個(gè)或多個(gè)記錄集(CRecordset對(duì)象)一起使用,通過CRecordset類的各成員函數(shù)完成對(duì)數(shù)據(jù)源的讀寫操作。

通過ODBC訪問一個(gè)Excel表的編程實(shí)例代碼如下:

static void do_ugopen_api(void)
{
CDatabase Database; // 定義一個(gè)MFC的CDatabse數(shù)據(jù)庫(kù)類對(duì)象Databse
CString SQLCommand = "select `Serial_Number`, `Outer_Diameter`, `Inner_Diameter`,`Height` from `Sheet1$`"; // SQL查詢語(yǔ)句
DWORD dwOptions = 0;// 設(shè)置連接的建立方式
CDBVariant temp;// 數(shù)據(jù)庫(kù)數(shù)據(jù)通用類型
int result; // 儲(chǔ)存返回值的變量
char buf[133];
try
{
result = Database.OpenEx( "DSN=Standard Part", dwOptions ); // 打開數(shù)據(jù)庫(kù)
if( result != 0 ) // 如果成功打開
{
CRecordset rs( &Database ); // 定義記錄集
if ( rs.Open( CRecordset::snapshot, SQLCommand ) != false )
{
rs.MoveFirst( );
short nFields = rs.GetODBCFieldCount( );// 獲取記錄的字段數(shù)目
UF_UI_open_listing_window( );
while( !rs.IsEOF( ) )
{
for( short index = 1; index < nFields; index++ )
{
rs.GetFieldValue( index, temp );
sprintf(buf,"%f",temp.m_dblVal );
UF_UI_write_listing_window(buf );
UF_UI_write_listing_window( "t" );
}
UF_UI_write_listing_window( "n" );
rs.MoveNext( );
}
rs.Close( );// 關(guān)閉記錄集
}
Database.Close(); // 關(guān)門數(shù)據(jù)庫(kù)連接
}
}
catch( CDBException *pe ) // 出錯(cuò)處理
{
AfxMessageBox( "Exception!" );
AfxMessageBox( pe->m_strError );
pe -> Delete( );
}
}

2.3 通過ADO訪問外部數(shù)據(jù)

    ADO(ActiveX Data Objects)是微軟的數(shù)據(jù)庫(kù)對(duì)象技術(shù),ADO里面包括連接數(shù)據(jù)庫(kù)的對(duì)象,從查詢語(yǔ)句中返回?cái)?shù)據(jù)的記錄集對(duì)象和表現(xiàn)數(shù)據(jù)元素的字段對(duì)象。支持ADO編程的庫(kù)文件是msado15.dll,它默認(rèn)保存在“c:program filescommon silessystemado”目錄下,動(dòng)態(tài)鏈接庫(kù)msado15.dll封裝了ADO的所有功能。在默認(rèn)情況下,Visual C++不支持ADO對(duì)象。要在程序中使用ADO對(duì)象,需要使用#import命令將ADO庫(kù)文件導(dǎo)入到工程中,代碼如下:

#import “c:Program FilesCommon FilesSystemadomsado15.dll” no_namespace rename(“EOF”,”adoEOF”) rename(“BOF”,”adoBOF”)

    參數(shù)no_namespace 表示不使用ADO的名字空間。為了避免出現(xiàn)常量名沖突,需要將EOF改名為adoEOF、BOF改名為adoBOF。

    ADO庫(kù)包含3個(gè)基本接口,即_ConnectionPtr接口、_CommandPtr接口和_RecordsetPtr接口。它們分別對(duì)應(yīng)Connection對(duì)象、Command對(duì)象和Recordset對(duì)象。通過這三個(gè)基本接口可實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)的訪問。

通過ADO訪問數(shù)據(jù)庫(kù)的一般步驟如下:

(1)連接到數(shù)據(jù)源;
(2)指定訪問數(shù)據(jù)源的命令(查詢、更新、刪除等操作命令);
(3)執(zhí)行命令。

有關(guān)ADO庫(kù)基本接口的使用方法請(qǐng)參見相關(guān)的參考手冊(cè),下面給出通過ADO訪問Access數(shù)據(jù)庫(kù)表的實(shí)例程序代碼段:

bool DoAdoTest( void )
{
// 初始化對(duì)COM的調(diào)用
CoInitialize( 0 );
_ConnectionPtr pConnection = NULL; // 連接
_RecordsetPtr pRecordset = NULL; // 記錄集
HRESULT hr = E_UNEXPECTED;
CString strConnectionString( "Provider=Microsoft.Jet.OLEDB.4.0;Data 落Source=f:\ug\chapter3_4\screw.mdb" ); // 連接字符串
CString strSqlCommandString( "SELECT * From screw_table " ); // SQL語(yǔ)句
pConnection.CreateInstance( __uuidof( Connection ) ); // ( "ADODB.Connection" );
pRecordset.CreateInstance( __uuidof( Recordset ) ); // ( "ADODB.Recordset" );
try
{ hr = pConnection->Open( ( _bstr_t )strConnectionString, "", "", adModeUnknown ); // 連接數(shù)據(jù)庫(kù)
MessageBox( NULL, "連接數(shù)據(jù)庫(kù)成功!", "提示", MB_OK | MB_ICONINFORMATION );
}
catch ( _com_error e )
{
MessageBox( NULL, "連接數(shù)據(jù)庫(kù)失敗!", "錯(cuò)誤", MB_OK | MB_ICONERROR );
return false;
}
try
{
hr = pRecordset->Open( ( _bstr_t )strSqlCommandString,
_variant_t((IDispatch*)pConnection,true),
adOpenStatic,
adLockOptimistic,
adCmdText ); // 獲取記錄集
}
catch ( _com_error* e )
{
e->ErrorMessage();
MessageBox( NULL, "打開記錄集失敗!", "錯(cuò)誤", MB_OK | MB_ICONERROR );
}
CString tmp;
UF_UI_open_listing_window();
// 輸出字段名
long lFieldsCount = -1;
lFieldsCount = pRecordset->GetFields()->Count;
for ( long i = 0; i < lFieldsCount; i++ )
{
tmp.Format( "%-7s", ( LPCSTR )pRecordset->GetFields()->Item[ i ]->Name );
UF_UI_write_listing_window( ( LPTSTR )( LPCSTR )tmp );
UF_UI_write_listing_window( "t" );
}
UF_UI_write_listing_window( "nn" );
// 輸出所有記錄
pRecordset->MoveFirst();
while(!pRecordset->adoEOF)
{
tmp = pRecordset->GetCollect( 0L );
UF_UI_write_listing_window( ( LPTSTR )( LPCSTR )tmp );
……//輸出記錄中其他字段值
pRecordset->MoveNext();
}
pRecordset->Close();
pRecordset = NULL;
pConnection->Close();
pConnection = NULL;
CoUninitialize();
return true;
}

3 結(jié)論

    在UG二次開發(fā)過程中,確定選擇哪種方法訪問外部數(shù)據(jù),取決于具體的應(yīng)用系統(tǒng)要求。通過UG/OPEN API編程較適合于對(duì)外部文本文件的訪問,可方便實(shí)現(xiàn)用戶與UG信息窗口交互等功能;通過ODBC和ADO技術(shù)可以訪問各種支持的數(shù)據(jù)源,包括文本文件、Excel表及各種關(guān)系型數(shù)據(jù)庫(kù)表等,ADO與ODBC相比,使用更加簡(jiǎn)便,免去了繁瑣的配置數(shù)據(jù)源工作,但有些數(shù)據(jù)庫(kù)僅支持ODBC,不直接支持ADO數(shù)據(jù)庫(kù)技術(shù)。

[參考文獻(xiàn)]
[1] 董正衛(wèi),田立中,付宜利.UG/OPEN API編程基礎(chǔ)[M].北京:清華大學(xué)出版社,2002.
[2] UGS公司UG/OPENAPIReference.1997.
[3] David J.Kruglinski. Visual C++ 技術(shù)內(nèi)幕[M] .北京:清華大學(xué)出版社,2001.
 


久久国产色av_国产人妻777人伦精品hd_欧美 国产 日本_好吊色欧美一区二区三区
成人精品一区二区三区| 91精品国产高清自在线| 国产日产亚洲精品| 国产成人a亚洲精v品无码| 国产精品电影一区| 欧美在线不卡区| 久久久精彩视频| 久久99国产精品自在自在app| 欧洲精品久久久| 久久99精品久久久久久水蜜桃| 亚洲综合国产精品| 国产女精品视频网站免费| 国产精品二区在线| 欧美 日韩 国产 在线观看| 九九九久久久| 日本一区网站| 久久亚洲免费| 春日野结衣av| 久久久久九九九| 日韩在线综合网| 91国产高清在线| 午夜精品区一区二区三| 国产精品一国产精品最新章节| 国产精品久久久久久久久久久久冷 | 国产一区二区三区高清| 国产精品久久久久久中文字| 欧美日韩高清在线一区| 国产成人精品视频在线| 欧美在线免费观看| 久久精品国产久精国产一老狼 | 少妇人妻无码专区视频| 91精品久久久久久久久中文字幕 | 一本色道久久综合亚洲精品婷婷| 成人a级免费视频| 午夜精品蜜臀一区二区三区免费| 国产成人亚洲精品无码h在线| 日本精品福利视频| 久久久久这里只有精品| www国产91| 欧美在线一区二区三区四| 久久精品国产综合| 青青青国产精品一区二区| 国产专区欧美专区| 九九精品视频在线| 国产亚洲精品自在久久| 不卡av在线网站| 国产一区二区三区高清| 国产精品福利久久久| 国模一区二区三区私拍视频| 国产精品久久久久9999爆乳| 韩国欧美亚洲国产| 国产精品久久婷婷六月丁香| 欧美二区在线视频| 久久国产精品网| 一区二区三区av在线| 国产免费一区二区三区四在线播放 | 国产精品99久久久久久久| 亚洲欧美久久久久一区二区三区| 91精品国产综合久久久久久丝袜| 日韩一级在线免费观看| 久久久久久久久久久视频| 视频一区二区三| 91精品91久久久中77777老牛| 岛国视频一区| 国产精品一区在线观看| 亚洲影影院av| 久久频这里精品99香蕉| 欧美中日韩一区二区三区| 国产精品免费看久久久无码| 国产欧美123| 少妇高清精品毛片在线视频 | 国产精品视频免费在线| 国产视频999| 亚洲在线视频一区二区| 国产成人jvid在线播放| 欧美日韩精品久久久免费观看| 日韩在线免费观看视频| 亚洲色图都市激情| 国产午夜福利100集发布| 一区二区三区我不卡| 久久久综合亚洲91久久98| 日韩免费在线视频| 国产精品久久久久福利| 国产精品亚洲激情| 日韩色妇久久av| 国产精品成人品| 99免费在线观看视频| 欧美在线视频二区| 久久在精品线影院精品国产| av动漫在线观看| 欧美日韩无遮挡| 一本一道久久久a久久久精品91 | 欧美日韩精品免费看| 一区二区三区三区在线| 国产精彩免费视频| 男女视频网站在线观看| 一区二区三区四区欧美| 久久久久一区二区三区| 国产美女被下药99| 日韩精品资源| 一区二区三视频| 国产精品视频二| 91精品国产高清久久久久久91裸体| 今天免费高清在线观看国语| 中文字幕乱码人妻综合二区三区| 国产成人亚洲精品无码h在线| 国产一区不卡在线观看| 秋霞午夜一区二区| 亚洲精品在线免费| 国产精品精品久久久| 久久香蕉综合色| 国产伦精品一区二区三区四区视频_ | 亚洲 欧美 日韩 国产综合 在线 | 不卡一区二区三区四区五区| 欧美日韩电影一区二区三区| 亚欧洲精品在线视频免费观看| 国产精品久久久久久久av电影| 69**夜色精品国产69乱| 国产日韩在线免费| 日韩美女免费线视频| 精品综合久久久久久97| 另类色图亚洲色图| 国产精品无码专区在线观看| 久久久免费视频网站| 国产精品一国产精品最新章节| 黄色一级视频在线播放| 视频一区视频二区视频三区视频四区国产| 欧美成人在线免费| 国产精品免费一区二区| www.欧美免费| 九九热久久66| 91精品国产综合久久久久久久久 | 日本精品免费| 亚洲精品蜜桃久久久久久| 九九精品在线播放| 久久精品福利视频| 久久精品国产美女| 国产精品亚洲激情| 国产精品一区二区久久| 国产一级二级三级精品| 日韩久久精品一区二区三区| 日本在线观看一区二区| 亚洲a区在线视频| 久久久久久com| 色综合久久88色综合天天看泰| 国产精品欧美在线| 国产精品久久久久999| 国产精品久久久久久中文字| 久久久精品美女| 久久久精品亚洲| 国产精品午夜av在线| 免费av观看网址| 国产三级精品网站| 国产女主播自拍| 俄罗斯精品一区二区| av资源站久久亚洲| 国产精品一区专区欧美日韩| 国产精品中文在线| 97人人香蕉| 91精品国产高清久久久久久久久| 久久久亚洲国产| 久久精品国产精品亚洲色婷婷| 久久久免费精品视频| 国产成人精品视频| 久久免费精品日本久久中文字幕| 国产精品午夜av在线| 成人精品在线视频| 91av在线精品| 久久久久久国产精品一区| 久久久久久久久久久亚洲| 精品国偷自产在线视频| 国产精品乱码| 欧美日韩国产二区| 亚洲日本精品一区| 欧美一区二区视频97| 日本一区二区三区在线播放| 视频在线99re| 亚洲人成网站在线播放2019 | 日韩在线激情视频| 国产精品久久二区| 伊人久久青草| 性高潮久久久久久久久| 欧洲亚洲免费视频| 国产视色精品亚洲一区二区| 99精品国产一区二区| 久久久久久美女| 久久中文字幕在线视频| 亚洲精品中文字幕无码蜜桃| 日韩欧美一区二区三区久久婷婷 | 国产伦精品一区二区三区在线| 国产精品18久久久久久麻辣| 日韩色av导航| 国产精品乱码久久久久| 一区二区三区日韩视频| 日本免费高清不卡| 国产资源在线免费观看| 91干在线观看| 国产精品色婷婷视频| 欧美激情乱人伦| 日韩视频在线视频|