300 likes | 547 Views
ODBC 简介. 数据库系统与应用 2014 年. 连接数据库的方式. 预编译 嵌入式 SQL 等 OCCI ( Oracle C++ Call Interface ) OCILIB (针对 Oracle 的开源库,封装 oci ) 统一的数据访问接口 ODBC (即将讲到的) ADO ( ActiveX Data Objects ) DAO/RDO (本地数据库 / 远程数据库) OLE DB (包括非结构数据的访问) JDBC ( Java 访问数据库的方式). 基本概念.
E N D
ODBC 简介 数据库系统与应用 2014年
连接数据库的方式 • 预编译 • 嵌入式SQL等 • OCCI (Oracle C++ Call Interface) • OCILIB (针对Oracle的开源库,封装oci) • 统一的数据访问接口 • ODBC (即将讲到的) • ADO(ActiveX Data Objects ) • DAO/RDO(本地数据库/远程数据库) • OLE DB(包括非结构数据的访问) • JDBC(Java访问数据库的方式)
基本概念 ODBC(Open Database Connectivity,开放数据库互连)是微软公司开放服务结构(WOSA,Windows Open Services Architecture)中有关数据库的一个组成部分,它建立了一组规范,并提供了一组对数据库访问的标准API。这些API利用SQL来完成其大部分任务。ODBC本身也提供了对SQL语言的支持,用户可以直接将SQL语句送给ODBC。 一个基于ODBC的应用程序对数据库的操作不依赖任何DBMS,不直接与DBMS打交道,所有的数据库操作由对应的DBMS的ODBC驱动程序完成。也就是说,不论是FoxPro、Access 、MYSQL还是Oracle数据库,均可用ODBC API进行访问。由此可见,ODBC的最大优点是能以统一的方式处理所有的数据库。
组成部分 • 应用程序要访问一个数据库,必须是在ODBC管理器注册了的数据源 • ODBC管理器:该程序位于Windows 控制面板(Control Panel)的32位ODBC内,其主要任务是管理安装的ODBC驱动程序和管理数据源。 • 驱动程序管理器:驱动程序管理器包含在ODBC32.DLL中,对用户是透明的。其任务是管理ODBC驱动程序,是ODBC中最重要的部件。 • ODBC API:ODBC编程接口,提供常用的类(CDatabase、CRecordset)、方法。 • ODBC驱动程序:是一些DLL,提供了ODBC和数据库之间的接口 • 数据源:数据源包含了数据库位置和数据库类型等信息,实际上是一种数据连接的抽象。
使用ODBC连接数据库[1-2] • 首先进行ODBC数据源设置 • windows7 + oracle10g • 在具体的程序设计环境中使用ODBC连接数据库 • VC 6.0
使用ODBC连接数据库[2-2] 在访问ODBC数据源时需要ODBC驱动程序的支持。微软和Oracle公司都提供了Oracle数据库的ODBC驱动,Oracle为自己写的ODBC驱动功能更细腻一些,支持的API也更全一些。Oracle的ODBC驱动是依赖于OCI的客户端库的。OCI Client和Oracle DB Server之间通过TNS服务作为桥梁,因此要用上ODBC,还得为Oracle数据库服务器配置一个db service name,这个使用Net Manager或者Net Assistant都可以完成,甚至直接修改tnsnames.ora文件也可以(远程连接数据库时)。
点击添加 ODBC数据源设置[1-4] 1.控制面板→管理工具→数据源 (ODBC) → 用户DSN 添加新的数据源
ODBC数据源设置[2-4] 2.选择所要添加的数据源类型,选择后点击“完成”
ODBC数据源设置[3-4] 3.配置Oracle ODBC驱动 自己取DSN 的名称 配置Oracle 服务器 本地服务器127.0.0.1
ODBC数据源设置[4-4] 4.配置完成,可以在ODBC数据源管理程序中看到新添加 Oracle数据源
ODBC MFC 基类库定义了几个数据库类。在利用ODBC 编程时,经常要使用到: • CDatabase类对象提供了对数据源的连接,通过它你可以对数据源进行操作。 • CRecordSet类对象提供了从数据源中提取出的记录集。 • CRecordView类对象能以控制的形式显示数据库记录。这个视图是直接连到一个CRecordSet 对象的表视图。
利用向导连接数据库[1-4] 1.建立基于文档的MFC工程,在AppWizard的第二步,选择第四项,点击“Data Source”进行配置 点击进入 数据源选择
利用向导连接数据库[2-4] 2.选择要使用的数据源
利用向导连接数据库[3-4] 3.选择欲使用的表
利用向导连接数据库[4-4] 4.向导结束时可以发现多了一个继承自CRecordSet的类,它既是根据用户选择的表自动生成的记录集类
步骤[1] • 建立一个CDatabase的实例CDatabase m_db; • 连接数据库m_db.OpenEx(_T("DSN=ora_Gong;UID=dodo;PWD=ddoo"),CDatabase::openReadOnly | CDatabase::noOdbcDialog); • 建立一个CRecordset的实例()CRecordset rec(&m_db); 和CDatabase实例相连
步骤[2] • 执行一个初始化查询. rec.Open(AFX_DB_USE_DEFAULT_TYPE,_T("select * from employee")); 5. 设置查询条件rec.m_strFilter=“ENAME=‘cjw'";rec.m_strSort=“ENO";rec.Requery();对应的SQL语句为:select * from employee WHERE SNAME='电动机'ORDER BY SNO
[3] 6. 取得查询结果(只取一条记录)CDBVariant dbvar; rec.GetFieldValue(short(0),dbvar); if (dbvar.m_dwType == DBVT_STRING) { CString str=*(dbvar.m_pstring); }
[4] 7. 取得查询结果(多条记录)short nFields = rec.GetODBCFieldCount( );while( ! rec.IsEOF( ) ) { for( short index = 0; index < nFields; index++ ) { rec.GetFieldValue( index, varValue ); // 对 varValue进行处理 } rec.MoveNext( ); } Move(),MoveNext(), MovePrev(),MoveFirst(),MoveLast()
VC6中利用ODBC连接 1.增加记录使用rec.AddNew(); //在表的末尾增加新记录rec.SetFieldNull(&(rec- >m_type), FALSE);rec.m_type=" 电动机";... //输入新的字段值rec.Update(); //将新记录存入数据库rec.Requery(); //重建记录集 2.删除记录直接使用Delete() 函数,并且在调用Delete() 函数之后不需调用Update() 函数 3.修改记录修改记录使用Edit() 函数: m_pSet- >Edit(); //修改当前记录m_pSet- >m_type="发电机";m_pSet- >Update(); // m_pSet- >Requery();
VC6中利用ODBC连接 4.关闭并释放空间rec.Close( );m_db.Close( ); SQL 语句的直接执行(CDatabase上): 如建立新表,删除表,建立新的字段等等 CDatabase::ExecuteSQL()函数来完成SQL 语句的直接执行 如:
总结 建议:(根据我们的使用) 对于不返回结果集的SQL语句,我们应该使用CDatabase::ExecuteSQL()来执行,如:删除(DELETE),插入(INSERT),更新(UPDATE). 对于需要返回结果集的SQL语句,我们需要使用CRecordSet::Open()方法来执行,如:查询(SELECT)。
Thank you! http://home.ustc.edu.cn/~qhuang/database.html