一、ODBC简介

1. ODBC的概念

①ODBC:Open DataBase Connection,即开放数据库连接

②ODBC是一种标准,它规定了不同语言的应用程序与不同数据库服务器之间通讯的方式

③ODBC包含一组API,用于实现应用程序与数据库服务器的交互,应用程序通过调用API,完成下列功能:

  • 连接数据库服务器
  • 向数据库服务器发送SQL命令
  • 一条一条地提取数据库检索结果中的元组,并传递给应用程序中的变量

④具体的DBMS提供一套驱动程序(Driver库函数),供ODBC调用,以便实现应用程序与数据库的连接

⑤ODBC可以配合许多高级语言来使用,如C、C++、C#、Visual Basic、Power-Builder等

2. ODBC在数据库系统中扮演哪种角色

①有了ODBC,应用程序员编写DBAP时就无需针对特定的DBMS,因为ODBC对应用程序员提供了统一的接口

②对于不同的DBMS,ODBC通过不同的驱动程序(Driver库函数)将程序员的代码解释成各DBMS可以理解的SQL语句

③当应用程序调用ODBC API时,ODBC API会调用具体DBMS Driver库函数,DBMS Driver库函数则与数据库服务器通讯,执行相应的请求动作并返回检索结果

3. 应用程序如何通过ODBC连接到数据库服务器

①ODBC应用前,需要确认具体DBMS Driver被安装到ODBC环境中

②ODBC应用程序首先要分配一个SQL环境,再产生一个数据库连接句柄

③应用程序使用SQLConnect(),打开一个数据库连接,SQLConnect()的具体参数如下:

  • connection handle:连接句柄
  • the server:要连接的数据库服务器
  • the user identifier:用户
  • password:密码
  • SQL_NTS类型说明前面的参数是空终止的字符串
/* 分配数据库连接环境 */
RETCODE error;  // 返回状态码
HENV env;       // 环境变量
HDBC conn;      // 连接句柄
SQLAllocEnv(&env);
SQLAllocConnect(env, &conn);/* 打开一个数据库连接 */
SQLConnect(conn, "aura.bell-labs.com", SQL_NTS, "avi", SQL_NTS, "avipassword", SQL_NTS);/* 与数据库通讯 */
// ...
// .../* 断开连接与释放环境 */
SQLDisconnect(conn);
SQLFreeConnect(conn);
SQLFreeEnv(env);

4. 应用程序如何通过ODBC与数据库服务器进行通讯

①应用程序使用SQLExecDirect()向数据库发送SQL命令

②应用程序使用SQLFetch()获取产生的结果元组

③应用程序使用SQLBindCol()绑定C语言变量与结果中的属性:当获取一个元组时,属性值会自动地传送到相应的C语言变量中

④SQLBindCol()的参数包含:

  • ODBC定义的stmt变量,查询结果中的属性位置
  • SQL到C的类型变换,变量的地址
  • 对于类似字符数组一样的可变长度类型,应给出①变量的最大长度;②当获取到一个元组后,实际长度的存储位置
char branchname[80]; float balance;
int lenOut1, lenOut2;/* 分配一个与指定数据库连接的新的语句句柄 */
HSTMT stmt;
SQLAllocStmt(conn, &stmt);/* 执行查询,stmt句柄指向结果集合 */
char *sqlquery = "select branch_name, sum (balance) from account group by branch_name";
error = SQLExecDirect(stmt, sqlquery, SQL_NTS);if (error == SQL_SUCCESS) {//绑定高级语言变量与stmt句柄中的属性SQLBindCol(stmt, 1, SQL_C_CHAR, branchname, 80, &lenOut1);SQLBindCol(stmt, 2, SQL_C_FLOAT, &balance, 0, &lenOut2);//提取一条记录,结果数据被存入高级语言变量中while (SQLFetch(stmt) >= SQL_SUCCESS) {printf(" %s %g\n", branchname, balance);}
}   /* 释放语句句柄 */
SQLFreeStmt(stmt, SQL_DROP);

  

5. ODBC具备的其他功能

①动态SQL语句的预编译-动态参数传递功能

②获取元数据特性:发现数据库中的所有关系的特性以及发现每一个查询结果的列的名字和类型等

③默认每一条SQL语句都被作为一个独立地能够自动提交的事务来处理

  • 应用程序可以关闭一个连接的自动提交特性:SQLSetConnectOption(conn, SQL_AUTOCOMMIT, 0)
  • 此时事务就需要显式地给出提交和撤消的命令:SQLTransact(conn, SQL_COMMIT/ROLLBACK)

二、JDBC简介

1. JDBC的概念

①JDBC:Java DataBase Connection

②JDBC是一组Java版本的API,规定了Java应用程序与数据库服务器之间通讯的方式

