1. 程式人生 > >資料庫程式設計技術相關概念概括

資料庫程式設計技術相關概念概括

標準SQL是高度非過程化的查詢語言。

缺少流程控制能力,難以實現應用業務中的邏輯控制。

(一)嵌入式SQL(藉助高階語言的過程化表達能力)

  1.SQL通訊區(SQLCA)

    作用:向主語言傳遞SQL語句執行狀態資訊,使主語言能夠據此資訊控制程式流程

  2.主變數,指示變數

    作用:主語言向SQL語句提供引數,或獲得SQL語句的查詢結果

  3.遊標

    系統為使用者開設的一個數據緩衝區,存放SQL語句的執行結果。使用者可以通過遊標逐一獲取記錄並賦給主變數,由主語言進一步處理。

    作用:當一條SQL語句產生多條處理記錄時,用遊標來獲取SQL語句的查詢結果

  4.處理過程:含嵌入式SQL語句的主語言程式 =》DBMS預處理程式轉換嵌入式SQL語句為函式呼叫 =》轉換後的主語言程式 =》主語言編譯程式編譯預處理 =》目標語言程式

(二)過程化SQL(擴充套件SQL的過程化表達能力)

  1.塊,定義部分(DECLARE),執行部分(BEGIN...END)

       2.儲存過程,函式

  儲存過程:由過程化SQL語句書寫的過程,這個過程經過編譯和優化後儲存在資料庫伺服器中,使用時只需要呼叫即可;

  函式:與 儲存過程 類似,不同的是函式必須指定返回的型別

(三)ODBC(站在更高的層面上,將資料庫看作一類資料來源)

  1.應用程式(資料庫應用系統)=》ODBC(ODBC API,ODBC驅動程式管理器,驅動程式)=》資料來源(特定DBMS下的資料庫)

  2.優點

  用ODBC編寫的應用程式:1.可移植性好;2.能同時訪問不同的資料庫,共享多個數據源

  3.環境控制代碼,連線控制代碼,資料來源,語句控制代碼,描述符控制代碼

  4.ODBC的工作流程

  配置資料來源 =》初始化環境 =》建立連線 =》分配語句控制代碼 =》執行SQL語句(預處理,直接執行)=》結果集處理 =》中止處理

(四) OLE DB

(五)JDBC

一個ODBC示例(c語言,SQL SERVER):

  1.配置資料來源

    控制面板 =》管理工具 =》ODBC資料來源 =》新增資料來源 =》測試連線

       2.程式碼

 1 #include<stdio.h>
 2 #include<stdlib.h>
 3 #include<windows.h>
 4 #include<sql.h>
 5 #include<sqlext.h>
 6 #include<sqltypes.h>
 7 #define SNO_LEN 10
 8 #define CNO_LEN 10
 9 int main()
10 {
11     SQLHENV schenv;    //環境控制代碼
12     SQLHDBC schdbc;    //連線控制代碼
13     SQLHSTMT schstmt;    //語句控制代碼
14     SQLRETURN ret;
15     SQLCHAR sno[SNO_LEN] = "", cno[CNO_LEN] = "";
16     SQLINTEGER grade = 0;
17     SQLINTEGER cbGrade = 0, cbOther = SQL_NTS;
18     //初始化環境
19     ret = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &schenv);
20     ret = SQLSetEnvAttr(schenv, SQL_ATTR_ODBC_VERSION, (void*)SQL_OV_ODBC3, 0);
21     //建立連線
22     ret = SQLAllocHandle(SQL_HANDLE_DBC, schenv, &schdbc);
23     ret = SQLConnect(schdbc, "sc", SQL_NTS, "sa", SQL_NTS, "sa", SQL_NTS);    //資料來源名稱,使用者名稱,密碼
24     if (SQL_SUCCEEDED(ret))
25     {
26         printf("Connection succeeds!\n");
27     }
28     else
29     {
30         printf("Connection fails!\n");
31         exit(0);
32     }
33     //初始化語句控制代碼
34     ret = SQLAllocHandle(SQL_HANDLE_STMT, schdbc, &schstmt);
35     ret = SQLSetStmtAttr(schstmt, SQL_ATTR_ROW_BIND_TYPE, NULL, SQL_IS_INTEGER);
36     ret = SQLExecDirect(schstmt, "SELECT * FROM SC WHERE Sno=\'200215121\'", SQL_NTS);
37     if (ret == SQL_SUCCESS || ret == SQL_SUCCESS_WITH_INFO)
38     {
39         ret = SQLBindCol(schstmt, 1, SQL_C_CHAR, sno, SNO_LEN, &cbOther);
40         ret = SQLBindCol(schstmt, 2, SQL_C_CHAR, cno, CNO_LEN, &cbOther);
41         ret = SQLBindCol(schstmt, 3, SQL_C_LONG, &grade, 0, &cbGrade);
42     }
43     printf("%-15s%-10s%-5s\n", "sno", "cno", "grade");
44     //處理結果集
45     while ((ret = SQLFetch(schstmt)) != SQL_NO_DATA_FOUND)
46     {
47         if (ret == SQL_ERROR)
48         {
49             printf("Selection error\n");
50         }
51         else
52         {
53             printf("%-15s%-10s%-5d\n", sno, cno, grade);
54         }
55     }
56     //釋放控制代碼
57     SQLFreeHandle(SQL_HANDLE_STMT, schstmt);
58     SQLDisconnect(schdbc);
59     SQLFreeHandle(SQL_HANDLE_DBC, schdbc);
60     SQLFreeHandle(SQL_HANDLE_ENV, schenv);
61     return 1;
62 }

  3.執行結果