执行.sql脚本问题?

yuucyf 2013-04-19 03:30:06
我在程序中使用C Apis把.sql脚本内容保存到buffer中,(已经开启多行执行功能)
如何调用API:mysql_query()执行,结果返回0,表示执行成功,但是在数据库中发现没有数据.
.sql中有insert命令.

如果我在命令行中使用source命令导入.sql那么就正确?我的疑问是:为什么mysql_query执行正确,但是数据库中没有受影响?

...全文
304 28 打赏 收藏 转发到动态 举报
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
comeonxi 2013-04-28
  • 打赏
  • 举报
回复
引用 20 楼 ACMAIN_CHM 的回复:
delimiter 不是SQL命令啊。 DELIMITER仅令是SQL命令行工具中的语句而已。
我也是去掉了 deimiter 就可以了.
yuucyf 2013-04-23
  • 打赏
  • 举报
回复
引用 25 楼 ACMAIN_CHM 的回复:
可以依次判断多个返回集来判断是否正确执行
正解.
WWWWA 2013-04-23
  • 打赏
  • 举报
回复
执行结果是否正确不知道 先将SQL语句在MYSQL中调试通过,在导入时,将出错信息保存在1个文本中,再 进行判断
yuucyf 2013-04-22
  • 打赏
  • 举报
回复
引用 20 楼 ACMAIN_CHM 的回复:
delimiter 不是SQL命令啊。 DELIMITER仅令是SQL命令行工具中的语句而已。
那既然不是SQL语句,原则上执行要报错才是,为什么调用mysql_query()执行没有报错?
ACMAIN_CHM 2013-04-22
  • 打赏
  • 举报
回复
delimiter 不是SQL命令啊。 DELIMITER仅令是SQL命令行工具中的语句而已。
yuucyf 2013-04-22
  • 打赏
  • 举报
回复
引用 18 楼 ACMAIN_CHM 的回复:
怀疑代码中根本没有设置 CLIENT_MULTI_STATEMENTS
发现原因了: 如果代码中有的SQL语句如下:

use yuu3; insert into yuu_version(Date, Version) values('2013-4-22', 'v1.0.1');"
上面的代码能执行正确, 如果更改默认行的结束符,如:

use yuu3; delimiter ;; insert into yuu_version(Date, Version) values('2013-4-22', 'v1.0.1');; delimiter ;"
我把delimiter;;去掉,结束的delimiter;去掉就可以正常执行了? 什么原因?奇怪,难道不能自行设置行的结束符?
ACMAIN_CHM 2013-04-22
  • 打赏
  • 举报
回复
怀疑代码中根本没有设置 CLIENT_MULTI_STATEMENTS
yuucyf 2013-04-22
  • 打赏
  • 举报
回复
引用 16 楼 WWWWA 的回复:
你的C代码是什么,执行有SQL文件(没有执行)的代码是什么
目前发现好像没有执行多行语句,奇怪.(但是我设置了CLIENT_MULTI_STATEMENTS标志) 1)如果代码如下:

//测试
	if (mysql_select_db(&m_MySql, _T("yuu3")))
	{
		return NULL;
	}
	CString FileContent = _T("insert into yuu_version(Date, Version) values('2013-4-22', 'v1.0.1');");
	//

	//一次性执行脚本中的内容.
	if (mysql_query(&m_MySql, FileContent))
	{
		return false;
	}
执行结果有发现数据库上有刚刚插入的值. 如果代码如下:

//测试
	CString FileContent = _T("use yuu3; insert into yuu_version(Date, Version) values('2013-4-22', 'v1.0.1');");
	//

	//一次性执行脚本中的内容.
	if (mysql_query(&m_MySql, FileContent))
	{
		return false;
	}
发现执行调用mysql_query成功,但是数据库中没有发现有值插入,看来可能只是执行use yuu3;这条语句就返回,没有执行后面的插入语句.
WWWWA 2013-04-22
  • 打赏
  • 举报
回复
你的C代码是什么,执行有SQL文件(没有执行)的代码是什么
yuucyf 2013-04-22
  • 打赏
  • 举报
