四、建立和关闭数据库连接 ◇建立数据库连接 EXEC SQL CONNECT To target [AS connection-name] [UsER user-name arget是要连接的数据库服务器: ●常见的服务器标识串,如< dbname>@< hostname>:port> ●包含服务器标识的SQL串常量 DEFAULT connect-name是可选的连接名,连接必须是一个有效的标识符 在整个程序内只有一个连接时可以不指定连接名 关闭数据库连接 EXEC SQL DISCONNECT [connection 令程序运行过程中可以修改当前连接: EXEC SQL SET CONNEC TION connection-name DEFAULT An Introduction to Database System
An Introduction to Database System 四、建立和关闭数据库连接 ❖ 建立数据库连接 EXEC SQL CONNECT TO target [AS connection-name] [USER user-name]; target是要连接的数据库服务器: ⚫ 常见的服务器标识串,如<dbname>@<hostname>:<port> ⚫ 包含服务器标识的SQL串常量 ⚫ DEFAULT connect-name是可选的连接名,连接必须是一个有效的标识符 在整个程序内只有一个连接时可以不指定连接名 ❖ 关闭数据库连接 EXEC SQL DISCONNECT [connection]; ❖ 程序运行过程中可以修改当前连接 : EXEC SQL SET CONNECTION connection-name | DEFAULT;
五、程序实例 [例1依次检查某个系的学生记录,交互式更新某些学生年龄 EXEC SQL BEGIN DEC LARE SECTION;/*主变量说明开始* char deptname [641 char Hsno[64] char HSname [641 char HSsex[64] int SAge int NEWaGe EXEC SQL END DECLARE SECTION;/主变量说明结束* long SQLCODE, EXEC SQL INCLUDE sqlca /*定义SQL通信区* An Introduction to Database System
An Introduction to Database System 五、程序实例 [例1]依次检查某个系的学生记录,交互式更新某些学生年龄。 EXEC SQL BEGIN DEC LARE SECTION; /*主变量说明开始*/ char deptname[64]; char HSno[64]; char HSname[64]; char HSsex[64]; int HSage; int NEWAGE; EXEC SQL END DECLARE SECTION; /*主变量说明结束*/ long SQLCODE; EXEC SQL INCLUDE sqlca; /*定义SQL通信区*/
程序实例(续) nt main(void) /*C语言主程序开始* int count =0 char yn /变量yn代表yes或no* printf("please choose the department name(CS/MA/IS): scanf("%s", deptname) /*为主变量 deptname赋值 EXEC SQL CONNECT TO TESTOlocalhost: 54321 USER SYSTEM"/" MANAGER";/连接数据库TEST* EXEC SQL DECLARE SX CURSOR FOR/定义游标 SELECT Sno, Sname,Ssex,Sage/SX对应语句的执行结果 FROM Student WHERE SDept=: deptname EXEC SQL OPEN SX;打开游标SX便指向査询结果的第一行* An Introduction to Database System
An Introduction to Database System 程序实例(续) int main(void) /*C语言主程序开始*/ { int count = 0; char yn; /*变量yn代表yes或no*/ printf("Please choose the department name(CS/MA/IS): "); scanf("%s", deptname); /*为主变量deptname赋值*/ EXEC SQL CONNECT TO TEST@localhost:54321 USER "SYSTEM" /"MANAGER"; /*连接数据库TEST*/ EXEC SQL DECLARE SX CURSOR FOR /*定义游标*/ SELECT Sno, Sname, Ssex, Sage /*SX对应语句的执行结果*/ FROM Student WHERE SDept = :deptname; EXEC SQL OPEN SX; /*打开游标SX便指向查询结果的第一行*/
程序实例(续) for(;; *用循环结构逐条处理结果集中的记录* EXEC SQL FETCH SX INTO: HSno, HSname, HSSex, HSage, 推进游标,将当前数据放入主变量* f( sqlca sqlcode!=0)/* sqlcode!=0,表示操作不成功* break /*利用 SQLCA中的状态信息决定何时退出循环* if(count++== O) /*如果是第一行的话,先打出行头* printf("n%-10s%0-20s %-10s %-10sIn","Sno","Sname","Ssex","Sage") printf("%-10s %-20s %-10S%-10dIn", HSno, HSname, HSsex, HSage) /*打印查询结果 printf("UPDATE AGE(yn)?");/询问用户是否要更新该学生的年龄* dot scanf("%c",&yn) while(yn!=N,&& yn !='n'&& yn l=Y&& yn l='y); An Introduction to Database System
An Introduction to Database System 程序实例(续) for ( ; ; ) /*用循环结构逐条处理结果集中的记录*/ { EXEC SQL FETCH SX INTO :HSno, :HSname, :HSsex,:HSage; /*推进游标,将当前数据放入主变量*/ if (sqlca.sqlcode != 0) /* sqlcode != 0,表示操作不成功*/ break; /*利用SQLCA中的状态信息决定何时退出循环*/ if(count++ == 0) /*如果是第一行的话,先打出行头*/ printf("\n%-10s %-20s %-10s %-10s\n", "Sno", "Sname", "Ssex", "Sage"); printf("%-10s %-20s %-10s %-10d\n", HSno, HSname, HSsex, HSage); /*打印查询结果*/ printf("UPDATE AGE(y/n)?"); /*询问用户是否要更新该学生的年龄*/ do{ scanf("%c",&yn); } while(yn != 'N' && yn != 'n' && yn != 'Y' && yn != 'y');
程序实例(续) f(yn==yl‖yn=="Y" /如果选择更新操作* printf("INPUT NEW AGE scanf("%d",& NEWAGE);/*用户输入新年龄到主变量中* EXEC SQL UPDATE Student /*嵌入式SQL* SET Sage=: NEWAGE WHERE CURRENT OF SX /*对当前游标指向的学生年龄进行更新* EXEC SQL CLOSE SX /*关闭游标SX不再和査询结果对应* EXEC SQL COMMIT WORK *提交更新 EXEC SQL DISCONNECT TEST /*断开数据库连接* An Introduction to Database System
An Introduction to Database System 程序实例(续) if (yn == 'y' || yn == 'Y') /*如果选择更新操作*/ { printf("INPUT NEW AGE:"); scanf("%d",&NEWAGE); /*用户输入新年龄到主变量中*/ EXEC SQL UPDATE Student /*嵌入式SQL*/ SET Sage = :NEWAGE WHERE CURRENT OF SX ; } /*对当前游标指向的学生年龄进行更新*/ } EXEC SQL CLOSE SX; /*关闭游标SX不再和查询结果对应*/ EXEC SQL COMMIT WORK; /*提交更新*/ EXEC SQL DISCONNECT TEST; /*断开数据库连接*/ }