VCADOORACLE開(kāi)發(fā)_第1頁(yè)
VCADOORACLE開(kāi)發(fā)_第2頁(yè)
VCADOORACLE開(kāi)發(fā)_第3頁(yè)
VCADOORACLE開(kāi)發(fā)_第4頁(yè)
VCADOORACLE開(kāi)發(fā)_第5頁(yè)
已閱讀5頁(yè),還剩6頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、1,ADO簡(jiǎn)介       ADO是Microsoft為最新和最強(qiáng)大的數(shù)據(jù)訪問(wèn)范例 OLE DB 而設(shè)計(jì)的,是一個(gè)便于使用的應(yīng)用程序?qū)咏涌?。ADO 使您能夠編寫(xiě)應(yīng)用程序以通過(guò) OLE. DB 提供者訪問(wèn)和操作數(shù)據(jù)庫(kù)服務(wù)器中的數(shù)據(jù)。ADO 最主要的優(yōu)點(diǎn)是易于使用、速度快、內(nèi)存支出少和磁盤(pán)遺跡小。ADO 在關(guān)鍵的應(yīng)用方案中使用最少的網(wǎng)絡(luò)流量,并且在前端和數(shù)據(jù)源之間使用最少的層數(shù),所有這些都是為了提供輕量、高性能的接口。之所以稱(chēng)為 ADO,是用了一個(gè)比較熟悉的暗喻,OLE 自動(dòng)化接口。    

2、0;  OLE DB是一組”組件對(duì)象模型”(COM) 接口,是新的數(shù)據(jù)庫(kù)低層接口,它封裝了ODBC的功能,并以統(tǒng)一的方式訪問(wèn)存儲(chǔ)在不同信息源中的數(shù)據(jù)。OLE DB是Microsoft UDA(Universal Data Access)策略的技術(shù)基礎(chǔ)。OLE DB 為任何數(shù)據(jù)源提供了高性能的訪問(wèn),這些數(shù)據(jù)源包括關(guān)系和非關(guān)系數(shù)據(jù)庫(kù)、電子郵件和文件系統(tǒng)、文本和圖形、自定義業(yè)務(wù)對(duì)象等等。也就是說(shuō),OLE DB 并不局限于 ISAM、Jet 甚至關(guān)系數(shù)據(jù)源,它能夠處理任何類(lèi)型的數(shù)據(jù),而不考慮它們的格式和存儲(chǔ)方法。在實(shí)際應(yīng)用中,這種多樣性意味著可以訪問(wèn)駐留在 Excel 電子數(shù)據(jù)表、文本文件、

3、電子郵件/目錄服務(wù)甚至郵件服務(wù)器,諸如 Microsoft Exchange 中的數(shù)據(jù)。但是,OLE DB 應(yīng)用程序編程接口的目的是為各種應(yīng)用程序提供最佳的功能,它并不符合簡(jiǎn)單化的要求。您需要的API 應(yīng)該是一座連接應(yīng)用程序和OLE DB 的橋梁,這就是 ActiveX Data Objects (ADO)。     從前一直以為用ADO編寫(xiě)的程序可以做到大致通用,但是經(jīng)過(guò)這次項(xiàng)目,讓我明白,你必須事先確定好應(yīng)用將要使用的數(shù)據(jù)庫(kù),并且了解其特性,否則最終你的程序肯定會(huì)折磨你,就像本次項(xiàng)目,我為了方便,一開(kāi)始使用了access數(shù)據(jù)庫(kù),并且順利的開(kāi)發(fā)完程序,

4、然后當(dāng)我移植到ORACLE的時(shí)候,出現(xiàn)了許多莫名其妙的問(wèn)題,如時(shí)間取不出來(lái)、select語(yǔ)句無(wú)效、記錄集不更新、程序莫名其妙異常等問(wèn)題,然而該程序用MS SQLSERVER也是正常的。我相當(dāng)郁悶,為什么會(huì)這樣呢?實(shí)際后來(lái)我明白,一部分原因是ORACLE特性所致,另一部分原因是ADO所致。2,通用的開(kāi)發(fā)步驟1)引入ADO庫(kù)文件 使用ADO前必須在工程的stdafx.h頭文件里用直接引入符號(hào)#import引入ADO庫(kù)文件,以使編譯器能正確編譯。代碼如下所示:       / 加入ADO支持庫(kù)     #imp

