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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

第16讲:ODBCJDBC简介

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

一、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:語句形式執行

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

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

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

    四、基于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简介的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。