第一篇:數(shù)據(jù)庫編程總結(jié)(推薦)
數(shù)據(jù)庫編程總結(jié)
當(dāng)前各種主流數(shù)據(jù)庫有很多,包括Oracle, MS SQL Server, Sybase, Informix, MySQL, DB2, Interbase / Firebird, PostgreSQL, SQLite, SAP/DB, TimesTen, MS ACCESS等等。數(shù)據(jù)庫編程是對數(shù)據(jù)庫的創(chuàng)建、讀寫等一列的操作。數(shù)據(jù)庫編程分為數(shù)據(jù)庫客戶端編程與數(shù)據(jù)庫服務(wù)器端編程。數(shù)據(jù)庫客戶端編程主要使用ODBC API、ADO、ADO.NET、OCI、OTL等方法;數(shù)據(jù)庫服務(wù)端編程主要使用OLE DB等方法。數(shù)據(jù)庫編程需要掌握一些訪問數(shù)據(jù)庫技術(shù)方法,還需要注意怎么設(shè)計高效的數(shù)據(jù)庫、數(shù)據(jù)庫管理與運(yùn)行的優(yōu)化、數(shù)據(jù)庫語句的優(yōu)化。
一、訪問數(shù)據(jù)庫技術(shù)方法
數(shù)據(jù)庫編程分為數(shù)據(jù)庫客戶端編程與數(shù)據(jù)庫服務(wù)器端編程。數(shù)據(jù)庫客戶端編程主要使用ODBC API、ADO、ADO.NET、OCI、OTL等方法;數(shù)據(jù)庫服務(wù)端編程主要使用OLE DB等方法。
1、幾種是數(shù)據(jù)庫訪問方法比較
ODBC
API是一種適合數(shù)據(jù)庫底層開發(fā)的編程方法,ODBC
API提供大量對數(shù)據(jù)源的操作,ODBC
API能夠靈活地操作游標(biāo),支持各種幫定選項(xiàng),在所有ODBC相關(guān)編程中,API編程具有最高的執(zhí)行速度。DAO提供了很好的數(shù)據(jù)庫編程的對象模型.但是,對數(shù)據(jù)庫的所有調(diào)用以及輸出的數(shù)據(jù)都必須通過Access/Jet數(shù)據(jù)庫引擎,這對于使用數(shù)據(jù)庫應(yīng)用程序,是嚴(yán)重的瓶頸。
OLE
DB提供了COM接口,與傳統(tǒng)的數(shù)據(jù)庫接口相比,有更好的健壯性和靈活性,具有很強(qiáng)的錯誤處理能力,能夠同非關(guān)系數(shù)據(jù)源進(jìn)行通信。
ADO最主要的優(yōu)點(diǎn)在于易于使用、速度快、內(nèi)存支出少和磁盤遺跡小。
ADO.NET 是利用數(shù)據(jù)集的概念將數(shù)據(jù)庫數(shù)據(jù)讀入內(nèi)存中,然后在內(nèi)存中對數(shù)據(jù)進(jìn)行操作,最后將數(shù)據(jù)集數(shù)據(jù)回寫到源數(shù)據(jù)庫中。
OTL 是 Oracle, Odbc and DB2-CLI Template Library 的縮寫,是一個C++編譯中操控關(guān)系數(shù)據(jù)庫的模板庫,OTL中直接操作Oracle主要是通過Oracle提供的OCI接口進(jìn)行,進(jìn)行操作DB2數(shù)據(jù)庫則是通過CLI接口來進(jìn)行,至于MS的數(shù)據(jù)庫和其它一些數(shù)據(jù)庫,則OTL只提供了ODBC來操作的方式。當(dāng)然Oracle和DB2也可以由OTL間接使用ODBC的方式來進(jìn)行操縱。具有以下優(yōu)點(diǎn):跨平臺;運(yùn)行效率高,與C語言直接調(diào)用API相當(dāng);開發(fā)效率高,起碼比ADO.net使用起來更簡單,更簡潔;部署容易,不需要ADO組件,不需要.net framework 等。
2、VC數(shù)據(jù)庫編程幾種方法
VC數(shù)據(jù)庫編程幾種方法,包括ODBC連接、MFC
ODBC連接、DAO連接、OLE
DB、OLE
DB
Templates連接、ADO、Oracle專用方法(OCI(Oracle
Call
Interface)訪問、Oracle
Object
OLE
C++
Class
Library)。
<1.>通用方法
1.ODBC連接
ODBC(Open
DataBase
Connectivity)是MSOA的一部分,是一個標(biāo)準(zhǔn)數(shù)據(jù)庫接口。它提供對關(guān)系數(shù)據(jù)庫訪問的統(tǒng)一接口,實(shí)現(xiàn)對異構(gòu)數(shù)據(jù)源的一致訪問。ODBC數(shù)據(jù)訪問由以下部分組成:
<1>句柄(Handles):ODBC使用句柄來標(biāo)識ODBC環(huán)境、連接、語句和描述器.<2>緩存區(qū)(Buffers):
<3>數(shù)據(jù)類型(Data
types)
<4>一致性級別(Conformance
levels)
用ODBC設(shè)計客戶端的一般步驟:
<1>分配ODBC環(huán)境
<2>分配連接句柄
<3>連接數(shù)據(jù)源
<4>構(gòu)造和執(zhí)行SQL語句
<5>獲得查詢結(jié)果
<6>斷開數(shù)據(jù)源的連接
<7>釋放ODBC環(huán)境
ODBC
API是一種適合數(shù)據(jù)庫底層開發(fā)的編程方法,ODBC
API提供大量對數(shù)據(jù)源的操作,ODBC
API能夠靈活地操作游標(biāo),支持各種幫定選項(xiàng),在所有ODBC相關(guān)編程中,API編程具有最高的執(zhí)行速度.因此,ODBC
API編程屬于底層編程。
2.MFC
ODBC連接
MFC
ODBC是MFC對ODBC進(jìn)行的封裝,以簡化對ODBC
API的 調(diào)用,從而實(shí)現(xiàn)面向?qū)ο蟮臄?shù)據(jù)庫編程接口.MFC
ODBC的封裝主要開發(fā)了CDatabase類和CRecordSet類
(1)CDatabase類
CDatabase類用于應(yīng)用程序建立同數(shù)據(jù)源的連接。CDatabase類中包含一個m_hdbc變量,它代表了數(shù)據(jù)源的連接句柄。如果要建立CDatabase類的實(shí)例,應(yīng)先調(diào)用該類的構(gòu)造函數(shù),再調(diào)用Open函數(shù),通過調(diào)用,初始化環(huán)境變量,并執(zhí)行與數(shù)據(jù)源的連接。在通過Close函數(shù)關(guān)閉數(shù)據(jù)源。
CDatabase類提供了對數(shù)據(jù)庫進(jìn)行操作的函數(shù)及事務(wù)操作。
(2)CRecordSet類
CRecordSet類定義了從數(shù)據(jù)庫接收或者發(fā)送數(shù)據(jù)到數(shù)據(jù)庫的成員變量,以實(shí)現(xiàn)對數(shù)據(jù)集的數(shù)據(jù)操作。
CRecordSet類的成員變量m_hstmt代表了定義該記錄集的SQL語句句柄,m_nFields為記錄集中字段的個數(shù),m_nParams為記錄集所使用的參數(shù)個數(shù)。
CRecordSet的記錄集通過CDatabase實(shí)例的指針實(shí)現(xiàn)同數(shù)據(jù)源的連接,即CRecordSet的成員變量m_pDatabase.MFC
ODBC編程更適合于界面型數(shù)據(jù)庫應(yīng)用程序的開發(fā),但由于CDatabase類和CRecordSet類提供的數(shù)據(jù)庫操作函數(shù)有限,支持的游標(biāo)類型也有限,限制了高效的數(shù)據(jù)庫開發(fā)。在編程層次上屬于高級編程。
應(yīng)用實(shí)例: 1.打開數(shù)據(jù)庫
CDatabase database;
database.OpenEx(_T(“DSN=zhuxue”),CDatabase::noOdbcDialog);//zhuxue為數(shù)據(jù)源名稱
2.關(guān)聯(lián)記錄集
CRecordset recset(&database);
3.查詢記錄
CString sSql1=“";
sSql1 = ”SELECT * FROM tablename“;
recset.Open(CRecordset::forwardOnly, sSql1, CRecordset::readOnly);
int ti=0;
CDBVariant var;//var可以轉(zhuǎn)換為其他類型的值
while(!recset.IsEOF())
{
//讀取Excel內(nèi)部數(shù)值
recset.GetFieldValue(”id“,var);
jiangxiang[ti].id=var.m_iVal;
recset.GetFieldValue(”name“, jiangxiang[ti].name);
ti++;
recset.MoveNext();
}
recset.Close();//關(guān)閉記錄集
4.執(zhí)行sql語句
CString sSql=”“;
sSql+=”delete * from 院系審核“;//清空表
database.ExecuteSQL(sSql);
sSql也可以為Insert ,Update等語句
5.讀取字段名
sSql = ”SELECT * FROM Sheet1“;
//讀取的文件有Sheet1表的定義,或?yàn)楸境绦蛏傻谋?// 執(zhí)行查詢語句
recset.Open(CRecordset::forwardOnly, sSql, CRecordset::readOnly);
int excelColCount=recset.GetODBCFieldCount();//列數(shù)
CString excelfield[30];
//得到記錄集的字段集合中的字段的總個數(shù)
for(i=0;i { CODBCFieldInfo fieldinfo; recset.GetODBCFieldInfo(i,fieldinfo); excelfield[i].name =fieldinfo.m_strName;//字段名 } 6.打開excel文件 CString sDriver = ”MICROSOFT EXCEL DRIVER(*.XLS)“;// Excel安裝驅(qū)動 CString sSql,sExcelFile;//sExcelFile為excel的文件路徑 TRY { // 創(chuàng)建進(jìn)行存取的字符串 sSql.Format(”DRIVER={%s};DSN='';FIRSTROWHASNAMES=1;READONLY=FALSE;CREATE_DB=/“%s/”;DBQ=%s“,sDriver, sExcelFile, sExcelFile); // 創(chuàng)建數(shù)據(jù)庫(既Excel表格文件) if(database.OpenEx(sSql,CDatabase::noOdbcDialog)) { //可以把excel作為一個數(shù)據(jù)庫操作 } } catch(e) { TRACE1(”Excel驅(qū)動沒有安裝: %s“,sDriver); AfxMessageBox(”讀取失敗,請檢查是否定義數(shù)據(jù)區(qū)Sheet1“); } 3.DAO連接 DAO(Data Access Object)是一組Microsoft Access/Jet數(shù)據(jù)庫引擎的COM自動化接口.DAO直接與Access/Jet數(shù)據(jù)庫通信.通過Jet數(shù)據(jù)庫引擎,DAO也可以同其他數(shù)據(jù)庫進(jìn)行通信。DAO還封裝了Access數(shù)據(jù)庫的結(jié)構(gòu)單元,通過DAO可以直接修改Access數(shù)據(jù)庫的結(jié)構(gòu),而不必使用SQL的數(shù)據(jù)定義語言(DDL)。 DAO的體系結(jié)構(gòu)如下: DAO封裝的類: (1)CdaoWorkspace:對DAO工作區(qū)(數(shù)據(jù)庫處理事務(wù)管理器)的封裝 (2)CdaoDatabase:對DAO數(shù)據(jù)庫對象的封裝,負(fù)責(zé)數(shù)據(jù)庫連接.(3)CdaoRecordset:對DAO記錄集對象的封裝,代表所選的一組記錄.(4)CdaoTableDef:對表定義對象的封裝,代表基本表或附加表定義.(5)CdaoQueryDef:對查詢對象的封裝,包含所有查詢的定義.(6)CdaoException:DAO用于接收數(shù)據(jù)庫操作異常的類.(7)CDaoFieldExchange DAO提供了很好的數(shù)據(jù)庫編程的對象模型.但是,對數(shù)據(jù)庫的所有調(diào)用以及輸出的數(shù)據(jù)都必須通過Access/Jet數(shù)據(jù)庫引擎,這對于使用數(shù)據(jù)庫應(yīng)用程序,是嚴(yán)重的瓶頸。 DAO相對于ODBC來說,屬于高層的數(shù)據(jù)庫接口.4.OLE DB連接 OLE DB對ODBC進(jìn)行了兩方面的擴(kuò)展:一是提供了數(shù)據(jù)庫編程的OLE接口即COM,二是提供了一個可用于關(guān)系型和非關(guān)系型數(shù)據(jù)源的接口。 OLE DB提供了COM接口,與傳統(tǒng)的數(shù)據(jù)庫接口相比,有更好的健壯性和靈活性,具有很強(qiáng)的錯誤處理能力,能夠同非關(guān)系數(shù)據(jù)源進(jìn)行通信。 與ODBC API一樣,OLE DB也屬于底層的數(shù)據(jù)庫編程接口,OLE DB結(jié)合了ODBC對關(guān)系數(shù)據(jù)庫的操作功能,并進(jìn)行擴(kuò)展,可以訪問非關(guān)系數(shù)據(jù)庫。 OLE DB訪問數(shù)據(jù)庫的原理如下: OLE DB程序結(jié)構(gòu): OLE DB由客戶(Consumer)和服務(wù)器(Provider)。客戶是使用數(shù)據(jù)的應(yīng)用程序,它通過OLE DB接口對數(shù)據(jù)提供者的數(shù)據(jù)進(jìn)行訪問和控制。OLE DB服務(wù)器是提供OLE DB接口的軟件組件。根據(jù)提供的內(nèi)容可以分為數(shù)據(jù)提供程序(Data Provider)和服務(wù)提供程序(Service Provider)。 程序結(jié)構(gòu)原理圖如下: <1>數(shù)據(jù)提供程序 數(shù)據(jù)提供程序擁有自己的數(shù)據(jù)并把數(shù)據(jù)以表格的形式呈現(xiàn)給使用者使用.<2>服務(wù)提供程序 服務(wù)提供程序是數(shù)據(jù)提供程序和使用者的結(jié)合。它是OLE DB體系結(jié)構(gòu)中的中間件,它是OLE DB數(shù)據(jù)源的使用者和數(shù)據(jù)使用程序的提供者 <3>數(shù)據(jù)使用程序 數(shù)據(jù)使用程序?qū)Υ鎯υ跀?shù)據(jù)提供程序中的數(shù)據(jù)進(jìn)行使用和控制.OLE DB開發(fā)程序的一般步驟: <1>初始化COM環(huán)境 <2>連接數(shù)據(jù)源 <3>打開對話 <4>執(zhí)行命令 <5>處理結(jié)果 <6>清除對象 應(yīng)用實(shí)例: 使用OLEDB編寫數(shù)據(jù)庫應(yīng)用程序 1 概述 OLE DB的存在為用戶提供了一種統(tǒng)一的方法來訪問所有不同種類的數(shù)據(jù)源。OLE DB可以在不同的數(shù)據(jù)源中進(jìn)行轉(zhuǎn)換。利用OLE DB,客戶端的開發(fā)人員在進(jìn)行數(shù)據(jù)訪問時只需把精力集中在很少的一些細(xì)節(jié)上,而不必弄懂大量不同數(shù)據(jù)庫的訪問協(xié)議。OLE DB是一套通過COM接口訪問數(shù)據(jù)的ActiveX接口。這個OLE DB接口相當(dāng)通用,足以提供一種訪問數(shù)據(jù)的統(tǒng)一手段,而不管存儲數(shù)據(jù)所使用的方法如何。同時,OLE DB還允許開發(fā)人員繼續(xù)利用基礎(chǔ)數(shù)據(jù)庫技術(shù)的優(yōu)點(diǎn),而不必為了利用這些優(yōu)點(diǎn)而把數(shù)據(jù)移出來。 使用ATL使用OLE DB數(shù)據(jù)使用程序 由于直接使用OLE DB的對象和接口設(shè)計數(shù)據(jù)庫應(yīng)用程序需要書寫大量的代碼。為了簡化程序設(shè)計,Visual C++提供了ATL模板用于設(shè)計OLE DB數(shù)據(jù)應(yīng)用程序和數(shù)據(jù)提供程序。利用ATL模板可以很容易地將OLE DB與MFC結(jié)合起來,使數(shù)據(jù)庫的參數(shù)查詢等復(fù)雜的編程得到簡化。MFC提供的數(shù)據(jù)庫類使OLE DB的編程更具有面向?qū)ο蟮奶匦?。Viual C++所提供用于OLE DB的ATL模板可分為數(shù)據(jù)提供程序的模板和數(shù)據(jù)使用程序的模板。 使用ATL模板創(chuàng)建數(shù)據(jù)應(yīng)用程序一般有以下幾步驟: 1)、創(chuàng)建應(yīng)用框架 2)、加入ATL產(chǎn)生的模板類 3)、在應(yīng)用中使用產(chǎn)生的數(shù)據(jù)訪問對象3 不用ATL使用OLE DB數(shù)據(jù)使用程序 利用ATL模板產(chǎn)生數(shù)據(jù)使用程序較為簡單,但適用性不廣,不能動態(tài)適應(yīng)數(shù)據(jù)庫的變化。下面我們介紹直接使用MFC OLE DB類來生成數(shù)據(jù)使用程序。模板的使用 OLE DB數(shù)據(jù)使用者模板是由一些模板組成的,包括如下一些模板,下面對一些常用類作一些介紹。1)、會話類 CDataSource類 CDataSource類與OLE DB的數(shù)據(jù)源對象相對應(yīng)。這個類代表了OLE DB數(shù)據(jù)提供程序和數(shù)據(jù)源之間的連接。只有當(dāng)數(shù)據(jù)源的連接被建立之后,才能產(chǎn)生會話對象,可以調(diào)用Open來打開數(shù)據(jù)源的連接。CSession類 CSession所創(chuàng)建的對象代表了一個單獨(dú)的數(shù)據(jù)庫訪問的會話。一個用CDataSource類產(chǎn)生的數(shù)據(jù)源對象可以創(chuàng)建一個或者多個會話,要在數(shù)據(jù)源對象上產(chǎn)生一個會話對象,需要調(diào)用函數(shù)Open()來打開。同時,會話對象還可用于創(chuàng)建事務(wù)操作。 CEnumeratorAccessor類 CEnumeratorAccessor類是用來訪問枚舉器查詢后所產(chǎn)生的行集中可用數(shù)據(jù)提供程序的信息的訪問器,可提供當(dāng)前可用的數(shù)據(jù)提供程序和可見的訪問器。2)、訪問器類 CAcessor類 CAccessor類代表與訪問器的類型。當(dāng)用戶知道數(shù)據(jù)庫的類型和結(jié)構(gòu)時,可以使用此類。它支持對一個行集采用多個訪問器,并且,存放數(shù)據(jù)的緩沖區(qū)是由用戶分配的。CDynamicAccessor類 CDynamicAccessor類用來在程序運(yùn)行時動態(tài)的創(chuàng)建訪問器。當(dāng)系統(tǒng)運(yùn)行時,可以動態(tài)地從行集中獲得列的信息,可根據(jù)此信息動態(tài)地創(chuàng)建訪問器。CManualAccessor類 CManualAccessor類中以在程序運(yùn)行時將列與變量綁定或者是將參數(shù)與變量捆定。3)、行集類 CRowSet類 CRowSet類封裝了行集對象和相應(yīng)的接口,并且提供了一些方法用于查詢、設(shè)置數(shù)據(jù)等??梢杂肕ove()等函數(shù)進(jìn)行記錄移動,用GetData()函數(shù)讀取數(shù)據(jù),用Insert()、Delete()、SetData()來更新數(shù)據(jù)。CBulkRowset類 CBulkRowset類用于在一次調(diào)用中取回多個行句柄或者對多個行進(jìn)行操作。CArrayRowset類 CArrayRowset類提供用數(shù)組下標(biāo)進(jìn)行數(shù)據(jù)訪問。4)、命令類 CTable類 CTable類用于對數(shù)據(jù)庫的簡單訪問,用數(shù)據(jù)源的名稱得到行集,從而得到數(shù)據(jù)。CCommand類 CCommand類用于支持命令的數(shù)據(jù)源。可以用Open()函數(shù)來執(zhí)行SQL命令,也可以Prepare()函數(shù)先對命令進(jìn)行準(zhǔn)備,對于支持命令的數(shù)據(jù)源,可以提高程序的靈活性和健壯性。 在stdafx.h頭文件里,加入如下代碼。#include 在打開數(shù)據(jù)源,會話,行集對象后就可以獲取數(shù)據(jù)了。所獲取的數(shù)據(jù)類型取決于所用的存取程序,可能需要綁定列。按以下步驟。 1、用正確的命令打開行集對象。 2、如果使用CManualAccessor,在使用之前與相應(yīng)列進(jìn)行綁定。要綁定列,可以用函數(shù)GetColumnInfo,如下所示: // Get the column information ULONG ulColumns = 0;DBCOLUMNINFO* pColumnInfo = NULL;LPOLESTR pStrings = NULL;if(rs.GetColumnInfo(&ulColumns, &pColumnInfo, &pStrings)!= S_OK)AfxThrowOLEDBException(rs.m_pRowset, IID_IColumnsInfo);struct MYBIND* pBind = new MYBIND[ulColumns];rs.CreateAccessor(ulColumns, &pBind[0], sizeof(MYBIND)*ulColumns);for(ULONG l=0;l 3、用while循環(huán)來取數(shù)據(jù)。在循環(huán)中,調(diào)用MoveNext來測試光標(biāo)的返回值是否為S_OK,如下所示: while(rs.MoveNext()== S_OK){ // Add code to fetch data here // If you are not using an auto accessor, call rs.GetData()} 4、在while循環(huán)內(nèi),可以通過不同的存取程序獲取數(shù)據(jù)。1)如果使用的是CAccessor類,可以通過使用它們的數(shù)據(jù)成員進(jìn)行直接訪問。如下所示: 2)如果使用的是CDynamicAccessor 或CDynamicParameterAccessor 類,可以通過GetValue或GetColumn函數(shù)來獲取數(shù)據(jù)。可以用GetType來獲取所用數(shù)據(jù)類型。如下所示: while(rs.MoveNext()== S_OK){ // Use the dynamic accessor functions to retrieve your // data ULONG ulColumns = rs.GetColumnCount(); for(ULONG i=0;i { rs.GetValue(i); } } 3)如果使用的是CManualAccessor,可以指定自己的數(shù)據(jù)成員,綁定它們。就可以直接存取。如下所示: while(rs.MoveNext()== S_OK){ // Use the data members you specified in the calls to // AddBindEntry.wsprintf(”%s“, szFoo);} 決定行集的數(shù)據(jù)類型 在運(yùn)行時決定數(shù)據(jù)類型,要用動態(tài)或手工的存取程序。如果用的是手工存取程序,可以用GetColumnInfo函數(shù)得到行集的列信息。從這里可以得到數(shù)據(jù)類型。4 總結(jié) 由于現(xiàn)在有多種數(shù)據(jù)源,想要對這些數(shù)據(jù)進(jìn)行訪問管理的唯一途徑就是通過一些同類機(jī)制來實(shí)現(xiàn),如OLE DB。高級OLE DB結(jié)構(gòu)分成兩部分:客戶和提供者。客戶使用由提供者生成的數(shù)據(jù)。 就像其它基于COM的多數(shù)結(jié)構(gòu)一樣,OLE DB的開發(fā)人員需要實(shí)現(xiàn)很多的接口,其中大部分是模板文件。 當(dāng)生成一個客戶對象時,可以通過ATL對象向?qū)е赶蛞粋€數(shù)據(jù)源而創(chuàng)建一個簡單的客戶。ATL對象向?qū)z查數(shù)據(jù)源并創(chuàng)建數(shù)據(jù)庫的客戶端代理。從那里,可以通過OLE DB客戶模板使用標(biāo)準(zhǔn)的瀏覽函數(shù)。 當(dāng)生成一個提供者時,向?qū)峁┝艘粋€很好的開端,它們僅僅是生成了一個簡單的提供者來列舉某一目錄下的文件。然后,提供者模板包含了OLE DB支持的完全補(bǔ)充內(nèi)容。在這種支持下,用戶可以創(chuàng)建OLE DB提供者,來實(shí)現(xiàn)行集定位策略、數(shù)據(jù)的讀寫以及建立書簽。應(yīng)用案例: Visual C++中使用OLE DB讀寫SQL Server 在需要對數(shù)據(jù)庫進(jìn)行操作時,OLE DB總是被認(rèn)為是一種效率最高但最難的方法。但是以我最近使用OLE DB的經(jīng)驗(yàn)看來,OLE DB的效率高則高矣,但卻一點(diǎn)都不難。說它難恐怕主要是因?yàn)榭蓞⒖嫉闹形馁Y料太少,為了幫助以后需要接觸OLE DB的同行,我撰寫了這篇文章。本文包含如下內(nèi)容: 1.OLE DB寫數(shù)據(jù)庫; 2.OLE DB讀數(shù)據(jù)庫; 3.OLE DB對二進(jìn)制數(shù)據(jù)(text、ntext、image等)的處理。 首先來看看對SQL Server進(jìn)行寫操作的代碼,有一定VC基礎(chǔ)的讀者應(yīng)該可以很順利地看懂。OLE DB寫數(shù)據(jù)庫,就是這么簡單! 注: 1.以下代碼中使用的模板類EAutoReleasePtr 2.以下代碼均在UNICODE環(huán)境下編譯,因?yàn)閳?zhí)行的SQL語句必須是UNICODE的。設(shè)置工程為UNICODE的方法是:首先在project->settings->C/C++的屬性頁中的Preprocessor中,刪除_MBCS寫入UNICODE,_UNICODE。然后在link屬性頁中Category中選擇output,在Entry-Point symbol 中添加wWinMainCRTStartup。 EAutoReleasePtr //失敗,可能是因?yàn)閿?shù)據(jù)庫沒有啟動、用戶名密碼錯等等 return;}EAutoReleasePtr //出錯 return;}EAutoReleasePtr //出錯 return;}hResult = ExecuteSQL(pICommand, pICommandText, _T(”USE PBDATA“));if(FAILED(hResult)){ //如果這里失敗,那就是SQL語句執(zhí)行失敗。在此處,就是PBDATA還未創(chuàng)建 return;} // 創(chuàng)建表 ExecuteSQL(pICommand, pICommandText, _T(”CREATE TABLE 2005_1(Volume real NOT NULL,ID int NOT NULL IDENTITY)“)); // 添加記錄 ExecuteSQL(pICommand, pICommandText, _T(”INSERT INTO 2005_1 VALUES(100.0)“));//...其中幾個函數(shù)的代碼如下: HRESULT ConnectDatabase(IDBInitialize** ppIDBInitialize, LPCTSTR pszDataSource, LPCTSTR pszUserID, LPCTSTR pszPassword){ ASSERT(ppIDBInitialize!= NULL && pszDataSource!= NULL && pszUserID!= NULL && pszPassword!= NULL); UINT uTimeout = 15U;// 連接數(shù)據(jù)庫超時(秒) TCHAR szInitStr[1024]; VERIFY(1023 >= wsprintf(szInitStr, _T(”Provider=SQLOLEDB;Data Source=%s;Initial Catalog=master;User Id=%s;Password=%s;Connect Timeout=%u“), pszDataSource, pszUserID, pszPassword, uTimeout)); //Initial Catalog=master指明連接成功后,”USE master“。 EAutoReleasePtr HRESULT hResult = ::CoCreateInstance(CLSID_MSDAINITIALIZE, NULL, CLSCTX_INPROC_SERVER,IID_IDataInitialize,(void**)&pIDataInitialize); if(FAILED(hResult)) { return hResult; } EAutoReleasePtr hResult = pIDataInitialize->GetDataSource(NULL, CLSCTX_INPROC_SERVER,(LPCOLESTR)szInitStr,IID_IDBInitialize,(IUnknown**)&pIDBInitialize); if(FAILED(hResult)) { return hResult; } hResult = pIDBInitialize->Initialize(); if(FAILED(hResult)) { return hResult; } * ppIDBInitialize = pIDBInitialize.Detach(); return S_OK;} HRESULT CreateSession(IDBInitialize* pIDBInitialize, IOpenRowset** ppIOpenRowset){ ASSERT(pIDBInitialize!= NULL && ppIOpenRowset!= NULL); EAutoReleasePtr HRESULT hResult = pIDBInitialize->QueryInterface(IID_IDBCreateSession,(void**)&pSession); if(FAILED(hResult)) { return hResult; } EAutoReleasePtr hResult = pSession->CreateSession(NULL, IID_IOpenRowset,(IUnknown**)&pIOpenRowset); if(FAILED(hResult)) { return hResult; } * ppIOpenRowset = pIOpenRowset.Detach(); return S_OK;} HRESULT CreateCommand(IOpenRowset* pIOpenRowset, ICommand** ppICommand, ICommandText** ppICommandText){ ASSERT(pIOpenRowset!= NULL && ppICommand!= NULL && ppICommandText!= NULL); HRESULT hResult; EAutoReleasePtr { EAutoReleasePtr hResult = pIOpenRowset->QueryInterface(IID_IDBCreateCommand,(void**)&pICreateCommand); if(FAILED(hResult)) { return hResult; } hResult = pICreateCommand->CreateCommand(NULL, IID_ICommand,(IUnknown**)&pICommand); if(FAILED(hResult)) { return hResult; } } EAutoReleasePtr hResult = pICommand->QueryInterface(&pICommandText); if(FAILED(hResult)) { return hResult; } * ppICommand = pICommand.Detach(); * ppICommandText = pICommandText.Detach(); return S_OK;} HRESULT ExecuteSQL(ICommand* pICommand, ICommandText* pICommandText, LPCTSTR pszCommand, LONG* plRowsAffected){ ASSERT(pICommand!= NULL && pICommandText!= NULL && pszCommand!= NULL && pszCommand[0]!= 0); HRESULT hResult = pICommandText->SetCommandText(DBGUID_DBSQL,(LPCOLESTR)pszCommand); if(FAILED(hResult)) { return hResult; } LONG lAffected; hResult = pICommand->Execute(NULL, IID_NULL, NULL, plRowsAffected == NULL ? &lAffected : plRowsAffected,(IUnknown**)NULL); return hResult;} 以上就是寫數(shù)據(jù)庫的全部代碼了,是不是很簡單呢?下面再來讀的。 // 先用與上面代碼中一樣的步驟獲取pICommand,pICommandText。此處省略 HRESULT hResult = pICommandText->SetCommandText(DBGUID_DBSQL,(LPCOLESTR)_T(”SELECT Volume FROM 2005_1 WHERE ID = @@IDENTITY"));//取我們剛剛添加的那一條記錄 if(FAILED(hResult)){ return;} LONG lAffected;EAutoReleasePtr return;} EAutoReleasePtr return;} // 一個根據(jù)表中各字段的數(shù)值類型而定義的結(jié)構(gòu),用于存儲返回的各字段的值 struct CLoadLastFromDB { DBSTATUS dwdsVolume; DWORD dwLenVolume; float fVolume;}; // 此處我們只查詢了一個字段。如果要查詢多個字段,CLoadLastFromDB中要添加相應(yīng)的字段定義,下面的dbBinding也要相應(yīng)擴(kuò)充。dbBinding[].iOrdinal要分別指向各個字段,dbBinding[].wType要根據(jù)字段類型賦合適的值。 DBBINDING dbBinding[1];dbBinding[0].iOrdinal = 1; // Volume 字段的位置,從 1 開始 dbBinding[0].obValue = offsetof(CLoadLastFromDB, fVolume);dbBinding[0].obLength = offsetof(CLoadLastFromDB, dwLenVolume);dbBinding[0].obStatus = offsetof(CLoadLastFromDB, dwdsVolume);dbBinding[0].pTypeInfo = NULL;dbBinding[0].pObject = NULL;dbBinding[0].pBindExt = NULL;dbBinding[0].dwPart = DBPART_VALUE | DBPART_STATUS | DBPART_LENGTH;dbBinding[0].dwMemOwner = DBMEMOWNER_CLIENTOWNED;dbBinding[0].eParamIO = DBPARAMIO_NOTPARAM;dbBinding[0].cbMaxLen = 0;dbBinding[0].dwFlags = 0; 尊敬的人力資源部領(lǐng)導(dǎo): 您好!我叫,感謝您在百忙之中查看我的資料。我是新華學(xué)校的一名應(yīng)屆畢業(yè)生,在校期間,我勤奮努力學(xué)習(xí),成績優(yōu)異,多次獲學(xué)校學(xué)金,掌握了windows、c語言、pasca、,數(shù)據(jù)結(jié)構(gòu)、數(shù)據(jù)庫原理等專業(yè)基礎(chǔ)知識。同時,通過大量的實(shí)際操作,我熟練掌握了dos,windows操作系統(tǒng),并對unix有一定的了解,能夠獨(dú)立Word、Excel、Photoshop等應(yīng)用等軟件,有一定的語言編程基礎(chǔ),在經(jīng)濟(jì)信息及計算機(jī)應(yīng)用專業(yè)通過三年的學(xué)習(xí),我已具備了扎實(shí)的專業(yè)基礎(chǔ)知識功底。 作為一名的學(xué)生,我認(rèn)識到互聯(lián)網(wǎng)將在未來經(jīng)濟(jì)中發(fā)揮巨大的作用,所以,業(yè)余時間我刻苦自學(xué)了很多網(wǎng)絡(luò)知識。首先,在internet基礎(chǔ)應(yīng)用方面,比如瀏覽網(wǎng)頁,搜索引擎的使用,網(wǎng)上查找,下載所需信息等都很熟練。而且,我還不滿足于此,進(jìn)一步學(xué)習(xí)了html語言,和,frontpage,dreamweaver等網(wǎng)頁編輯軟件,firework,flash等網(wǎng)頁圖形處理軟件,可以自如的進(jìn)行網(wǎng)頁編輯。現(xiàn)在我在互聯(lián)網(wǎng)上,就已經(jīng)建立了自己的個人主頁,并用文件傳輸協(xié)議(ftp)進(jìn)行維護(hù)和。不斷的努力使我的網(wǎng)站日趨成熟。 當(dāng)然一個高素質(zhì)除了掌握扎實(shí)的專業(yè)知識,還應(yīng)該具有豐富的人文知識。我從小熱愛文學(xué),廣覽群書,為我的寫作能力奠定了堅(jiān)實(shí)的基礎(chǔ)。讀書以來,不斷參加校內(nèi)外征文活動,發(fā)表過作品數(shù)篇。特別在大學(xué)期間,被特邀為校報記者,參賽文章多次獲得校園文學(xué)獎。.此外,在英語的學(xué)習(xí)方面,我已具備了一定的聽,說,寫和會話能力,可以用英語進(jìn)行日常的交流。 未來社會需要的是理論和實(shí)踐相結(jié)合的復(fù)合型。學(xué)習(xí)之余,我參加了大量的社會實(shí)踐活動,做家教,去商場做過促銷員,從而鍛煉了自己吃苦耐勞,一絲不茍的工作做風(fēng).未來是一個充滿挑戰(zhàn)的世界,鮮花和榮譽(yù)只能代表過去。年輕的我希望公司給我展示自我的機(jī)會。沒有您伯樂的眼光,對我來講那是一種遺憾。因此,我非常希望能夠成為貴公司的一員。我將以更大的熱情和勤奮上進(jìn)的工作態(tài)度投入到新的工作環(huán)境中去,為公司的發(fā)展添磚加瓦。 愿公司的明天更美好! 此致 敬禮 數(shù)據(jù)庫編程,這個是作為一個次第員根本功,絕大多數(shù)軟件開辟公司數(shù)據(jù)庫編程都是由次第員自己完成,由于他義務(wù)量不是很大,也不是很冗雜,但是一些大點(diǎn)軟件公司是協(xié)作清楚,數(shù)據(jù)庫編程職員和開辟職員是兼并,只管對數(shù)據(jù)庫支配那部分,當(dāng)然他們之間少不溝通。作為一個剖析次第員,進(jìn)修數(shù)據(jù)庫編程,無非就是數(shù)據(jù)庫四大支配,增刪改查,還有觸發(fā)、存儲進(jìn)程等使用,這些都是基礎(chǔ)基礎(chǔ)。很多學(xué)員以為數(shù)據(jù)庫很冗雜,進(jìn)修時分吊兒郎當(dāng),還不會連接查詢,要避免這種情況發(fā)作就必須打好基礎(chǔ),堅(jiān)固掌握每個學(xué)問點(diǎn)。 大概你會問,數(shù)據(jù)庫很多種,我該進(jìn)修那種?我以為,SQL Server數(shù)據(jù)庫是最基礎(chǔ)一個,他使用面積相比普遍,再說,任何一個數(shù)據(jù)庫核心都是一樣,SQL掌握堅(jiān)固,換成冗雜MySQL、Access根本不成標(biāo)題,即使要用Oracle,也只需求和SQL相比稍微進(jìn)修一下就足以!在中止對比進(jìn)修時分,要先從基礎(chǔ)末尾,比如數(shù)據(jù)類型、運(yùn)算符號、關(guān)鍵字等等,然后降落到一些內(nèi)置函數(shù)、邏輯編程、差錯處置等等。這樣一對比,對新學(xué)問掌握會又快又堅(jiān)固。當(dāng)然這些條件是你SQL大概數(shù)據(jù)庫中任何一種掌握十分堅(jiān)固,否則,進(jìn)修再多再廣也是云里霧里轉(zhuǎn)悠,到頭來一種也不能很好是使用。 下面說說做數(shù)據(jù)庫管理和維護(hù),數(shù)據(jù)庫管理員是特地?fù)?dān)任對管理數(shù)據(jù)庫,他不只僅限于對數(shù)據(jù)保管備份,還觸及到為使用次第提供可靠數(shù)據(jù)音訊。數(shù)據(jù)庫管理員是后臺最為次要角色,數(shù)據(jù)庫安全性、可靠性都是特地次要,只需數(shù)據(jù)安全,才干為前臺提供愈加優(yōu)秀效力。作為一名數(shù)據(jù)庫管理員,懇求標(biāo)準(zhǔn)遠(yuǎn)遠(yuǎn)高于數(shù)據(jù)庫編程職員,由于管理員要同時具有編程職員素質(zhì)和管理維護(hù)數(shù)據(jù)庫技藝,數(shù)據(jù)庫管理員手冊中專業(yè)學(xué)問很多,還觸及到一部分對數(shù)據(jù)剖析義務(wù),這個對一個企業(yè)做出決策有著很次要,所以數(shù)據(jù)庫管理員還要具有數(shù)據(jù)剖析才干和十分鋒利洞察力,同時具有經(jīng)歷總結(jié)才干,一旦數(shù)據(jù)庫發(fā)作十分和差錯,能夠依據(jù)學(xué)問和經(jīng)歷很好處置標(biāo)題。 只需你處置計算機(jī)行業(yè),就需求進(jìn)修睦數(shù)據(jù)庫基礎(chǔ)學(xué)問,不論以后選擇哪個方向,數(shù)據(jù)庫進(jìn)修都不能放松。古人云:書到用時方和少,學(xué)問學(xué)多不會成為擔(dān)負(fù),慢慢積聚,總有用到時分。給自己清楚一個手段,剩下就是向著這個手段勤勞,不論碰到什么困難,抑制它就向成功更近一步。 Dear leaders: Hello! I am a forthcoming XXXX University XX in XX graduate students, the school is a computer professional.University for four years, I study hard, the outstanding, have been awarded scholarships.Mentorship in the strict lessons and individual efforts, I have a solid foundation of knowledge.In terms of software, systems have C language, data structure, power Builder, database theory, assembly language, software engineering and object-oriented, such as DELpHI and VC have a certain understanding of Windows programming.I also had extra-curricular learning VB, VF programming, ASp and SQL Server dynamic pages, such as web-based database programming language.Has been prepared by an independent professional database management system.In terms of hardware, through its participation in single-chip design, assembly of the radio, network planning and management projects and the formation of such practice, I have a computer and the working principle of the principle of computer network technology.Into the school since, I take full advantage of a wide range of spare time to participate in social practice.College information in our school computer lab to work two years, not only the professional skills I have been raised, but also the management and organization, I will be able to play and further training, leadership and teachers received recognition and praise.Moreover, science and technology in Europe and Asia have some of the company's work experience, I have some marketing experience and social experience, and outstanding performance.In addition, at school, I also made home, the practice of social surveys and other social activities, and accumulated a wealth of practical experience.If fortunate enough to join, I can dedicated to your company's software development, or at any time in accordance with the needs of the company is committed to a work and learning.“Soon Come, come against, I dust free” is my motto;“immersive an abyss, treading on thin ice” is the attitude of my work;“sincere, and trustworthy” is my most prominent feature;an open mind has given me many friends.Smart-minded, creative thinking, and pioneering spirit of tenacity, coupled with sophisticated professional skills, I believe I am the best choice for you.please give me a chance, I will also you to eye-catching glory.Thank you for your patience in reading my cover letter, such as the need for detailed information, please contact me.敬候good news! 數(shù)據(jù)庫編程的自薦信例文,關(guān)鍵詞是自薦信,數(shù)據(jù)庫編程, 尊敬的人力資源部領(lǐng)導(dǎo): 您好!我叫劉欣,感謝您在百忙之中查看我的資料。我是新華學(xué)校的一名好范文,在校期間,我勤奮努力學(xué)習(xí),成績優(yōu)異,多次獲學(xué)校學(xué)金,掌握了windows、c語言、pasca、,數(shù)據(jù)結(jié)構(gòu)、數(shù)據(jù)庫原理等專業(yè)基礎(chǔ)知識。同時,通過大量的實(shí)際操作,我熟練掌握了dos,windows操作系統(tǒng),并對unix有一定的了解,能夠獨(dú)立Word、Excel、photoshop等應(yīng)用等軟件,有一定的語言編程基礎(chǔ),在經(jīng)濟(jì)信息及計算機(jī)應(yīng)用專業(yè)通過三年的學(xué)習(xí),我已具備了扎實(shí)的專業(yè)基礎(chǔ)知識功底。 作為一名的學(xué)生,我認(rèn)識到互聯(lián)網(wǎng)將在未來經(jīng)濟(jì)中發(fā)揮巨大的作用,所以,業(yè)余時間我刻苦自學(xué)了很多網(wǎng)絡(luò)知識。首先,在internet基礎(chǔ)應(yīng)用方面,比如瀏覽網(wǎng)頁,搜索引擎的使用,網(wǎng)上查找,下載所需信息等都很熟練。而且,我還不滿足于此,進(jìn)一步學(xué)習(xí)了html語言,和,frontpage,dreamweaver等網(wǎng)頁編輯軟件,firework,flash等網(wǎng)頁圖形處理軟件,可以自如的進(jìn)行網(wǎng)頁編輯?,F(xiàn)在我在互聯(lián)網(wǎng)上,就已經(jīng)建立了自己的個人主頁,并用文件傳輸協(xié)議(ftp)進(jìn)行維護(hù)和。不斷的努力使我的網(wǎng)站日趨成熟。 當(dāng)然一個高素質(zhì)除了掌握扎實(shí)的專業(yè)知識,還應(yīng)該具有豐富的人文知識。我從小熱愛文學(xué),廣覽群書,為我的寫作能力奠定了堅(jiān)實(shí)的基礎(chǔ)。讀書以來,不斷參加校內(nèi)外征文活動,發(fā)表過作品數(shù)篇。特別在大學(xué)期間,被特邀為校報記者,參賽文章多次獲得校園文學(xué)獎。.此外,在英語的學(xué)習(xí)方面,我已具備了一定的聽,說,寫和會話能力,可以用英語進(jìn)行日常的交流。 未來社會需要的是理論和實(shí)踐相結(jié)合的復(fù)合型。學(xué)習(xí)之余,我參加了大量的社會實(shí)踐活動,做家教,去商場做過促銷員,從而鍛煉了自己吃苦耐勞,一絲不茍的工作做風(fēng).未來是一個充滿挑戰(zhàn)的世界,鮮花和榮譽(yù)只能代表過去。年輕的我希望公司給我展示自我的機(jī)會。沒有您伯樂的眼光,對我來講那是一種遺憾。因此,我非常希望能夠成為貴公司的一員。我將以更大的熱情和勤奮上進(jìn)的工作態(tài)度投入到新的工作環(huán)境中去,為公司的發(fā)展添磚加瓦。 愿公司的明天更美好! 此致 敬禮第二篇:數(shù)據(jù)庫編程的求職信范文
第三篇:數(shù)據(jù)庫編程心得
第四篇:數(shù)據(jù)庫編程專業(yè)英文求職信
第五篇:數(shù)據(jù)庫編程的自薦信例文