5、ort "c:program filescommon filessystemadomsado15.dll"      no_namespace      rename ("EOF", "adoEOF")        加載的位置如下圖:這行語(yǔ)句聲明在工程中使用ADO,但不使用ADO的名字空間,并且為了避免常數(shù)沖突,將常數(shù)EOF改名為adoEOF?,F(xiàn)在不需添加另外的頭文件,就可以使用ADO接口了。

6、2、初始化OLE/COM庫(kù)環(huán)境必須注意的是,ADO庫(kù)是一組COM動(dòng)態(tài)庫(kù),這意味應(yīng)用程序在調(diào)用ADO前,必須初始化OLE/COM庫(kù)環(huán)境。在MFC應(yīng)用程序里,一個(gè)比較好的方法是在應(yīng)用程序主類(lèi)的InitInstance成員函數(shù)里初始化OLE/COM庫(kù)環(huán)境。 BOOL CMyInstanceAppApp:InitInstance()if(!AfxOleInit()/這就是初始化COM庫(kù)AfxMessageBox(“OLE初始化出錯(cuò)!”);return FALSE; 初始化COM庫(kù)也可以用如下代碼:HRESULT hr;   / 初始化Com庫(kù) hr = CoInitial

7、ize( NULL ); if(FAILED (hr)   AfxMessageBox( _T( "初始化Com庫(kù)失敗!" ) );   3、ADO接口簡(jiǎn)介 ADO庫(kù)包含三個(gè)基本接口:_ConnectionPtr接口、_CommandPtr接口和_RecordsetPtr接口。_ConnectionPtr接口返回一個(gè)記錄集或一個(gè)空指針。通常使用它來(lái)創(chuàng)建一個(gè)數(shù)據(jù)連接或執(zhí)行一條不返回任何結(jié)果的SQL語(yǔ)句,如一個(gè)存儲(chǔ)過(guò)程。使用_ConnectionPtr接口返回一個(gè)記錄集不是一個(gè)好的使用方法。對(duì)于要返回記錄的操

8、作通常用_RecordserPtr來(lái)實(shí)現(xiàn)。而用_ConnectionPtr操作時(shí)要想得到記錄條數(shù)得遍歷所有記錄,而用_RecordserPtr時(shí)不需要。 _CommandPtr接口返回一個(gè)記錄集。它提供了一種簡(jiǎn)單的方法來(lái)執(zhí)行返回記錄集的存儲(chǔ)過(guò)程和SQL語(yǔ)句。在使用_CommandPtr接口時(shí),你可以利用全局_ConnectionPtr接口,也可以在_CommandPtr接口里直接使用連接串。如果你只執(zhí)行一次或幾次數(shù)據(jù)訪問(wèn)操作,后者是比較好的選擇。但如果你要頻繁訪問(wèn)數(shù)據(jù)庫(kù),并要返回很多記錄集,那么,你應(yīng)該使用全局_ConnectionPtr接口創(chuàng)建一個(gè)數(shù)據(jù)連接,然后使用_CommandPtr接口

9、執(zhí)行存儲(chǔ)過(guò)程和SQL語(yǔ)句。 _RecordsetPtr是一個(gè)記錄集對(duì)象。與以上兩種對(duì)象相比,它對(duì)記錄集提供了更多的控制功能,如記錄鎖定,游標(biāo)控制等。同_CommandPtr接口一樣,它不一定要使用一個(gè)已經(jīng)創(chuàng)建的數(shù)據(jù)連接,可以用一個(gè)連接串代替連接指針賦給_RecordsetPtr的connection成員變量,讓它自己創(chuàng)建數(shù)據(jù)連接。如果你要使用多個(gè)記錄集,最好的方法是同Command對(duì)象一樣使用已經(jīng)創(chuàng)建了數(shù)據(jù)連接的全局_ConnectionPtr接口,然后使用_RecordsetPtr執(zhí)行存儲(chǔ)過(guò)程和SQL語(yǔ)句。3,通用數(shù)據(jù)庫(kù)連接串及區(qū)別     

10、 通常情況下,ORACLE有兩種連接方式:第一種方式:OLE DB Provider for Oracle (from Microsoft)The Microsoft OLE DB Provider for Oracle allows ADO to access Oracle databases.strConnect = _T("</SPAN>     "</SPAN>);For more information, see: Microsoft OLE DB Provider for Oracle.第二種方式:

11、OLE DB Provider for Oracle (from Oracle).For Standard security:strConnect = _T("</SPAN>        "</SPAN>);For a Trusted connection:· OS Authenticated connect setting user ID to "/": · strConnect = _T("</SPAN>

12、   "</SPAN>);· OS Authenticated connect using OSAuthent: strConnect = _T("</SPAN>)Note: "<CODE>For more information, see: Oracle Provider for OLE DB Developer's Guide.重要提示:        第一種連接方式不支持select * from “表”語(yǔ)句的表中帶

13、有時(shí)間戳和blob字段。即如果某表中帶有時(shí)間戳或者blob字段,則select *語(yǔ)句會(huì)出錯(cuò)。改進(jìn)的辦法為將所有字段寫(xiě)出來(lái),如果遇上時(shí)間戳字段,則進(jìn)行如下處理:select  字段1,字段2, to_char(時(shí)間字段, 'yyyy-mm-dd   hh24:mi:ss ')  時(shí)間字段別名,字段3   from   tablename;如果遇上blob字段,可以用select-where語(yǔ)句找到記錄,然后用updae語(yǔ)句更新。      

14、  第二種方式語(yǔ)句支持select * 語(yǔ)句,在程序上可以做到不少簡(jiǎn)化。常見(jiàn)錯(cuò)誤:網(wǎng)上不少朋友說(shuō)在用ORACLE的時(shí)候,記錄集open出錯(cuò),實(shí)際情況大致有兩種,一種就是連接字符串用了第一種,另一種方式就是定義表結(jié)構(gòu)的時(shí)候里面用到了ORACLE的關(guān)鍵字段。常見(jiàn)疑問(wèn):有些人問(wèn)Provider為什么有時(shí)候是OraOLEDB.Oracle,有時(shí)候是OraOLEDB.Oracle.1 ,其實(shí)這個(gè)問(wèn)題比較簡(jiǎn)單,用regedit打開(kāi)注冊(cè)表查詢(xún)一下即可,如果你的機(jī)器上兩種描述都有,則用其中任何一個(gè)即可,如果僅僅有一種名稱(chēng),那么程序中使用注冊(cè)表中描述的名稱(chēng)即可。不過(guò)需要指出的是,如果你的機(jī)器上使用的不

15、是企業(yè)版的ORACLE,而是10g EXPRESS,則當(dāng)該數(shù)據(jù)庫(kù)安裝了客戶(hù)端后,有時(shí)候會(huì)修改注冊(cè)表中連接串描述,導(dǎo)致連接字符串無(wú)效。但是不安裝客戶(hù)端,僅僅安裝服務(wù)器,程序就不會(huì)出問(wèn)題。 4,記錄集的常用open方式及區(qū)別       關(guān)于記錄集的描述,網(wǎng)上已經(jīng)有很多詳細(xì)的描述,在此不再累贅,需要指出的是,那些open的參數(shù)在其他數(shù)據(jù)庫(kù)中,似乎從記錄集的結(jié)果中看,區(qū)別不是很大。但是在ORACLE中,區(qū)別則較大,甚至?xí)绊懳覀兊某绦?。說(shuō)明如下:. .m_pKnowRecordset.CreateInstance(_uuidof(

16、Recordset);/第一步,應(yīng)該將記錄集實(shí)例化. .CString sSql; sSql = "SELECT * FROM InstanceInfo WHERE PropType = 1 "/第二步,生成相應(yīng)的select語(yǔ)句. .try    /第三步,打開(kāi)記錄集  m_pKnowRecordset->Open(variant_t)sSql,   theApp.m_ptrConnection.GetInterfacePtr(),   adOpe

17、nDynamic,/->也可以改為adOpenStatic adLockOptimistic,    adCmdText);  catch(_com_error * e)   AfxMessageBox(e->ErrorMessage(); . .if(m_pParaRecordset->State)   m_pParaRecordset->Close();/第四步,使用結(jié)束應(yīng)該關(guān)閉記錄集  m_pParaRecordse

18、t = NULL; 上述是記錄集常見(jiàn)使用步驟,大家應(yīng)該比較熟悉,但要特別申明如下:1)如果open方式使用的是adOpenDynamic,則如果程序中增加了記錄并且m_pKnowRecordset->Update()后,該記錄盡管會(huì)實(shí)時(shí)的添加到ORACLE數(shù)據(jù)庫(kù)中,但是m_pKnowRecordset中并沒(méi)有新添加的記錄,只有使用m_pKnowRecordset->Requery(0)語(yǔ)句才能將新增加的記錄添加到m_pKnowRecordset。網(wǎng)上很多人說(shuō)記錄集的記錄沒(méi)有增加到list中,或者只有重新登錄系統(tǒng)才能看到新增加的記錄即屬于此種情況。2,如果open方式使用的

19、是adOpenStatic,則中,僅僅使用m_pKnowRecordset->Update()即可將增加的記錄實(shí)時(shí)的反應(yīng)到m_pKnowRecordset中。3)上述情況在其他數(shù)據(jù)庫(kù)中沒(méi)有太大區(qū)別。因此如果大家如果在ORACLE中,在記錄集中出現(xiàn)問(wèn)題,不妨首先調(diào)整一下open參數(shù),不要馬上修改主程序?;蛟S你會(huì)得到意外驚喜! 5,oracle對(duì)NULL的個(gè)性處理以及ado中對(duì)update的影響假設(shè)我們?cè)貽RACLE數(shù)據(jù)庫(kù)中已經(jīng)定義了TEST表,表中有兩個(gè)字段,字段分別為A1,NUMBER; A2,VARCHER2(10);事先我們?cè)跀?shù)據(jù)庫(kù)中增加一個(gè)記錄1;“aa”,并且僅一條記錄

