返回信息流在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; /*断开数据库连接*/
}
这是一条镜像帖。来源:北邮人论坛 / cpp / #95580同步于 2017/6/11
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
在C中嵌入SQL语句时报错EXEC SQL未声明的标识符
dbyqs
2017/6/11镜像同步7 回复
订阅后,新回复会通过你的通知中心匿名送达。
7 条回复
没用过,但是第一感觉如果sql真的提供这种api也是很猛:考虑到sql语法的灵活性,EXEC,SQL等翻译成怎样的C语言好呢?还要支持自定义的SX,HSno之类就更难了。
如果是我设计,一定会设计 sql.connect("..."), sql.excu("...")这种更科学的接口。
查了一下,果然:http://blog.csdn.net/delphiwcdj/article/details/6422262
你可能买了假的教科书,(或你理解错了)
书上的代码有几个能通,这代码能通就见鬼了。 @zc199102 @chaoshen @zzy
【 在 bond1993 的大作中提到: 】
: 没用过,但是第一感觉如果sql真的提供这种api也是很猛:考虑到sql语法的灵活性,EXEC,SQL等翻译成怎样的C语言好呢?还要支持自定义的SX,HSno之类就更难了。
: 如果是我设计,一定会设计 sql.connect("..."), sql.excu("...")这种更科学的接口。
: 查了一下,果然:http://blog.csdn.net/delphiwcdj/article/details/6422262
: ...................
【 在 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的配置有问题就是少库文件了,但就是不知道怎么改啊!
应该是有个预处理程序,类似于 https://www.ibm.com/support/knowledgecenter/zh/SSEPGG_10.5.0/com.ibm.db2.luw.apdv.embed.doc/doc/t0020937.html
不觉得这么搞有特别大的好处