数据库编程技术相关概念概括
标准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.执行结果