20、,下面的代碼可以重現(xiàn)錯(cuò)誤。/以下是測(cè)試NULL的代碼CString  sSql="SELECT * FROM TEST" try    m_pKnowRecordset->Open(variant_t)sSql,   theApp.m_ptrConnection.GetInterfacePtr(),   adOpenStatic,   adLockOptimistic,    adCmdTe

21、xt);  catch(_com_error * e)   AfxMessageBox(e->ErrorMessage();  m_pKnowRecordset->MoveFirst();/假設(shè)數(shù)據(jù)庫(kù)中僅僅一條記錄,切記 _variant_t var; var=m_pKnowRecordset->GetCollect("A2"); if(var.vt != VT_NULL)/如果數(shù)據(jù)庫(kù)中該條記錄的A2字段有數(shù)據(jù)   CStrin

22、g strTemp = (LPCSTR)_bstr_t(var);    CString m_sA2;  m_sA2=""  m_pKnowRecordset->PutCollect("A2" , (variant_t)m_sA2);  m_pKnowRecordset->Update();/第一次update / m_pKnowRecordset->Requery(0);/沒(méi)有這句話(huà)絕對(duì)在第二個(gè)update處出錯(cuò)&#

23、160; m_sA2="哈哈"  m_pKnowRecordset->PutCollect("A2" , (variant_t)m_sA2);  m_pKnowRecordset->Update();/該處可能出錯(cuò). .  else)/如果數(shù)據(jù)庫(kù)中該條記錄的A2字段沒(méi)有數(shù)據(jù)   CString m_sA2;  m_sA2=""  m_pKnowRecordset->PutColl

