标准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.执行结果

版权声明:本文为ben-原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/ben-/p/11358151.html