数据库编程总结Word下载.docx
《数据库编程总结Word下载.docx》由会员分享,可在线阅读,更多相关《数据库编程总结Word下载.docx(22页珍藏版)》请在冰点文库上搜索。
缓存区(Buffers):
3&
数据类型(Datatypes)
4&
一致性级别(Conformancelevels)
用ODBC设计客户端的一般步骤:
分配ODBC环境
分配连接句柄
连接数据源
构造和执行SQL语句
5&
获得查询结果
6&
断开数据源的连接
7&
释放ODBC环境
ODBCAPI是一种适合数据库底层开发的编程方法,ODBCAPI提供大量对数据源的操作,ODBCAPI能够灵活地操作游标,支持各种帮定选项,在所有ODBC相关编程中,API编程具有最高的执行速度.因此,ODBCAPI编程属于底层编程。
2.MFCODBC连接
MFCODBC是MFC对ODBC进行的封装,以简化对ODBCAPI的调用,从而实现面向对象的数据库编程接口.
MFCODBC的封装主要开发了CDatabase类和CRecordSet类
(1)CDatabase类
CDatabase类用于应用程序建立同数据源的连接。
CDatabase类中包含一个m_hdbc变量,它代表了数据源的连接句柄。
如果要建立CDatabase类的实例,应先调用该类的构造函数,再调用Open函数,通过调用,初始化环境变量,并执行与数据源的连接。
在通过Close函数关闭数据源。
CDatabase类提供了对数据库进行操作的函数及事务操作。
(2)CRecordSet类
CRecordSet类定义了从数据库接收或者发送数据到数据库的成员变量,以实现对数据集的数据操作。
CRecordSet类的成员变量m_hstmt代表了定义该记录集的SQL语句句柄,m_nFields为记录集中字段的个数,m_nParams为记录集所使用的参数个数。
CRecordSet的记录集通过CDatabase实例的指针实现同数据源的连接,即CRecordSet的成员变量m_pDatabase.
MFCODBC编程更适合于界面型数据库应用程序的开发,但由于CDatabase类和CRecordSet类提供的数据库操作函数有限,支持的游标类型也有限,限制了高效的数据库开发。
在编程层次上属于高级编程。
应用实例:
1.打开数据库
CDatabasedatabase;
database.OpenEx(_T("
DSN=zhuxue"
),CDatabase:
:
noOdbcDialog);
//zhuxue为数据源名称
2.关联记录集
CRecordsetrecset(&
amp;
database);
3.查询记录
CStringsSql1="
"
;
sSql1="
SELECT*FROMtablename"
;
recset.Open(CRecordset:
forwardOnly,sSql1,CRecordset:
readOnly);
intti=0;
CDBVariantvar;
//var可以转换为其他类型的值
while(!
recset.IsEOF())
{
//读取Excel内部数值
recset.GetFieldValue("
id"
var);
jiangxiang[ti].id=var.m_iVal;
name"
jiangxiang[ti].name);
ti++;
recset.MoveNext();
}
recset.Close();
//关闭记录集
4.执行sql语句
CStringsSql="
sSql+="
delete*from院系审核"
//清空表
database.ExecuteSQL(sSql);
sSql也可以为Insert,Update等语句
5.读取字段名
sSql="
SELECT*FROMSheet1"
//读取的文件有Sheet1表的定义,或为本程序生成的表.
//执行查询语句
forwardOnly,sSql,CRecordset:
intexcelColCount=recset.GetODBCFieldCount();
//列数
CStringexcelfield[30];
//得到记录集的字段集合中的字段的总个数
for(i=0;
i&
excelColCount;
i++)
CODBCFieldInfofieldinfo;
recset.GetODBCFieldInfo(i,fieldinfo);
excelfield[i].name=fieldinfo.m_strName;
//字段名
6.打开excel文件
CStringsDriver="
MICROSOFTEXCELDRIVER(*.XLS)"
//Excel安装驱动
CStringsSql,sExcelFile;
//sExcelFile为excel的文件路径
TRY
//创建进行存取的字符串
sSql.Format("
DRIVER={%s};
DSN='
'
FIRSTROWHASNAMES=1;
READONLY=FALSE;
CREATE_DB=/"
%s/"
DBQ=%s"
sDriver,sExcelFile,sExcelFile);
//创建数据库(既Excel表格文件)
if(database.OpenEx(sSql,CDatabase:
noOdbcDialog))
//可以把excel作为一个数据库操作
catch(e)
TRACE1("
Excel驱动没有安装:
%s"
sDriver);
AfxMessageBox("
读取失败,请检查是否定义数据区Sheet1"
);
3.DAO连接
DAO(DataAccessObject)是一组MicrosoftAccess/Jet数据库引擎的COM自动化接口.DAO直接与Access/Jet数据库通信.通过Jet数据库引擎,DAO也可以同其他数据库进行通信。
DAO还封装了Access数据库的结构单元,通过DAO可以直接修改Access数据库的结构,而不必使用SQL的数据定义语言(DDL)。
DAO的体系结构如下:
DAO封装的类:
(1)CdaoWorkspace:
对DAO工作区(数据库处理事务管理器)的封装
(2)CdaoDatabase:
对DAO数据库对象的封装,负责数据库连接.
(3)CdaoRecordset:
对DAO记录集对象的封装,代表所选的一组记录.
(4)CdaoTableDef:
对表定义对象的封装,代表基本表或附加表定义.
(5)CdaoQueryDef:
对查询对象的封装,包含所有查询的定义.
(6)CdaoException:
DAO用于接收数据库操作异常的类.
(7)CDaoFieldExchange
DAO相对于ODBC来说,属于高层的数据库接口.
4.OLEDB连接
OLEDB对ODBC进行了两方面的扩展:
一是提供了数据库编程的OLE接口即COM,二是提供了一个可用于关系型和非关系型数据源的接口。
与ODBCAPI一样,OLEDB也属于底层的数据库编程接口,OLEDB结合了ODBC对关系数据库的操作功能,并进行扩展,可以访问非关系数据库。
OLEDB访问数据库的原理如下:
OLEDB程序结构:
OLEDB由客户(Consumer)和服务器(Provider)。
客户是使用数据的应用程序,它通过OLEDB接口对数据提供者的数据进行访问和控制。
OLEDB服务器是提供OLEDB接口的软件组件。
根据提供的内容可以分为数据提供程序(DataProvider)和服务提供程序(ServiceProvider)。
程序结构原理图如下:
数据提供程序
数据提供程序拥有自己的数据并把数据以表格的形式呈现给使用者使用.
服务提供程序
服务提供程序是数据提供程序和使用者的结合。
它是OLEDB体系结构中的中间件,它是OLEDB数据源的使用者和数据使用程序的提供者
数据使用程序
数据使用程序对存储在数据提供程序中的数据进行使用和控制.
OLEDB开发程序的一般步骤:
初始化COM环境
打开对话
执行命令
处理结果
清除对象
使用OLEDB编写数据库应用程序
1概述
OLEDB的存在为用户提供了一种统一的方法来访问所有不同种类的数据源。
OLEDB可以在不同的数据源中进行转换。
利用OLEDB,客户端的开发人员在进行数据访问时只需把精力集中在很少的一些细节上,而不必弄懂大量不同数据库的访问协议。
OLEDB是一套通过COM接口访问数据的ActiveX接口。
这个OLEDB接口相当通用,足以提供一种访问数据的统一手段,而不管存储数据所使用的方法如何。
同时,OLEDB还允许开发人员继续利用基础数据库技术的优点,而不必为了利用这些优点而把数据移出来。
2使用ATL使用OLEDB数据使用程序
由于直接使用OLEDB的对象和接口设计数据库应用程序需要书写大量的代码。
为了简化程序设计,VisualC++提供了ATL模板用于设计OLEDB数据应用程序和数据提供程序。
利用ATL模板可以很容易地将OLEDB与MFC结合起来,使数据库的参数查询等复杂的编程得到简化。
MFC提供的数据库类使OLEDB的编程更具有面向对象的特性。
ViualC++所提供用于OLEDB的ATL模板可分为数据提供程序的模板和数据使用程序的模板。
使用ATL模板创建数据应用程序一般有以下几步骤:
1)、创建应用框架
2)、加入ATL产生的模板类
3)、在应用中使用产生的数据访问对象3不用ATL使用OLEDB数据使用程序
利用ATL模板产生数据使用程序较为简单,但适用性不广,不能动态适应数据库的变化。
下面我们介绍直接使用MFCOLEDB类来生成数据使用程序。
模板的使用
OLEDB数据使用者模板是由一些模板组成的,包括如下一些模板,下面对一些常用类作一些介绍。
1)、会话类
CDataSource类
CDataSource类与OLEDB的数据源对象相对应。
这个类代表了OLEDB数据提供程序和数据源之间的连接。
只有当数据源的连接被建立之后,才能产生会话对象,可以调用Open来打开数据源的连接。
CSession类
CSession所创建的对象代表了一个单独的数据库访问的会话。
一个用CDataSource类产生的数据源对象可以创建一个或者多个会话,要在数据源对象上产生一个会话对象,需要调用函数Open()来打开。
同时,会话对象还可用于创建事务操作。
CEnumeratorAccessor类
CEnumeratorAccessor类是用来访问枚举器查询后所产生的行集中可用数据提供程序的信息的访问器,可提供当前可用的数据提供程序和可见的访问器。
2)、访问器类
CAcessor类
CAccessor类代表与访问器的类型。
当用户知道数据库的类型和结构时,可以使用此类。
它支持对一个行集采用多个访问器,并且,存放数据的缓冲区是由用户分配的。
CDynamicAccessor类
CDynamicAccessor类用来在程序运行时动态的创建访问器。
当系统运行时,可以动态地从行集中获得列的信息,可根据此信息动态地创建访问器。
CManualAccessor类
CManualAccessor类中以在程序运行时将列与变量绑定或者是将参数与变量捆定。
3)、行集类
CRowSet类
CRowSet类封装了行集对象和相应的接口,并且提供了一些方法用于查询、设置数据等。
可以用Move()等函数进行记录移动,用GetData()函数读取数据,用Insert()、Delete()、SetData()来更新数据。
CBulkRowset类
CBulkRowset类用于在一次调用中取回多个行句柄或者对多个行进行操作。
CArrayRowset类
CArrayRowset类提供用数组下标进行数据访问。
4)、命令类
CTable类
CTable类用于对数据库的简单访问,用数据源的名称得到行集,从而得到数据。
CCommand类
CCommand类用于支持命令的数据源。
可以用Open()函数来执行SQL命令,也可以Prepare()函数先对命令进行准备,对于支持命令的数据源,可以提高程序的灵活性和健壮性。
在stdafx.h头文件里,加入如下代码。
#include&
atlbase.h&
externCComModule_Module;
atlcom.h&
atldbcli.h&
atldbsch.h&
//ifyouareusingschematemplates
在stdafx.cpp文件里,加入如下代码。
atlimpl.cpp&
CComModule_Module;
决定使用何种类型的存取程序和行集。
获取数据
在打开数据源,会话,行集对象后就可以获取数据了。
所获取的数据类型取决于所用的存取程序,可能需要绑定列。
按以下步骤。
1、用正确的命令打开行集对象。
2、如果使用CManualAccessor,在使用之前与相应列进行绑定。
要绑定列,可以用函数GetColumnInfo,如下所示:
//Getthecolumninformation
ULONGulColumns=0;
DBCOLUMNINFO*pColumnInfo=NULL;
LPOLESTRpStrings=NULL;
if(rs.GetColumnInfo(&
ulColumns,&
pColumnInfo,&
pStrings)!
=S_OK)
AfxThrowOLEDBException(rs.m_pRowset,IID_IColumnsInfo);
structMYBIND*pBind=newMYBIND[ulColumns];
rs.CreateAccessor(ulColumns,&
pBind[0],sizeof(MYBIND)*ulColumns);
for(ULONGl=0;
l&
ulColumns;
l++)
rs.AddBindEntry(l+1,DBTYPE_STR,sizeof(TCHAR)*40,&
pBind[l].szValue,NULL,&
pBind[l].dwStatus);
rs.Bind();
3、用while循环来取数据。
在循环中,调用MoveNext来测试光标的返回值是否为S_OK,如下所示:
while(rs.MoveNext()==S_OK)
{
//Addcodetofetchdatahere
//Ifyouarenotusinganautoaccessor,callrs.GetData()
}
4、在while循环内,可以通过不同的存取程序获取数据。
1)如果使用的是CAccessor类,可以通过使用它们的数据成员进行直接访问。
如下所示:
2)如果使用的是CDynamicAccessor或CDynamicParameterAccessor类,可以通过GetValue或GetColumn函数来获取数据。
可以用GetType来获取所用数据类型。
//Usethedynamicaccessorfunctionstoretrieveyour
//data
ULONGulColumns=rs.GetColumnCount();
for(ULONGi=0;
i&
i++)
rs.GetValue(i);
3)如果使用的是CManualAccessor,可以指定自己的数据成员,绑定它们。
就可以直接存取。
//Usethedatamembersyouspecifiedinthecallsto
//AddBindEntry.
wsprintf("
%s"
szFoo);
决定行集的数据类型
在运行时决定数据类型,要用动态或手工的存取程序。
如果用的是手工存取程序,可以用GetColumnInfo函数得到行集的列信息。
从这里可以得到数据类型。
4总结
由于现在有多种数据源,,想要对这些数据进行访问管理的唯一途径就是通过一些同类机制来实现,如OLEDB。
高级OLEDB结构分成两部分:
客户和提供者。
客户使用由提供者生成的数据。
就像其它基于COM的多数结构一样,OLEDB的开发人员需要实现很多的接口,其中大部分是模板文件。
当生成一个客户对象时,可以通过ATL对象向导指向一个数据源而创建一个简单的客户。
ATL对象向导将会检查数据源并创建数据库的客户端代理。
从那里,可以通过OLEDB客户模板使用标准的浏览函数。
当生成一个提供者时,向导提供了一个很好的开端,它们仅仅是生成了一个简单的提供者来列举某一目录下的文件。
然后,提供者模板包含了OLEDB支持的完全补充内容。
在这种支持下,用户可以创建OLEDB提供者,来实现行集定位策略、数据的读写以及建立书签。
应用案例:
VisualC++中使用OLEDB读写SQLServer
在需要对数据库进行操作时,OLEDB总是被认为是一种效率最高但最难的方法。
但是以我最近使用OLEDB的经验看来,OLEDB的效率高则高矣,但却一点都不难。
说它难恐怕主要是因为可参考的中文资料太少,为了帮助以后需要接触OLEDB的同行,我撰写了这篇文章。
本文包含如下内容:
1.OLEDB写数据库;
2.OLEDB读数据库;
3.OLEDB对二进制数据(text、ntext、image等)的处理。
首先来看看对SQLServer进行写操作的代码,有一定VC基础的读者应该可以很顺利地看懂。
OLEDB写数据库,就是这么简单!
注:
1.以下代码中使用的模板类EAutoReleasePtr&
T&
与ATL中的CComPtr&
类似,是一个在析构时自动调用Release的类。
CComPtr&
的代码在ATLBASE.H中定义。
2.以下代码均在UNICODE环境下编译,因为执行的SQL语句必须是UNICODE的。
设置工程为UNICODE的方法是:
首先在project-&
settings-&
C/C++的属性页中的Preprocessor中,删除_MBCS写入UNICODE,_UNICODE。
然后在link属性页