24、ect("A2" , (variant_t)m_sA2);  m_pKnowRecordset->Update();();/第一次update  m_pKnowRecordset->Requery(0);/沒(méi)有這句話(huà)絕對(duì)在第二個(gè)update處出錯(cuò)  m_sA2=""  m_pKnowRecordset->PutCollect("A2" , (variant_t)m_sA2);  m_pKnowRecordset->

25、;Update();/該處可能出錯(cuò). . /測(cè)試NULL代碼結(jié)束       為什么會(huì)出現(xiàn)上述錯(cuò)誤呢?在第二個(gè)的更新語(yǔ)句執(zhí)行中,在代碼中檢測(cè)到錯(cuò)誤。核心問(wèn)題的原因在于 Oracle 引擎將空的字符串轉(zhuǎn)換為 NULL,而不是“”。ADO 記錄集存儲(chǔ)一個(gè)零長(zhǎng)度緩沖區(qū)為空字符串。       因此,如果大家程序中遇上一條記錄多次更新出錯(cuò)的情況,應(yīng)該首先考慮對(duì)“”空字符串的處理多加一些邏輯判斷,或者更新update的時(shí)候增加Requery。   

26、0; 上述問(wèn)題在其他數(shù)據(jù)庫(kù)中比較正常。 6,timestamp字段的建議      時(shí)間戳在ORACLE中是比較個(gè)性的問(wèn)題,在數(shù)據(jù)庫(kù)中如果有timestamp字段,會(huì)給我們程序移植(移植到其他數(shù)據(jù)庫(kù))帶來(lái)諸多問(wèn)題,建議大家慎用,或者將時(shí)間改為字符串,或者將時(shí)間改為number。    1)如果是時(shí)間戳,應(yīng)該進(jìn)行如下程序的修改:     插入:insert   into   tablename (.,時(shí)間字段名 )&#

