我用c写了一个很简单的mysql接口函数, 但是别人说直接在c中写sql语句不是很规范,应该写成存储过程,所以请教各位高手,如何用存储过程来改写这个程序,小弟新学mysql,承蒙各位不吝赐教啦~,接口函数如下
#include<windows.h>
#include<stdio.h>
#include<mysql.h>
char* demand_log_date(char * id,char* start_time,char* expiry_time,char* buff)  
{       
    
char* buffpre=buff;
int i;
char   szSqlText[500]="";
MYSQL mysql;
MYSQL_RES * res ;   
    MYSQL_ROW row ; 
    

mysql_init(&mysql);
if(mysql_real_connect(&mysql,"localhost",             //连接数据库 
  "root", "123123", "lian", MYSQL_PORT, NULL, 0 ) ) 
 {         
sprintf(szSqlText,"select time,operation from tboperate_log where userid=" ); 
strcat(szSqlText,id);
strcat(szSqlText," and time>'");
strcat(szSqlText,start_time);
strcat(szSqlText,"' and time<'");
strcat(szSqlText,expiry_time);
strcat(szSqlText,"'");
         if (mysql_query( &mysql, szSqlText))  //执行SQL语句 
 {                                     //执行SQL语句出错 
                 printf("demand error!") ; 
                 mysql_close( &mysql ) ; 
                 return FALSE ; 
 } 
 
            res=mysql_store_result(&mysql);
int numRecords=mysql_num_rows(res);
if(numRecords==0) 
{
printf("numRecords 为 0\n");
mysql_free_result( res ) ;
return FALSE;
}
for(i=0;i<numRecords;i++,buffpre++)
{
row=mysql_fetch_row(res);
strcpy(buffpre,row[0]);
buffpre+=19;
strcpy(buffpre,row[1]);
buffpre+=8;
//buffpre='\0';
}
buffpre='\0';     
    mysql_free_result( res ) ;            
  } 
     else 
 {                                             //连接数据库出错 
       printf( "Can't connect to the mysql server ") ;
  //printf("\n,%s",mysql_error(&mysql));
       mysql_close( &mysql ) ; 
       return FALSE ; 
 } 
     mysql_close( &mysql ) ; 
     return buff; 
} int main()
{   
    int i;
char* m=(char*)malloc(sizeof(char)*500);
memset(m,0,500);
char* mpre=m;
char* n;

n=demand_log_date("45421","2000/01/01 00:00:00","2010/12/31 00:00:00",mpre);
if(n==FALSE)
{
printf("函数未成功运行");
return 0;
}
for(;(*mpre)!='\0';mpre++)
{
printf("%s",mpre);
mpre+=27;
printf("\n");
} free(m);
m=NULL;
mpre=NULL;
return 1;
}