③JDBC API分为两个程序包

  • java.sql 核心API:J2SE的一部分,使用java.sql.DriverManager类、 java.sql.Driver类和java.sql.Connection接口连接到数据库
  • java.sql 可选扩展API:J2EE的一部分,包含了基于JNDI的资源,以及管理连接池、分布式事务等,使用DataSource接口连接到数据库

2. JDBC的核心类

  • java.sql.DriverManager:处理驱动的调入并且对产生新数据库连接提供支持
  • java.sql.Driver:通过驱动进行数据库访问,连接到数据库的应用程序必须具备该数据库的特定驱动
  • java.sql.Connection:代表对特定数据库的连接
  • java.sql.Statement:对特定的数据库执行SQL语句
  • java.sql.PreparedStatement:用于执行预编译的SQL语句
  • java.sql.CallableStatement:用于执行对数据库内嵌过程的调用
  • java.sql.ResultSet:从当前执行的SQL语句中返回结果数据
  • try{...} catch{...}:异常捕获及其处理

3. Java程序使用JDBC API访问数据库的过程

概述:打开一个连接;创建Statement对象,并设置查询语句;使用Statement对象执行查询,发送查询给数据库服务器和返回结果给应用程序。

①加载数据库驱动,传递一个Driver给DriverManager

  • Class.forName()

②建立数据库连接,通过URL得到一个Connection对象

  • DriverManager.getConnection(sDBUrl)
  • DriverManager.getConnection(sDBUrl,sDBUserID,sDBPassword)

③查询或修改数据库,创建一个Statement对象

  • Statement stmt=con.createStatement()

④查询返回一个ResultSet

  • ResultSet rs=stmt.executeQuery(sSQL)
/* 加载数据库驱动,并建立数据库的连接 */
Class.forName("oracle.jdbc.driver.OracleDriver");
Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@db.yale.edu:1521:univdb", userid, passwd);/* 创建一个Statement对象 */
Statement stmt = conn.createStatement();/* 与数据库通讯 */
// ...
// .../* 关闭Statement对象,关闭连接 */
stmt.close();
conn.close();/* 查询与更新语句 */
ResultSet rset = stmt.executeQuery("select dept_name, avg(salary) from instructor group by dept_name");
while(rset.next()){System.out.println(rset.getString(dept_name) + " " + rset.getFloat(2));
}stmt.executeUpdate("insert into instructor values('77987', 'Kim', 'Physics', 98000)");

三、嵌入式SQL & ODBC & JDBC 在执行SQL语句上的异同

1. 执行过程

①嵌入式SQL:语句形式执行

  1. 建立数据库连接
  2. 声明游标
  3. 打开游标
  4. 将高级语言变量与结果集合的属性相绑定
  5. 访问检索记录集
  6. 关闭游标
  7. 断开数据库连接

②ODBC:API形式执行,所有对数据库的操作都变成了一个个函数,通过调用函数来让DBMS执行SQL语句

  1. 建立数据库连接
  2. 分配语句句柄
  3. 用句柄执行SQL
  4. 建立高级语言变量与句柄属性的对应
  5. 访问检索记录集
  6. 释放语句句柄
  7. 断开数据库连接

③JDBC:API形式执行,以语句对象为中心

  1. 建立数据库连接
  2. 创建语句对象
  3. 用语句对象执行SQL,并返回结果对象
  4. 从结果对象中提取检索记录集,并将对象的属性值传给高级语言变量
  5. 释放语句对象
  6. 断开数据库连接

四、基于ODBC/JDBC的数据库访问

1. 没有ODBC/JDBC的数据库访问:不同DBMS的嵌入式SQL语句不同,应用程序员编写的DBAP可能只适用于某一个DBMS

2. 基于ODBC/JDBC的数据库访问:ODBC/JDBC提供了统一的API,让应用程序员以对象为单位操纵数据库

转载于:https://www.cnblogs.com/xzxl/p/10832961.html

