資料庫程式設計技術相關概念概括
標準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.執行結果