解决方案 »

  1.   

    查询日志信息,初学存储过程,我随便写了一个存储过程p2(),执行SQL语句select * from tbuser_info;在MySQL里可以正常调用p2(),在我写的接口里,老显示执行SQL语句出错,接口如下
    #include<windows.h>
    #include<stdio.h>
    #include<mysql.h>
    char * demand_password(char* id)             //返回值为password
    {
    char* password=NULL;

    char   szSqlText[500]=""; 
    MYSQL mysql;
    MYSQL_RES * res;
    MYSQL_ROW row ; 
         mysql_init(&mysql);
    if(mysql_real_connect(&mysql,"localhost",             //连接数据库 
      "root", "123123", "lian", MYSQL_PORT, NULL,CLIENT_MULTI_STATEMENTS) ) 
     {         
     

    /*sprintf(szSqlText,"call demand_password('"); 
        strcat(szSqlText,id);
    strcat(szSqlText,"');");
    */
    sprintf(szSqlText,"call p2()");

             if (mysql_query( &mysql, szSqlText))  //执行SQL语句 
     {                                     //执行SQL语句出错 
                     printf("Can't find the id you want") ; 
     printf("\n,%s",mysql_error(&mysql));
                     mysql_close( &mysql ) ; 
                     return FALSE ; 
     } 
        
             
        res = mysql_store_result( &mysql ) ;   //取得查询结果
    int numRecords=mysql_num_rows(res);
    if(numRecords==0) 
    {
    printf("numRecords 为 0\n");
    mysql_free_result( res ) ;
    return FALSE;
    }            row=mysql_fetch_row(res);
    password=row[0];
    mysql_free_result( res ) ;             /*res = mysql_store_result( &mysql ) ;   //取得查询结果  
    row=mysql_fetch_row(res);
    password=row[0];


    mysql_free_result( res ) ; */
     
      } 
         else 
     {                                             //连接数据库出错 
           printf( "Can't connect to the mysql server ") ;
      //printf("\n,%s",mysql_error(&mysql));
           mysql_close( &mysql ) ; 
           return FALSE ; 
     } 
         mysql_close( &mysql ) ; 
         return password; 
    } int main()
    {   
        char* s=(char *)malloc(sizeof(char)*10);
    char* spre=s;
    spre=demand_password("2510");
    if(spre==FALSE)
    {
    printf("\nspre为FALSE");
    return 0;
    }
    printf("%s",spre);
    free(s);
    s=NULL;
    spre=NULL;
    return 1;
    }
      

  2.   

    包含了MYSQL头文件,检查是什么错误,用mysql_error(&mysql))
    Errors CR_COMMANDS_OUT_OF_SYNC Commands were executed in an improper order. CR_SERVER_GONE_ERROR The MySQL server has gone away. CR_SERVER_LOST The connection to the server was lost during the query. CR_UNKNOWN_ERROR An unknown error occurred. 
      

  3.   

    mysql_error(&mysql)显示错误:procedure xx.p1 can't return a result set in the given context
    应该是什么问题啊
      

  4.   

    呵呵,不能返回记录集,用单一的SQL语句吧。
      

  5.   

    如:select id from tt
      

  6.   

    p1的完整定义如下:
    delimiter //
    create procedure p1()
    begin
    select count(*) from tbuser_info;
    end
    //
    delimiter ;
    我也想着肯定不会是和硬件有关,可是在我电脑上就是不能调用这个过程,整的我很郁闷,在别人的机子上运行的很好。
    补充下,在我电脑的MySQL环境下可以正常调用p1(),只是在自己写的接口中不行,抓狂
      

  7.   

    CLIENT_MULTI_STATEMENTS->
    CLIENT_MULTI_RESULTS 
    试试
      

  8.   

    用mysql_set_server_option
    设置
    MYSQL_OPTION_MULTI_STATEMENTS_ON
    MYSQL版本?
      

  9.   

    mysql_set_server_option(&mysql, MYSQL_OPTION_MULTI_STATEMENTS_ON)
      

  10.   

    高手,能加你QQ吗?这样快点,呵呵。你要是不方便在这里留的话,可以发我邮箱[email protected]
    小小菜鸟,请多关照~
      

  11.   

    呵呵,我不是高手,在C里面调用头,没有用过,只是根据HELP来查找一些信息。
      

  12.   

    又来麻烦你了,我想不通为什么只有在我机子上调用接口不能运行存储过程,所以我重装了MySQL,把原来的datafiles先保存了,装好后先把某个数据库的文件夹复制到data里, 在MySQL环境下可以进入这个数据库,可以查看所有表(show tables),但是涉及到具体表的查看就出问题了(select * from tbuser_info),显示这个表不存在(xxx.xxx doesn't exit).
    后来我直接用先前的data文件夹覆盖重装后的data文件夹,先在进程里关了mysqld.exe,然后覆盖,接着在服务里启动MySQL是出问题了,弹出一个对话框“在本地计算机无法启动MySQL服务。错误1067:进程意外终止。”
    这是怎么回事啊,在网上也找了找,试了试,没有能用的方法,只能麻烦你了,真不好意思啊
      

  13.   

    呵呵,MYSQL是要用MYSQLDUMP备份,再在MYSQL中恢复,你是直接COPY的吧?
      

  14.   

    嗯。我直接copy了一份,同时也倒出了一份mysql.sql脚本,我也试过用source命令导入,可是不成功,好多error
      

  15.   

    用MYSQLDUMP生成的mysql.sql?两个数据库的字符集设置是一样的?
      

  16.   

    简单一点,安装SQLYOG来操作MYSQL
      

  17.   

    应该是用MySQLDUMP命令生成的,记不清了,当时在网上找的命令,两个数据库字符集都是gbk
      

  18.   

    呵呵,先建立一个数据库
    CREATE {DATABASE rr
    再导入
      

  19.   

    我傻了,哈哈,我建立了数据库忘了选择了,没加use xxx;命令,谢谢你,好心人