27、160;  values(.,sysdate)     檢索:select   to_char(時(shí)間字段, 'yyyy-mm-dd   hh24:mi:ss ')  時(shí)間字段別名 from   t_table   來(lái)獲得,.時(shí)間格式可以自己定/ 如果是想將某個(gè)時(shí)間insert到這個(gè)字段就用 to_date()insert into 表名 (字段) values (to_date(時(shí)間值,'yyyy-mm-dd hh24:m

28、i:ss');時(shí)間的默認(rèn)值可以在字段中設(shè)置sysdate    2) 將時(shí)間戳改為字符串的問(wèn)題比較簡(jiǎn)單,僅僅需要注意字符串格式一定要統(tǒng)一,長(zhǎng)度一定要定長(zhǎng)。    3)將時(shí)間改為number。-建議采用的方法        需要用到的核心函數(shù):time 函數(shù)原型: time_t time(time_t *timer) 函數(shù)功能: 得到機(jī)器的日歷時(shí)間或者設(shè)置日歷時(shí)間 函數(shù)返回: 機(jī)器日歷時(shí)間 參數(shù)說(shuō)明: timer=NULL時(shí)得到機(jī)器日歷時(shí)間,timer=時(shí)間數(shù)

29、值時(shí),用于設(shè)置日歷時(shí)間,time_t是一個(gè)long類(lèi)型。   取數(shù)據(jù)然后以時(shí)間格式展現(xiàn):   var = m_pKnowRecordset->GetCollect("PropDateTime");     if(var.vt != VT_NULL)           LONGLONG nTime = (LONGLONG)(var);   &

30、#160;  time_t tt = (time_t)nTime;      CTime * cTime = new CTime(tt);        CString sTime = cTime->Format("%Y-%m-%d %H:%M:%S");      m_ctrlListBase.SetItemText(i, 7,  sTim

31、e);       delete cTime;        將數(shù)據(jù)保存到數(shù)據(jù)庫(kù):   time_t ltime;   time( &ltime );   LONGLONG nTime = (LONGLONG)ltime;   m_pKnowRecordset->PutCollect("PropDatetime",

32、 (variant_t)(nTime);  相關(guān)time的一些詳細(xì)說(shuō)明如下:       頭文件<time.h>中說(shuō)明了一些用于處理日期和時(shí)間的類(lèi)型和函數(shù)。其中的一部分函數(shù)用于處理當(dāng)?shù)貢r(shí)間,因?yàn)闀r(shí)區(qū)等原因,當(dāng)?shù)貢r(shí)間與日歷時(shí)間可能不相同。clock_t和time_t是兩個(gè)用于表示時(shí)間的算術(shù)類(lèi)型,而struct tm則用于存放日歷時(shí)間的各個(gè)成分。tm的各個(gè)成員的用途及取值范圍如下:       int tm_sec; /* 秒,061 */ int

