日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

第16讲:ODBCJDBC简介

發(fā)布時間:2025/3/8 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 第16讲:ODBCJDBC简介 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

一、ODBC簡介

1. ODBC的概念

? ? ①ODBC:Open DataBase Connection,即開放數(shù)據(jù)庫連接

? ? ②ODBC是一種標準,它規(guī)定了不同語言的應(yīng)用程序與不同數(shù)據(jù)庫服務(wù)器之間通訊的方式

? ? ③ODBC包含一組API,用于實現(xiàn)應(yīng)用程序與數(shù)據(jù)庫服務(wù)器的交互,應(yīng)用程序通過調(diào)用API,完成下列功能:

  • 連接數(shù)據(jù)庫服務(wù)器
  • 向數(shù)據(jù)庫服務(wù)器發(fā)送SQL命令
  • 一條一條地提取數(shù)據(jù)庫檢索結(jié)果中的元組,并傳遞給應(yīng)用程序中的變量

? ? ④具體的DBMS提供一套驅(qū)動程序(Driver庫函數(shù)),供ODBC調(diào)用,以便實現(xiàn)應(yīng)用程序與數(shù)據(jù)庫的連接

? ? ⑤ODBC可以配合許多高級語言來使用,如C、C++、C#、Visual Basic、Power-Builder等

?

2. ODBC在數(shù)據(jù)庫系統(tǒng)中扮演哪種角色

? ??

? ? ①有了ODBC,應(yīng)用程序員編寫DBAP時就無需針對特定的DBMS,因為ODBC對應(yīng)用程序員提供了統(tǒng)一的接口

? ? ②對于不同的DBMS,ODBC通過不同的驅(qū)動程序(Driver庫函數(shù))將程序員的代碼解釋成各DBMS可以理解的SQL語句

? ? ③當應(yīng)用程序調(diào)用ODBC API時,ODBC API會調(diào)用具體DBMS Driver庫函數(shù),DBMS Driver庫函數(shù)則與數(shù)據(jù)庫服務(wù)器通訊,執(zhí)行相應(yīng)的請求動作并返回檢索結(jié)果

?

3. 應(yīng)用程序如何通過ODBC連接到數(shù)據(jù)庫服務(wù)器

? ? ①ODBC應(yīng)用前,需要確認具體DBMS Driver被安裝到ODBC環(huán)境中

? ? ②ODBC應(yīng)用程序首先要分配一個SQL環(huán)境,再產(chǎn)生一個數(shù)據(jù)庫連接句柄

? ? ③應(yīng)用程序使用SQLConnect(),打開一個數(shù)據(jù)庫連接,SQLConnect()的具體參數(shù)如下:

  • connection handle:連接句柄
  • the server:要連接的數(shù)據(jù)庫服務(wù)器
  • the user identifier:用戶
  • password:密碼
  • SQL_NTS類型說明前面的參數(shù)是空終止的字符串
/* 分配數(shù)據(jù)庫連接環(huán)境 */ RETCODE error; // 返回狀態(tài)碼 HENV env; // 環(huán)境變量 HDBC conn; // 連接句柄 SQLAllocEnv(&env); SQLAllocConnect(env, &conn);/* 打開一個數(shù)據(jù)庫連接 */ SQLConnect(conn, "aura.bell-labs.com", SQL_NTS, "avi", SQL_NTS, "avipassword", SQL_NTS);/* 與數(shù)據(jù)庫通訊 */ // ... // .../* 斷開連接與釋放環(huán)境 */ SQLDisconnect(conn); SQLFreeConnect(conn); SQLFreeEnv(env);

?

4. 應(yīng)用程序如何通過ODBC與數(shù)據(jù)庫服務(wù)器進行通訊

? ? ①應(yīng)用程序使用SQLExecDirect()向數(shù)據(jù)庫發(fā)送SQL命令

? ? ②應(yīng)用程序使用SQLFetch()獲取產(chǎn)生的結(jié)果元組

? ? ③應(yīng)用程序使用SQLBindCol()綁定C語言變量與結(jié)果中的屬性:當獲取一個元組時,屬性值會自動地傳送到相應(yīng)的C語言變量中

? ? ④SQLBindCol()的參數(shù)包含:

  • ODBC定義的stmt變量,查詢結(jié)果中的屬性位置
  • SQL到C的類型變換,變量的地址
  • 對于類似字符數(shù)組一樣的可變長度類型,應(yīng)給出①變量的最大長度;②當獲取到一個元組后,實際長度的存儲位置
char branchname[80]; float balance; int lenOut1, lenOut2;/* 分配一個與指定數(shù)據(jù)庫連接的新的語句句柄 */ HSTMT stmt; SQLAllocStmt(conn, &stmt);/* 執(zhí)行查詢,stmt句柄指向結(jié)果集合 */ 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);//提取一條記錄,結(jié)果數(shù)據(jù)被存入高級語言變量中while (SQLFetch(stmt) >= SQL_SUCCESS) {printf(" %s %g\n", branchname, balance);} } /* 釋放語句句柄 */ SQLFreeStmt(stmt, SQL_DROP);

  

5. ODBC具備的其他功能

? ? ①動態(tài)SQL語句的預(yù)編譯-動態(tài)參數(shù)傳遞功能

? ? ②獲取元數(shù)據(jù)特性:發(fā)現(xiàn)數(shù)據(jù)庫中的所有關(guān)系的特性以及發(fā)現(xiàn)每一個查詢結(jié)果的列的名字和類型等

