




版權(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( <ime ); 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 個(gè)人律師服務(wù)合同范本
- 中鐵材料采購(gòu)合同范本
- oem簡(jiǎn)易合同范本
- 鄉(xiāng)鎮(zhèn)墓地銷(xiāo)售合同范本
- 北京技術(shù)開(kāi)發(fā)合同范本
- 分層施工方案
- 劇目買(mǎi)斷合同范例
- 包河區(qū)推廣品牌合同范本
- 農(nóng)村村民房屋出售合同范本
- XPE銷(xiāo)售合同范本
- 激光雷達(dá)行業(yè)市場(chǎng)規(guī)模分析
- 高血壓性心臟病病例討論
- 規(guī)劃院所長(zhǎng)述職報(bào)告
- 腦卒中后吞咽障礙患者進(jìn)食護(hù)理-護(hù)理團(tuán)標(biāo)
- 銷(xiāo)售人員商務(wù)禮儀培訓(xùn)通用課件
- 全國(guó)各省(直轄市、自治區(qū))市(自治州、地區(qū))縣(縣級(jí)市)區(qū)名稱(chēng)一覽表
- 大學(xué)美育導(dǎo)引 課件 第五章 體驗(yàn)人生在世-戲劇
- 大學(xué)美育導(dǎo)引 課件 第六章 沉浸光影世界-電影
- 化學(xué)品危險(xiǎn)物質(zhì)替代技術(shù)
- 醫(yī)院收費(fèi)價(jià)格注意培訓(xùn)課件
- 臨港產(chǎn)業(yè)基地污水處理廠提標(biāo)改造工程設(shè)備及安裝工程招投標(biāo)書(shū)范本
評(píng)論
0/150
提交評(píng)論