回复
引用 14 楼 WWWWA 的回复:
你的代码执行,有无提示信息
调用mysql_query()执行,结果返回0, 代表执行成功,但是打开数据库yuu3,根本没有我要创建的表.
WWWWA 2013-04-22
  • 打赏
  • 举报
回复
你的代码执行,有无提示信息
yuucyf 2013-04-22
  • 打赏
  • 举报
回复
引用 12 楼 di74jun 的回复:
..sql中有insert命令... lz蒙我! 你insert命令 是包涵在PROCEDURE里的! DROP PROCEDURE IF EXISTS up_AddVersion;; CREATE PROCEDURE up_AddVersion(IN in_Date DATETIME,IN in_Version VARCHAR(40)) BEGIN INSERT INT……
为什么直接在命令行上输入source 对应的.sql文件,执行结果数据库中有我要创建表.
dyf0130 2013-04-22
  • 打赏
  • 举报
回复
..sql中有insert命令... lz蒙我! 你insert命令 是包涵在PROCEDURE里的! DROP PROCEDURE IF EXISTS up_AddVersion;; CREATE PROCEDURE up_AddVersion(IN in_Date DATETIME,IN in_Version VARCHAR(40)) BEGIN INSERT INTO yuu_Version(Date,Version) VALUES(in_Date, in_Version); END ;; 哪怕最后自己+2行 print "本段代码执行成功!" select "本段代码执行成功!" 我做数据库版本发布最讨厌没有日志的东西 一般有70个SQL文件,要发布到24个数据库上, 我肯定写批处理个脚本执行,最后看日志; 一看出现400个空日志文件,还有回过头来检查SQL
ACMAIN_CHM 2013-04-22
  • 打赏
  • 举报
回复
可以依次判断多个返回集来判断是否正确执行
yuucyf 2013-04-22
  • 打赏
  • 举报
回复
引用 23 楼 wwwwb 的回复:
mysql_query()只能执行SQL语句(SELECT 、INSERT、CREATE、UPDATE、DELETE等等),还是 考虑5楼的建议吧
我是用5楼的做法是实现,但是我是想找到这个问题的根本原因. 5楼的做法有一个弊端就是,执行结果是否正确不知道,尽管可以把执行结果输出到一个log文件中,然后执行完.bat文件后去分析log文件来判断是否正确执行,但是还是没有使用C Apis来调用来的优雅。
wwwwb 2013-04-22
  • 打赏
  • 举报
回复
mysql_query()只能执行SQL语句(SELECT 、INSERT、CREATE、UPDATE、DELETE等等),还是
考虑5楼的建议吧
ACMAIN_CHM 2013-04-22
  • 打赏
  • 举报
回复
应该是报错了,会报在第二个结果集中。 你在代码中检查一下第二个结果集的返回。
yuucyf 2013-04-21
  • 打赏
  • 举报
回复
引用 10 楼 ACMAIN_CHM 的回复:
那先检查上面这个语句在MYSQL命令行工具中是否能正确执行
可以正常运行.
ACMAIN_CHM 2013-04-20
  • 打赏
  • 举报
回复
那先检查上面这个语句在MYSQL命令行工具中是否能正确执行
yuucyf 2013-04-20
  • 打赏
  • 举报
回复
直接调用mysql_query()执行返回0,代表成功,但是数据库中没有数据. 我的数据库脚本.sql语句为:

USE yuu3;

delimiter ;;


DROP TABLE IF EXISTS yuu_Version;;
CREATE TABLE yuu_Version
(
  Date DATETIME,
  Version VARCHAR(40) NOT NULL,
  PRIMARY KEY(Date)
)ENGINE=InnoDB DEFAULT CHARSET=utf8;;

DROP PROCEDURE IF EXISTS up_SelVersion;;
CREATE PROCEDURE up_SelVersion()
BEGIN
	SELECT * FROM Version;
END ;;

DROP PROCEDURE IF EXISTS up_AddVersion;;
CREATE PROCEDURE up_AddVersion(IN in_Date DATETIME,IN in_Version VARCHAR(40))
BEGIN
	INSERT INTO yuu_Version(Date,Version) VALUES(in_Date, in_Version);
END ;;


delimiter ;
加载更多回复(8)

56,677

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