BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / cpp / #95580同步于 2017/6/11
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖

在C中嵌入SQL语句时报错EXEC SQL未声明的标识符

dbyqs
2017/6/11镜像同步7 回复
在C语言中编写SQL语句的时候,EXEC SQL 老是报错为未声明的标识符,这到底是这么回事啊? 编程环境VS2013,这个例子是数据库系统概论书上的例子。代码如下: #include <windows.h> #include <string.h> #include <conio.h> #include <stdio.h> #include <stdlib.h> #include <mysql.h> //#pragma comment(lib,"libmysql.lib") EXEC SQL BEGIN DECLARE SECTION; /*主变量说明开始*/ char deptname[64]; char HSno[64]; char HSname[64]; char HSsex[64]; int HSage; int NEWAGE; long SQLCODE; EXEC SQL END DECLARE SECTION; /*主变量说明结束*/ EXEC SQL INCLUDE sqlca; /*定义SQL通信区*/ /*************************************************************************/ 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 mysql USER root; /*连接数据库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; /*推进游标,将当前数据放入主变量*/ 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'); 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; /*断开数据库连接*/ }
订阅后,新回复会通过你的通知中心匿名送达。
7 条回复
bond1993机器人#1 · 2017/6/12
没用过,但是第一感觉如果sql真的提供这种api也是很猛:考虑到sql语法的灵活性,EXEC,SQL等翻译成怎样的C语言好呢?还要支持自定义的SX,HSno之类就更难了。 如果是我设计,一定会设计 sql.connect("..."), sql.excu("...")这种更科学的接口。 查了一下,果然:http://blog.csdn.net/delphiwcdj/article/details/6422262 你可能买了假的教科书,(或你理解错了)
FromSixToTen机器人#2 · 2017/6/12
书上的代码有几个能通,这代码能通就见鬼了。 @zc199102 @chaoshen @zzy 【 在 bond1993 的大作中提到: 】 : 没用过,但是第一感觉如果sql真的提供这种api也是很猛:考虑到sql语法的灵活性,EXEC,SQL等翻译成怎样的C语言好呢?还要支持自定义的SX,HSno之类就更难了。 : 如果是我设计,一定会设计 sql.connect("..."), sql.excu("...")这种更科学的接口。 : 查了一下,果然:http://blog.csdn.net/delphiwcdj/article/details/6422262 : ...................
dbyqs机器人#3 · 2017/6/12
【 在 bond1993 的大作中提到: 】 : 没用过,但是第一感觉如果sql真的提供这种api也是很猛:考虑到sql语法的灵活性,EXEC,SQL等翻译成怎样的C语言好呢?还要支持自定义的SX,HSno之类就更难了。 : 如果是我设计,一定会设计 sql.connect("..."), sql.excu("...")这种更科学的接口。 : 查了一下,果然:http://blog.csdn.net/delphiwcdj/article/details/6422262 : ................... 是的,您说的这种办法是可行的,我也试过了。但是嵌入式SQL应该也是可以的啊?而且VS应该识别EXEC SQL这样的标记的,我感觉不是VS的配置有问题就是少库文件了,但就是不知道怎么改啊!
bond1993机器人#4 · 2017/6/12
VS只是IDE,重要的是编译器是否认识。 从来没听过有为sql设计的C编译器
SinceBelieve机器人#5 · 2017/6/12
应该是有个预处理程序,类似于 https://www.ibm.com/support/knowledgecenter/zh/SSEPGG_10.5.0/com.ibm.db2.luw.apdv.embed.doc/doc/t0020937.html 不觉得这么搞有特别大的好处
epico机器人#6 · 2017/6/12
同意楼上,需要先用预处理程序处理一下再编译。
q644540267机器人#7 · 2017/6/12
用c处理Sql话应该用odbc吧