linux下,用c连接mysql,调用mysql存储过程,程序见下面。
运行结果是:
search ok!
add failed!
search failed!3个存储过程依次为查询/新增/查询(也许还有很多其他的),在执行第一个存储过程之后,再执行都不对了!!不知道哪里有问题,请高手执教!!谢谢!!# include <stdio.h>
# include <stdlib.h>
# include <string.h>
# include <mysql/mysql.h>int main(int argc ,char *argv[])
{
   MYSQL *m_sql;
   m_sql = (MYSQL*)malloc(sizeof(MYSQL));   mysql_init(m_sql);
   mysql_options(m_sql,MYSQL_READ_DEFAULT_GROUP,"mysql");   if(!mysql_real_connect(m_sql,"127.0.0.1","root","12345","test2",0,NULL,CLIENT_MULTI_STATEMENTS))
    {
       printf("Connect MySQL ERROR!\n");
       exit(1);
    }   printf("Connect MySQL Success!\n"); //call 一个查询的存储过程 
   char command1[200] = "call query_POSDATA(860016, '2008-08-12 03:53:00', NULL, NULL);";
if (mysql_query(m_sql, command1) == 0 )
{
   printf("search ok!\n");
}
else
{
   printf("search failed!\n");
}   char command2[200] = "call add_ALLOCATION('AAA', 'BBB', 13);";
    if (mysql_query(m_sql, command2) == 0 )
{
   printf("add ok!\n");
}
else
{
   printf("add failed!\n");
}   char command3[200] = "call query_POSDATA(860016, '2008-08-12 03:53:00', NULL, NULL);";
    if (mysql_query(m_sql, command3) == 0 )
{
   printf("search ok!\n");
}
else
{
   printf("search failed!\n");
}   mysql_close(m_sql);
   return 0;
}

解决方案 »

  1.   

    说明,存储过程本身是没有问题的,下面贴出存储过程,方便大家帮忙调试!谢谢!DELIMITER $$;
    DROP PROCEDURE IF EXISTS `GIStracking2`.`query_POSDATA`$$
    CREATE DEFINER=`root`@`%` PROCEDURE `query_POSDATA`(
    in in_devid varchar(20),
    in in_gpsdttm datetime,
    in in_lat double,
    in in_lon double
    )
    BEGIN
    set @stmt = "select * from POSDATA where 1=1 ";
    set @stmt = concat(@stmt, " limit 50");        select @stmt;
    #prepare s1 from @stmt;
    #execute s1;
    #drop prepare s1;
    END$$
    DELIMITER ;$$
    DELIMITER $$;
    DROP PROCEDURE IF EXISTS `GIStracking2`.`add_ALLOCATION`$$
    CREATE DEFINER=`root`@`%` PROCEDURE `add_ALLOCATION`(
    in in_coid varchar(10), 
    in in_usrid varchar(10),
    in in_veid int
    )
    BEGIN
    insert into ALLOCATION(CoID, UsrID, VeID)
    values(in_coid, in_usrid, in_veid);
    END$$
    DELIMITER ;$$
      

  2.   

    我想mysql的功能也不至于这么差,XDJM们看是否可以从这个方面考虑一下?不管什么环境,是用程序连接mysql,连续执行2条以上的存储过程(包含一条查询存储过程,一条其他语句的),可以运行吗?
    小弟还是怀疑是连接字符串的问题。。现在小弟本地没有环境可以测试,周一会到公司再看看。谢谢各位!
      

  3.   

    刚才又试了一下,不执行存储过程,换成2条sql,也不行。
    修改
    mysql_real_connect(m_sql,"127.0.0.1","root","12345","test2",0,NULL,CLIENT_MULTI_STATEMENTS))
    改成
    mysql_real_connect(m_sql,"127.0.0.1","root","12345","test2",0,NULL,CLIENT_MULTI_RESULTS))
    or 
    mysql_real_connect(m_sql,"127.0.0.1","root","12345","test2",0,NULL,0))都不可以,只能执行一次sql,执行第二次sql的时候mysql_query的返回值都不对。。
    那么,到底是下面3句话有问题?
      mysql_init(m_sql); 
      mysql_options(m_sql,MYSQL_READ_DEFAULT_GROUP,"mysql"); 
      if(!mysql_real_connect(m_sql,"127.0.0.1","root","12345","test2",0,NULL,CLIENT_MULTI_STATEMENTS)) 
    还是mysql的设置问题呢?我程序连接到mysql,不可能执行一次就连接一次吧?
      

  4.   

    SELECT类型的语句执行了以后,即使你不需要结果,也应该执行一次mysql_use_result()或者mysql_store_result(),然后mysql_free_result(),除非SELECT执行没有成功。
      

  5.   

    谢谢楼上的同学,更改过了,对于sql语句,确实可以执行多条了:)但是更改成CLIENT_MULTI_STATEMENTS/CLIENT_MULTI_RESULTS参数后,测试存储过程的多次执行,还是不行,还请帮手看看,谢谢!
      

  6.   

    终于解决了,mysql真是变态。http://www.diybl.com/course/7_databases/sql/sqlServer/2008819/136200.html谢谢iisbsd给我的提示,100份全部给你:)