第16讲:ODBCJDBC简介相关推荐

  1. 深度学习笔记 | 第16讲:语音识别——一份简短的技术综述

    原标题:深度学习笔记 | 第16讲:语音识别--一份简短的技术综述 大家好!又到了每周一狗熊会的深度学习时间了.在上一讲中,小编给大家介绍了经典的 seq2seq,以及著名的注意力模型,并且小编在这些 ...

  2. Python编程系列教程第16讲——拷贝自身到系统目录

    分享知识,分享快乐,收获友谊,收获财富! 大家好,我是数字雨,QQ:798033502 http://itbook.taobao.com/ 今天给大家带来的教程是<Python编程系列教程第16 ...

  3. CAN笔记(16) CANOpen简介

    CAN笔记(16) CANOpen简介 1. CAN 在 ISO 层级中的位置 2. 通信协议需求 3. CANopen 协议诞生 4. 设备子协议 5. CANOpen设备结构 1. CAN 在 I ...

  4. [OfficeExcel] OfficeExcel2010 第16讲 文本处理函数

    王佩丰老师OfficeExcel2010 16讲 文本处理函数 学习笔记 使用文本截取字符串 获取文本中的信息 关于身份证 使用文本截取字符串 Left函数:从左往右取LEFT(text,[num_c ...

  5. python自动化办公百度云_用Python自动办公 做职场高手全16讲 完整版 视频教程

    python这门编程最近可是非常火,不是俗谚有说"人生苦短,我用python".这是有道理的,一是它相对于其他语言,更简单易上手,二是功能可大,可以爬虫,可以写工具. 这里分享给大 ...

  6. 小啊呜产品读书笔记001:《邱岳的产品手记-08》第15讲 产品案例分析:Mimo与LearnPython的导学之趣 第16讲 在内部产品中找到产品经理的价值

    小啊呜产品读书笔记001:<邱岳的产品手记-08>第15讲 产品案例分析:Mimo与LearnPython的导学之趣 & 第16讲 在内部产品中找到产品经理的价值 一.今日阅读计划 ...

  7. 斯坦福NLP名课带学详解 | CS224n 第16讲 - 指代消解问题与神经网络方法(NLP通关指南·完结)

    作者:韩信子@ShowMeAI,路遥@ShowMeAI,奇异果@ShowMeAI 教程地址:https://www.showmeai.tech/tutorials/36 本文地址:https://ww ...

  8. 灵魂课程 | 《冯雪 | 怎科学减肥16讲》

    最痛苦的事,不是失败,是我本可以! 目录 灵魂课程 | <冯雪 | 怎科学减肥16讲> 00 | 发刊词:一次就能成功的完成方案 0.1 作者介绍 0.2 说明 0.3 关于减肥的三个认知 ...

  9. 20到50之间是3的倍数php,小学三年级奥数-第16讲-数字趣谈(教)

    学科教师辅导讲义 学员编号:年级:三年级课时数:3 学员姓名:辅导科目:奥数学科教师:授课主题第16讲-数字趣谈 授课类型T同步课堂P实战演练S归纳总结 教学目标尝试使用探索法和分类统计法解决自然数列 ...

  10. 【图学院】区块链与密码学全民课堂第1-6讲:分叉大战

    导语:本课堂用通俗易懂的系列内容为大家呈现区块链与密码学领域相关知识.这里有知识也有故事,从感兴趣到有乐趣,全民课堂等你来学. 这个系列中的课程内容首先从比特币着手进行入门介绍,再延伸至区块链的相关技 ...

最新文章

  1. BZOJ 2151 种树(可反悔贪心,链表)【BZOJ千题计划】就图一乐
  2. php 教程 字符联接,PHP字符串的连接_PHP教程
  3. delphi char与string比较
  4. Python处理小学体育中的跑步计时数据并统计得分
  5. java math 函数_Java中Math类常用函数总结
  6. redis 关系数据库怎么转换 和_redis数据库设计(转)
  7. 《基于MFC的OpenGL编程》 13 part 创建2D 和 3D 文字
  8. 伪元素::selection -- CSS ::selection 伪元素,定义用户鼠标已选择内容的样式
  9. Jmeter高阶学习,运用NotePad++编写工程,随意复制多个工程到同一个工程
  10. 在Ubuntu系统中给应用创建快捷方式
  11. LayoutLM——文本与布局的预训练用于文档图像理解
  12. 新版itunes不显示图书_告别 iTunes!苹果新版mac操作系统正式上线,12大升级亮点解读...
  13. 金融安全视角农民投资理财的实证研究——以X县为例
  14. MySql 磁盘满了的处理
  15. 163VIP邮箱注册,163邮箱使用评价
  16. django.db.utils.DataError: (1366, “Incorrect string value: ‘\\xE5\\x85\\xAD\\xE5\\x8D\\x83‘ for colu
  17. java 前置系统报文通讯方式_基于Geronimo的银行通讯前置系统的设计
  18. matlab读取一幅灰度图,Matlab处理灰度图
  19. 什么时候用到GDT?为什么要用GDT
  20. 实验6 音频放大器的仿真验证

热门文章

  1. 高性能WEB开发之Web性能测试工具推荐
  2. Win32 SDK 编写截图小工具
  3. 和quot;分别是什么?
  4. java 爬虫 百度新闻_基于HttpClient实现网络爬虫~以百度新闻为例
  5. unity 200.8m yoy_【Unity文档】Realtime GI介绍(一)
  6. QSS之图形渐变填充
  7. 收藏!2021最新期刊预警名单汇总!
  8. AXI4总线协议的发展历史
  9. adams2015安装教程
  10. 人工智能 | 人工智能的发展历程