? ? ③默認每一條SQL語句都被作為一個獨立地能夠自動提交的事務(wù)來處理

  • 應(yīng)用程序可以關(guān)閉一個連接的自動提交特性:SQLSetConnectOption(conn, SQL_AUTOCOMMIT, 0)
  • 此時事務(wù)就需要顯式地給出提交和撤消的命令:SQLTransact(conn, SQL_COMMIT/ROLLBACK)

?

二、JDBC簡介

1. JDBC的概念

? ? ①JDBC:Java DataBase Connection

? ? ②JDBC是一組Java版本的API,規(guī)定了Java應(yīng)用程序與數(shù)據(jù)庫服務(wù)器之間通訊的方式

? ? ③JDBC API分為兩個程序包

  • java.sql 核心API:J2SE的一部分,使用java.sql.DriverManager類、 java.sql.Driver類和java.sql.Connection接口連接到數(shù)據(jù)庫
  • java.sql 可選擴展API:J2EE的一部分,包含了基于JNDI的資源,以及管理連接池、分布式事務(wù)等,使用DataSource接口連接到數(shù)據(jù)庫

?

2. JDBC的核心類

  • java.sql.DriverManager:處理驅(qū)動的調(diào)入并且對產(chǎn)生新數(shù)據(jù)庫連接提供支持
  • java.sql.Driver:通過驅(qū)動進行數(shù)據(jù)庫訪問,連接到數(shù)據(jù)庫的應(yīng)用程序必須具備該數(shù)據(jù)庫的特定驅(qū)動
  • java.sql.Connection:代表對特定數(shù)據(jù)庫的連接
  • java.sql.Statement:對特定的數(shù)據(jù)庫執(zhí)行SQL語句
  • java.sql.PreparedStatement:用于執(zhí)行預(yù)編譯的SQL語句
  • java.sql.CallableStatement:用于執(zhí)行對數(shù)據(jù)庫內(nèi)嵌過程的調(diào)用
  • java.sql.ResultSet:從當前執(zhí)行的SQL語句中返回結(jié)果數(shù)據(jù)
  • try{...} catch{...}:異常捕獲及其處理

?

3. Java程序使用JDBC API訪問數(shù)據(jù)庫的過程

概述:打開一個連接;創(chuàng)建Statement對象,并設(shè)置查詢語句;使用Statement對象執(zhí)行查詢,發(fā)送查詢給數(shù)據(jù)庫服務(wù)器和返回結(jié)果給應(yīng)用程序。

? ? ①加載數(shù)據(jù)庫驅(qū)動,傳遞一個Driver給DriverManager

  • Class.forName()

? ? ②建立數(shù)據(jù)庫連接,通過URL得到一個Connection對象

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

? ? ③查詢或修改數(shù)據(jù)庫,創(chuàng)建一個Statement對象

  • Statement stmt=con.createStatement()

? ? ④查詢返回一個ResultSet

  • ResultSet rs=stmt.executeQuery(sSQL)
/* 加載數(shù)據(jù)庫驅(qū)動,并建立數(shù)據(jù)庫的連接 */ Class.forName("oracle.jdbc.driver.OracleDriver"); Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@db.yale.edu:1521:univdb", userid, passwd);/* 創(chuàng)建一個Statement對象 */ Statement stmt = conn.createStatement();/* 與數(shù)據(jù)庫通訊 */ // ... // .../* 關(guān)閉Statement對象,關(guān)閉連接 */ 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 在執(zhí)行SQL語句上的異同

1. 執(zhí)行過程

? ? ①嵌入式SQL:語句形式執(zhí)行

  • 建立數(shù)據(jù)庫連接
  • 聲明游標
  • 打開游標
  • 將高級語言變量與結(jié)果集合的屬性相綁定
  • 訪問檢索記錄集
  • 關(guān)閉游標
  • 斷開數(shù)據(jù)庫連接
  • ? ? ②ODBC:API形式執(zhí)行,所有對數(shù)據(jù)庫的操作都變成了一個個函數(shù),通過調(diào)用函數(shù)來讓DBMS執(zhí)行SQL語句

  • 建立數(shù)據(jù)庫連接
  • 分配語句句柄
  • 用句柄執(zhí)行SQL
  • 建立高級語言變量與句柄屬性的對應(yīng)
  • 訪問檢索記錄集
  • 釋放語句句柄
  • 斷開數(shù)據(jù)庫連接
  • ? ? ③JDBC:API形式執(zhí)行,以語句對象為中心

  • 建立數(shù)據(jù)庫連接
  • 創(chuàng)建語句對象
  • 用語句對象執(zhí)行SQL,并返回結(jié)果對象
  • 從結(jié)果對象中提取檢索記錄集,并將對象的屬性值傳給高級語言變量
  • 釋放語句對象
  • 斷開數(shù)據(jù)庫連接
  • ?

    四、基于ODBC/JDBC的數(shù)據(jù)庫訪問

    1. 沒有ODBC/JDBC的數(shù)據(jù)庫訪問:不同DBMS的嵌入式SQL語句不同,應(yīng)用程序員編寫的DBAP可能只適用于某一個DBMS

    ?

    2. 基于ODBC/JDBC的數(shù)據(jù)庫訪問:ODBC/JDBC提供了統(tǒng)一的API,讓應(yīng)用程序員以對象為單位操縱數(shù)據(jù)庫

    ?

    轉(zhuǎn)載于:https://www.cnblogs.com/xzxl/p/10832961.html

    總結(jié)

    以上是生活随笔為你收集整理的第16讲:ODBCJDBC简介的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。