我在程序中使用C Apis把.sql脚本内容保存到buffer中,(已经开启多行执行功能)
如何调用API:mysql_query()执行,结果返回0,表示执行成功,但是在数据库中发现没有数据.
.sql中有insert命令.如果我在命令行中使用source命令导入.sql那么就正确?我的疑问是:为什么mysql_query执行正确,但是数据库中没有受影响?

解决方案 »

  1.   

    你的代码是什么,SQL语句是什么
      

  2.   

    代码跟踪过发现没有问题,SQL语句也没有问题,因为SQL语句在命令行上执行都正确.
      

  3.   

    直接在命令行上输入source 对应的.sql文件,执行结果正确,数据库中也有我要插入的信息.
      

  4.   

    看来不支持把source当sql语句执行你在source语句前后各加select now();看能不能打印出来
      

  5.   

    用语言代码执行类似
    mysql -u -p <sql文件
      

  6.   

    SOURCE 不是SQL语句命令,仅仅是mysql命令行工具mysql.exe 中的一个命令。
    C中可以把命令读入到字符串,然后直接执行。
    if (mysql_real_connect (mysql, host_name, user_name, password,
        db_name, port_num, socket_name, CLIENT_MULTI_STATEMENTS) == NULL)
      

  7.   

    已经设置了CLIENT_MULTI_STATEMENTS.我主要是想用API去执行.
      

  8.   

    那就直接执行你的语句。strsql = "create table xxx; insert into ....";
      

  9.   

    直接调用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 ;
      

  10.   

    那先检查上面这个语句在MYSQL命令行工具中是否能正确执行
      

  11.   

    ..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
      

  12.   

    为什么直接在命令行上输入source 对应的.sql文件,执行结果数据库中有我要创建表.
      

  13.   

    调用mysql_query()执行,结果返回0, 代表执行成功,但是打开数据库yuu3,根本没有我要创建的表.
      

  14.   

    你的C代码是什么,执行有SQL文件(没有执行)的代码是什么
      

  15.   

    目前发现好像没有执行多行语句,奇怪.(但是我设置了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;这条语句就返回,没有执行后面的插入语句.
      

  16.   

     怀疑代码中根本没有设置 CLIENT_MULTI_STATEMENTS
      

  17.   

    发现原因了:
    如果代码中有的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;去掉就可以正常执行了?
    什么原因?奇怪,难道不能自行设置行的结束符?
      

  18.   

    delimiter 不是SQL命令啊。 DELIMITER仅令是SQL命令行工具中的语句而已。
      

  19.   

    那既然不是SQL语句,原则上执行要报错才是,为什么调用mysql_query()执行没有报错?
      

  20.   

    mysql_query()只能执行SQL语句(SELECT 、INSERT、CREATE、UPDATE、DELETE等等),还是
    考虑5楼的建议吧
      

  21.   

    我是用5楼的做法是实现,但是我是想找到这个问题的根本原因.5楼的做法有一个弊端就是,执行结果是否正确不知道,尽管可以把执行结果输出到一个log文件中,然后执行完.bat文件后去分析log文件来判断是否正确执行,但是还是没有使用C Apis来调用来的优雅。
      

  22.   

    执行结果是否正确不知道先将SQL语句在MYSQL中调试通过,在导入时,将出错信息保存在1个文本中,再
    进行判断
      

  23.   


    我也是去掉了 deimiter 就可以了.