使用mysql c api更新表的有效方法

时间:2014-04-08 06:23:18

标签: mysql c

我正在做一个数据记录器项目,我从传感器获取数据并将它们存储在数据库中。我正在使用托管在Beaglebone(基于ARM linux的计算机)上的mysql数据库,我使用C api来处理mysql数据库。

我以5秒的采样时间轮询传感器并从中获取数据并按照下面的代码将它们存储到表格中,代码执行了我想要知道的事情我只是想知道是否有更新表的有效方法。下面是代码

    #include <my_global.h>
    #include <mysql.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <string.h>

    int main(int argc,char *argv[])
    {

    /* creates a new mysql object */
     MYSQL *con = mysql_init(NULL);

     float tempval = 0;
     float humidval=0;

     char query[100]={0};

     if (con == NULL) 
     {
          fprintf(stderr, "%s\n", mysql_error(con));
          exit(1);
     }

    /* connect to db */
     if(mysql_real_connect(con,"localhost","root","passwrd12#",0,0,0,0)==NULL)
     {
         fprintf(stderr, "%s\n", mysql_error(con));
         mysql_close(con);
         exit(1);

     }
/* Select the db */

      if(mysql_select_db(con,"TestDb")!=0)
      {
        fprintf(stderr,"%s \n",mysql_error(con));
        mysql_close(con);
        exit(1);
      }

     while(1)
     {

      //Read temperature and humidity sensors on pin1 and pin2 

        tempval=Read_Sensordata(1);
        humidval=Read_Sensordata(2)

      memset(query,0,sizeof query);

/* update the temperature and humidity values */    
      sprintf(query,"UPDATE Datavalues SET Temperature = %f,Humidity = %f,Time=NOW() WHERE Rownum=0",tempval,humidval);

      if (mysql_query(con,query)) 
      {
          fprintf(stderr, "%s\n", mysql_error(con));
          mysql_close(con);
          exit(1);
      }

       usleep(5000000);


     }
      mysql_close(con);

      exit(0);

    }

1 个答案:

答案 0 :(得分:2)

不是每次都执行一个新的查询,而是可以prepare一次查询并每次使用修订后的值执行它。例如(没有任何错误检查):

strmov(query, "               \
  UPDATE Datavalues           \
  SET    Temperature = ?,     \
         Humidity    = ?,     \
         Time        = NOW()  \
  WHERE  Rownum      = 0      \
");

MYSQL_STMT *stmt = mysql_stmt_init(con);
mysql_stmt_prepare(stmt, query, strlen(query));

MYSQL_BIND bind[2];
memset(bind, 0, sizeof(bind));
bind[0].buffer_type = bind[1].buffer_type = MYSQL_TYPE_FLOAT;
bind[0].buffer = (char *) &tempval;
bind[1].buffer = (char *) &humidval;
mysql_stmt_bind_param(stmt, bind);

while (1) {
  tempval  = Read_Sensordata(1);
  humidval = Read_Sensordata(2);
  mysql_stmt_execute(stmt);
  usleep(5000000);
}

mysql_stmt_close(stmt);

此外,您可能希望考虑使用MySQL的Automatic Initialization and Updating for TIMESTAMP and DATETIME来保存您必须在Time命令中明确设置UPDATE列。