33、 tm_min; /* 分,059 */ int tm_hour; /* 時(shí),023 */ int tm_mday; /* 日,131 */ int tm_mon; /* 月(從1月開(kāi)始),011 */ int tm_year; /* 年(從1900年開(kāi)始) */ int tm_wday; /* 星期(從周日開(kāi)始),06 */ int tm_yday; /* 天數(shù)(從1月1日開(kāi)始),0365 */ int tm_isdst; /* 夏令時(shí)標(biāo)記 */       其中,tm_isdst在使用夏令時(shí)時(shí)其值為正,在不使用夏令時(shí)時(shí)其值為0,如果該信息不

34、能使用,其值為負(fù)。      clock#include <time.h> clock_t clock(void);        返回程序自開(kāi)始執(zhí)行到目前為止所占用的處理機(jī)時(shí)間。如果處理機(jī)時(shí)間不可使用,那么返回-1。clock()/CLOCKS_PER_SEC是以秒為單位表示的時(shí)間。      time#include <time.h>       time_t

35、 time(time_t *tp);      返回當(dāng)前日歷時(shí)間。如果日歷時(shí)間不能使用,則返回-1。如果tp不為NULL,那么同時(shí)把返回值賦給*tp。     difftime#include <time.h>      double difftime(time_t time2, time_t time1);      返回time2-time1的值(以秒為單位)。    

36、mktime#include <time.h>      time_t mktime(struct tm *tp);      將結(jié)構(gòu)*tp中的當(dāng)?shù)貢r(shí)間轉(zhuǎn)換為time_t類(lèi)型的日歷時(shí)間,并返回該時(shí)間。如果不能轉(zhuǎn)換,則返回-1。     asctime#include <time.h>       char *asctime(const struct tm *tp);  &#

37、160;    將結(jié)構(gòu)*tp中的時(shí)間轉(zhuǎn)換成如下所示的字符串形式:     day month date hours:minutes:seconds yearn0     如:        Fri Apr 15 15:14:13 2005n0       返回指向該字符串的指針。字符串存儲(chǔ)在可被其他調(diào)用重寫(xiě)的靜態(tài)對(duì)象中。   &

38、#160;   ctime#include <time.h>        char *ctime(const time_t *tp);       將*tp中的日歷時(shí)間轉(zhuǎn)換為當(dāng)?shù)貢r(shí)間的字符串,并返回指向該字符串指針。字符串存儲(chǔ)在可被其他調(diào)用重寫(xiě)的靜態(tài)對(duì)象中。等價(jià)于如下調(diào)用:     asctime(localtime(tp)      gmtime#in

39、clude <time.h>      struct tm *gmtime(const time_t *tp);        將*tp中的日歷時(shí)間轉(zhuǎn)換成struct tm結(jié)構(gòu)形式的國(guó)際標(biāo)準(zhǔn)時(shí)間(UTC),并返回指向該結(jié)構(gòu)的指針。如果轉(zhuǎn)換失敗,返回NULL。結(jié)構(gòu)內(nèi)容存儲(chǔ)在可被其他調(diào)用重寫(xiě)的靜態(tài)對(duì)象中。      localtime#include <time.h> struct tm *localtime(con

40、st time_t *tp);      將*tp中的日歷時(shí)間轉(zhuǎn)換成struct tm結(jié)構(gòu)形式的本地時(shí)間,并返回指向該結(jié)構(gòu)的指針。結(jié)構(gòu)內(nèi)容存儲(chǔ)在可被其他調(diào)用重寫(xiě)的靜態(tài)對(duì)象中。      strftime#include <time.h>       size_t strftime(char *s, size_t smax, const char *fmt, const struct tm *tp);    

41、;  根據(jù)fmt的格式說(shuō)明把結(jié)構(gòu)*tp中的日期與時(shí)間信息轉(zhuǎn)換成指定的格式,并存儲(chǔ)到s所指向的數(shù)組中,寫(xiě)到s中的字符數(shù)不能多于smax。函數(shù)返回實(shí)際寫(xiě)到s中的字符數(shù)(不包括'0');如果產(chǎn)生的字符數(shù)多于smax,則返回0。     fmt類(lèi)似于printf()中的格式說(shuō)明,它由0個(gè)或多個(gè)轉(zhuǎn)換規(guī)格說(shuō)明與普通字符組成。普通字符原封不動(dòng)的拷貝到s中,每個(gè)%c按照下面所描述的格式用與當(dāng)?shù)丨h(huán)境相適應(yīng)的值來(lái)替換。轉(zhuǎn)換規(guī)格列表如下:     返回當(dāng)前日歷時(shí)間。如果日歷時(shí)間不能使用,則返回-1。如果tp不為

