嵌入式 SQL 应用程序必须具有以下结构:
以下源代码演示使用 C 编写的嵌入式 SQL 应用程序的基本结构。
#include <stdio.h> 1
#include <stdlib.h>
#include <string.h>
#include <sqlenv.h>
#include <sqlutil.h>
EXEC SQL BEGIN DECLARE SECTION; 2
short id;
char name[10];
short dept;
double salary;
char hostVarStmtDyn[50];
EXEC SQL END DECLARE SECTION;
int main()
{
int rc = 0; 3
EXEC SQL INCLUDE SQLCA; 4
/* 连接到数据库 */
printf("\n Connecting to database...");
EXEC SQL CONNECT TO "sample"; 5
if (SQLCODE <0) 6
{
printf("\nConnect Error: SQLCODE =
goto connect_reset;
}
else
{
printf("\n Connected to database.\n");
}
/* 使用静态 SQL 来执行 SQL 语句(查询);将单一结果行的值复制到主变量 */
EXEC SQL SELECT id, name, dept, salary 7
INTO :id, :name, :dept, :salary
FROM staff WHERE id = 310;
if (SQLCODE <0) 6
{
printf("Select Error: SQLCODE =
}
else
{
/* 将主变量值打印到标准输出 */
printf("\n Executing a static SQL query statement, searching for
\n the id value equal to 310\n");
printf("\n ID Name DEPT Salary\n");
printf("
}
strcpy(hostVarStmtDyn, "UPDATE staff
SET salary = salary + 1000
WHERE dept = ?");
/* 使用主变量和动态 SQL 来执行 SQL 语句(操作)*/
EXEC SQL PREPARE StmtDyn FROM :hostVarStmtDyn;
if (SQLCODE <0) 6
{
printf("Prepare Error: SQLCODE =
}
else
{
EXEC SQL EXECUTE StmtDyn USING :dept; 8
}
if (SQLCODE <0) 6
{
printf("Execute Error: SQLCODE =
}
/* 使用静态 SQL 和游标来读取已更新的行 */
EXEC SQL DECLARE posCur1 CURSOR FOR
SELECT id, name, dept, salary
FROM staff WHERE id = 310;
if (SQLCODE <0) 6
{
printf("Declare Error: SQLCODE =
}
EXEC SQL OPEN posCur1;
EXEC SQL FETCH posCur1 INTO :id, :name, :dept, :salary ; 9
if (SQLCODE <0) 6
{
printf("Fetch Error: SQLCODE =
}
else
{
printf(" Executing an dynamic SQL statement, updating the
\n salary value for the id equal to 310\n");
printf("\n ID Name DEPT Salary\n");
printf("
}
EXEC SQL CLOSE posCur1;
/* 落实事务 */
printf("\n Commit the transaction.\n");
EXEC SQL COMMIT; 10
if (SQLCODE <0) 6
{
printf("Error: SQLCODE =
}
/* 与数据库断开连接 */
connect_reset :
EXEC SQL CONNECT RESET; 11
if (SQLCODE <0) 6
{
printf("Connection Error: SQLCODE =
}
return 0;
} /* 结束 main */
有关样本程序:template.sqc 的注释:
注解 | 描述 |
---|---|
1 | 包含文件:此伪指令将一个文件包括到源应用程序中。 |
2 | 声明节:声明主变量,这些主变量用于存放 C 应用程序的 SQL 语句中引用的值。 |
3 | 局部变量声明:此块声明要在应用程序中使用的局部变量。这些变量不是主变量。 |
4 | 包括 SQLCA 结构:执行每个 SQL 语句后,都将更新 SQLCA 结构。此模板应用程序使用某些 SQLCA 字段进行错误处理。 |
5 | 连接到数据库:使用数据库的初始步骤是,与该数据库建立连接。这里,通过执行 SQL 语句 CONNECT 来建立连接。 |
6 | 错误处理:检查是否已发生错误。 |
7 | 执行查询:通过执行此 SQL 语句,将表所返回的数据赋予主变量。在执行 SQL 语句后使用的 C 代码将主变量中的值打印到标准输出。 |
8 | 执行操作:执行此 SQL 语句将更新表中由部门编号标识的一组行。准备过程 (EXEC SQL PREPARE StmtDyn FROM :hostVarStmtDyn;) 是一个步骤,此步骤将主变量值(例如此语句中引用的主变量值)与所要执行的 SQL 语句绑定。 |
9 | 执行操作:在此行以及上一行中,此应用程序在静态 SQL 中使用游标来选择表中的信息并打印数据。在声明并打开游标之后,提取数据,最后关闭该游标。 |
10 | 落实事务:COMMIT 语句将工作单元中进行的数据库更改最终化。 |
11 | 最后,必须删除数据库连接。 |