2013-06-05 97 views
0

分開在不同行的結果值我在SQL數據庫中創建該表(結果)(測試)如何使用MySQL查詢

CREATE DATABASE `test`; 
USE `test`; 
CREATE TABLE `results` (
`number` bigint(20) unsigned NOT NULL AUTO_INCREMENT, 
`id_machine` int(10) unsigned NOT NULL, 
`value` float NOT NULL, 
`datetime` datetime NOT NULL, 
PRIMARY KEY (`number`), 
UNIQUE KEY `indice_UNIQUE` (`number`) 
) ENGINE=InnoDB AUTO_INCREMENT=100; 

我的外部設備給我的結果:

+DATA: 43 BYTES FROM 0000:0000 (045) 
Machine_8: (T=22.22, HR=42.56, Dw=8.95, VCC=3.64V) 

並使用strtok我得到這些結果的一些值,以將它們保存在數據庫中:

Results: 8, 22.22, 42.56, 8.95, 3.64 

我會喜歡我的表中保存這樣我的數據:

101, 8, 22.22, 2013-06-05 14:03:00 
102, 8, 42.56, 2013-06-05 14:03:00 
103, 8, 8.95, 2013-06-05 14:03:00 
104, 8, 3.64, 2013-06-05 14:03:00 

這是我在我的功能代碼直到現在

int learn_port2(int fd) 
{ 
MYSQL *conn; 
MYSQL_RES *res; 
MYSQL_RES *res1; 
MYSQL_ROW row; 
char *server = "127.0.0.1"; 
char *user = "root"; 
char *password = "***"; // got tot keep my data secret 
char *database = "test"; 

conn = mysql_init(NULL); 
if(!mysql_real_connect(conn, server, user, password, database, 0, NULL, 0)) 
{ 
    fprintf(stderr, "%s\n", mysql_error(conn)); 
    return -1; 
    //finish_with_error(conn); 
} 
int n, i; 
char buff[300]; 
memset(buff, 0, sizeof(buff)); 
for (int x = 0; x<1; x++) 
//for (;;) 
    { 
    char id_machine[35] = ""; 
    char temp[35] = ""; 
    char hum[35] = ""; 
    char dw[35] = ""; 
    char vol[45] = ""; 
    char* ptr; 
    int i,nodo,nodo1; 
    float temp, hum, dw, vcc; 
    n=read(fd,buff,sizeof(buff)); 
    sleep(1); 
    printf("%s", buff); 
    printf("\n"); 

    if (buff[37] == 'N' || buff[38] == 'N' || buff[39] == 'N' || buff[40] == 'N') 
    { 
    ptr = strtok(buff, "Machine_,=T:HR:DW:Vcc()"); 
    i = 0; 

    while (ptr != NULL) 
    { 
     if (i == 9) 
      strcat(id_machine, ptr); // copies Nodo 
     if (i == 10) 
      strcat(temp, ptr); // copies T 
     if (i == 11) 
      strcat(hum, ptr); // copies HR 
     if (i == 13) 
      strcat(dw, ptr); // copies DW 
     if (i == 15) 
      strcat(vol, ptr); // copies Vcc 
     ptr = strtok(NULL, "Machine_,=T:HR:DW:Vcc()"); 
     i++; 
    } 

    printf("Results: %s, %s, %s, %s, %s\n", id_machine, temp, hum, dw, vol); 
    } 


char query[]="INSERT INTO results(`id_machine`,`value`,`valor`) VALUES(id_machine,'14',value)"; 


if(mysql_query(conn, query)) 

{ 
    fprintf(stderr, "%s\n", mysql_error(conn)); 
    return -1; 
} 

res = mysql_use_result(conn); 
} 
} 

如何修改炭查詢[]有結果,我想?或者如果有這樣的例子。

回答

0

爲了讓你可以使用類似下面的參數化查詢...

的例子使用vsnprintf()採取類似格式字符串和參數變量數A的printf後,打印查詢到臨時緩衝然後將緩衝區傳遞給MYSQL查詢。通過這種方式,您可以獲得參數化查詢...

vsnprintf()接受可變參數列表,va_list並且也是緩衝區溢出安全的。

#include <stdio.h> 
#include <stdarg.h> 
#include <string.h> 

#define BUFSTRLEN 255 

/* Returns -1 if the internal buffer was not large enough to hold the formatted 
* string, or a format error occurred. If neither condition occurred then the 
* result of the MYSQL query is returned... */ 
int DoMysqlQuery(MYSQL *conn, char const *printfstring, ...) 
{ 
    int len; 
    va_list args; 
    char buffer[BUFSTRLEN + 1]; 
    memset(buffer, '\0', sizeof(buffer)); 

    va_start(args, printfstring); 
    len = vsnprintf(buffer, BUFSTRLEN, printfstring, args); 
    va_end(args); 

    /* Did the buffer print work ? */ 
    if(len < 0 || len >= BUFSTRLEN + 1) 
     return -1; 

    return mysql_query(conn, buffer); 
} 


int main(int argc, char const *argv[]) 
{ 
    int result; 
    MYSQL mysqlConn = ...; 

    /* Example stuff to send to the function.... */ 
    char *id_machine= "8"; 
    char *value= "1234"; 
    char *valor= "1"; 

    /* Send the query */ 
    result = DoMysqlQuery(
     &mysqlConn, 
     "INSERT INTO results(`id_machine`,`value`,`valor`) VALUES(%s,'%s',%s);", 
     id_machine, value, valor); 

    if(result) 
    { 
     /* handle error etc... *. 
    } 
} 

在這個例子中,將被髮送到mysql_query()查詢字符串是:

INSERT INTO結果(id_machinevaluevalor)VALUES(8, '1234',1);

希望這會有所幫助:)