42、NULL,那么同時(shí)把返回值賦給*tp。    格式 說(shuō)明 %a   一星期中各天的縮寫(xiě)名 %A 一星期中各天的全名 %b 縮寫(xiě)月份名 %B 月份全名 %c 當(dāng)?shù)貢r(shí)間和日期表示 %d 用整數(shù)表示的一個(gè)月中的第幾天(0131) %H 用整數(shù)表示的時(shí)(24小時(shí)制,0023) %I 用整數(shù)表示的時(shí)(12小時(shí)制,0112) %j 用整數(shù)表示的一年中各天(001366) %m 用整數(shù)表示的月份(0112) %M 用整數(shù)表示的分(0059) %p 與AM/PM對(duì)應(yīng)的當(dāng)?shù)乇硎痉椒?%S 用整數(shù)表示的秒(0061) %U 用整數(shù)表示一年中的星期數(shù)(0053,將星

43、期日看作為每周的第一天) %w 用整數(shù)表示一周中的各天(06,星期日為0) %W 用整數(shù)表示一年中的星期數(shù)(0053,將星期一看作為每周的第一天) %x 當(dāng)?shù)厝掌诒硎?%X 當(dāng)?shù)貢r(shí)間表示 %y 不帶公元的年(0099) %Y 完整年份表示 %Z 時(shí)區(qū)名字(可獲得時(shí)) % %本身   7,blob字段存取 1)BLOB數(shù)據(jù)的保存 BLOB類(lèi)型的數(shù)據(jù)無(wú)法用普通的方式進(jìn)行存儲(chǔ),我們需要使用AppendChunk函數(shù),AppendChunk包含在Field對(duì)象中,原型如下: HRESULT   AppendChunk  

44、(const   _variant_t   &   Data   ); 從函數(shù)原型中可以看到關(guān)鍵的問(wèn)題是我們需把二進(jìn)制數(shù)據(jù)賦值給VARIANT類(lèi)型的變量,下面我們給出具體的代碼并作簡(jiǎn)單的分析:   /假設(shè)m_pBMPBuffer指針指向一塊長(zhǎng)度為m_nFileLen的二進(jìn)制數(shù)據(jù),并且已經(jīng)成功打開(kāi)了記錄集對(duì)象m_pRecordset/ char     *pBuf   =   m_pBMPBuffer; VARIANT&

45、#160;    varBLOB; SAFEARRAY   *psa; SAFEARRAYBOUND   rgsabound1; m_pRecordset-> AddNew();           /添加新記錄 m_pRecordset-> PutCollect( "username ",_variant_t( "小李 ");    

46、 /為新記錄填充username字段 m_pRecordset-> PutCollect( "old ",_variant_t(long)28);           /填充old字段 if(pBuf)                rgsabound0.lLbound   =   0;  &

47、#160;    rgsabound0.cElements   =   m_nFileLen;       psa   =   SafeArrayCreate(VT_UI1,   1,   rgsabound);               

48、0;                             /創(chuàng)建SAFEARRAY對(duì)象       for   (long   i   =   0;   i 

49、;  <   (long)m_nFileLen;   i+)             SafeArrayPutElement   (psa,   &i,   pBuf+);                &

50、#160;                                  /將pBuf指向的二進(jìn)制數(shù)據(jù)保存到SAFEARRAY對(duì)象psa中       varBLOB.vt   = &#

51、160; VT_ARRAY   |   VT_UI1;                                          &

52、#160;                            /將varBLOB的類(lèi)型設(shè)置為BYTE類(lèi)型的數(shù)組       varBLOB.parray   =   psa;     &

53、#160;                                                 &

54、#160;                                   /為varBLOB變量賦值       m_pRecordset-> GetFields()-> GetItem( "ph

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論