2016-01-21 80 views
1

我能够获取ac函数来插入和更新表格上的单元格,但我遇到的问题是能够从单元格获取值并且将它保存为一个变量,我可以用它来比较和计算它。先谢谢你。C函数从MySQL数据库获取数据并将其作为变量存储

void MIA_get_data_temperature() 
{ 

    MYSQL_RES *query_results = mysql_store_result(conn); 
    MYSQL_ROW row; //This will declare row variable 

    //int total_rows = mysql_num_rows(query_results); 
    int num_fields = mysql_num_fields(query_results); 
    int i; 
    char buffer[256]; // Setting buffer for query string 


    const char *query = "SELECT Temperature FROM `temperature` WHERE Mode='Current_Temperature'"; 


    //snprintf() - safer thatn sprint USE THIS 
    //checking to make sure query string is not to large for buffer & formatting query to get passed 
    if (snprintf(buffer, sizeof(buffer), query) >= sizeof(buffer)) 
    { 
     printf("Issue with Buffer \n"); 
     exit (-1); 

    } 



    //Reading from MySQL Table 

    if(mysql_query(conn, buffer) !=0) 
    { 
     fprintf(stderr, "%s\n", mysql_error(conn)); 
     exit (-1); 
    } else { 

     while((row = mysql_fetch_row(query_results)) !=0) 
     { 
      for (i = 0; i < num_fields; i++) 
      { 
       ??? Saving Result as a variable 
      } 

     } 
    }  
} 

回答

1

一个与您的代码最明显的问题是,你以错误的顺序做的事情 - 你需要你抓住的结果集之前运行SELECT查询,所以你应该之前调用mysql_query()你请致电mysql_store_result()mysql_num_fields()而不是之后。

此外,虽然它不会伤害任何东西,但您不需要将此查询字符串snprintf()放入缓冲区中,因为您没有将任何格式化值写入它。

至于实际保存来自查询的值,它们作为文本返回,所以如果你想要其他东西,比如float或int,你需要相应地转换它。

因此,如果我们调整你的代码了一下,跳过不必要snprintf(),并做一些琐碎的结果(假设Temperature是一个浮点值),我们可以得到:

void MIA_get_data_temperature() 
{ 
    const char *query = "SELECT Temperature FROM `temperature` WHERE " 
         "Mode='Current_Temperature'"; 

    if (mysql_query(conn, query) != 0) 
    { 
    fprintf(stderr, "%s\n", mysql_error(conn)); 
    exit(-1); 
    } else { 
    MYSQL_RES *query_results = mysql_store_result(conn); 
    if (query_results) { // make sure there *are* results.. 
     MYSQL_ROW row; 

     while((row = mysql_fetch_row(query_results)) !=0) 
     { 
     /* Since your query only requests one column, I'm 
     * just using 'row[0]' to get the first field. */ 

     /* Set a float 'f' to the value in 'row[0]', or 
     * 0.0f if it's NULL */ 
     float f = row[0] ? atof(row[0]) : 0.0f; 

     /* Do whatever you need to with 'f' */ 
     printf("%f\n", f); 
     } 

     /* Free results when done */ 
     mysql_free_result(query_results); 
    } 
    } 
} 
+0

你的朋友是英雄!我一直在看这个代码几个小时,并且在网上查看不同的例子,并且找不到与它有关的东西。我对C真的很陌生,并且一直在自学。 – Vlad

+1

如果您的查询检索到更多的列,则第一个将在'row [0]'中,第二个在'row [1]'中,第三个在'row [2]'等中,您可以调用'mysql_num_fields(query_results)找出结果集中有多少列,还有其他函数可用于在需要时获取有关列的列名和其他信息。 – Dmitri

+0

好的,再次感谢你,只是为了确保mysql_num_fields()返回一个unsigned int?像我可以使用函数来比较或将其分配给一个变量,并打印我们的列数? – Vlad

0

这个怎么样?

char* s;   
    while((row = mysql_fetch_row(query_results)) !=0) 
    { 
     for (i = 0; i < num_fields; i++) 
     { 
      s = row[i] ? row[i] : "NULL"; 
      printf("%s\n",s); 
     } 
    } 

注意:这也取决于您的num_fields。您可以声明一个数组来将所有检索到的单元格保存在一行中。我只是演示如何存储变量并将其打印出来。

+0

谢谢你的回应,但我确实有一个问题,你为什么可以编译代码,但是当我运行它并调用该函数时,我得到一个错误139? – Vlad

+0

叫什么功能? – user3813674

+0

我添加了一个编辑来处理'row [i]'为空的情况。 – user3813674

相关问题