2013-06-19 31 views
1

我用mysql寫了一個用c語言編寫的程序。 它不能正常工作。mysql與c程序

我創建了一個連接功能,可幫我連接mysql

MYSQL *ts_mysql_connect(char *host, char *user, char *pass, char *database) 
{ 

MYSQL *conn = mysql_init(NULL); 
fprintf(stderr, "[ts_mysql_connect] conn-> %ld\n", conn); 
if (!mysql_real_connect(conn, host, user, pass, database, 0, NULL, 0)){ 
    fprintf(stderr, "%s\n", mysql_error(conn)); 
    exit(1); 
} 

//set auto commit to false 
if (mysql_autocommit(conn, 0)) 
    fprintf(stderr, "%s\n", "SET MYSQL autocommit to off faild!"); 
fprintf(stderr, "[ts_mysql_connect] conn-> %ld\n", conn); 
return conn; 

} 

我用下面的代碼下面調用我的函數

MYSQL *test; 
    test = ts_mysql_connect(conf->run_conf->mysql_host, 
            conf->run_conf->mysql_user, 
            conf->run_conf->mysql_pass, 
            conf->run_conf->mysql_database); 
    conf->mysql_start = time(NULL); 
    if (verbose) 
     fprintf(stderr, "[ts_mysql_insert] mysql conn init at %ld\n", 
              &test); 
    exit(1); 

我DONOT知道康恩爲什麼ts_mysql_connect返回不同的地址。

運行日誌:

[ts_mysql_connect] conn-> 140065527302336 
[ts_mysql_connect] conn-> 140065527302336 
[ts_mysql_insert] mysql conn init at -1946154816 

所以在[ts_mysql_insert]爲什麼MYSQL *conn和[ts_mysql_connect]有不同的地址

+1

'&test' =指向連接的變量的地址!='MYSQL *' – RandomSeed

回答

0

你沒有第二方案申報ts_mysql_connect函數原型,所以編譯器假定該函數返回一個int類型。

如果使用-Wall指令,以使所有的警告,你會看到這樣的警告消息:

warning: implicit declaration of function ‘ts_mysql_connect’ 
0
#include <stdio.h> 
#include <stdlib.h> 
#include <my_global.h> 
#include <mysql.h> 

MYSQL *DatabaseConnection; 
const char *ServerName = "192.168.1.12"; 
const char *User = "dbuser"; 
const char *Password = "dbpassword"; 
const char *Name = "test"; 
const char *DB_Socket_Path = "/var/run/mysqld/mysql.sock"; 

int execute_db_query(const char *sql_query) 

{ 
    MYSQL_RES *result = NULL; 
    MYSQL_ROW row; 
    int num_fields; 
    int i; 

    if (!DatabaseConnection) 
     return -1; 

    mysql_query(DatabaseConnection, sql_query); 

    result = mysql_store_result(DatabaseConnection); 

    if(result == NULL) 
    { 
     mysql_free_result(result); 
       return -1; 
    } 

    if (!result->eof) { 
     mysql_free_result(result); 
     return -1; 
    } 

    num_fields = mysql_num_fields(result); 

    int f_count = result->field_count; 
    int index =1 ; 
    while ((row = mysql_fetch_row(result))) { 
     for (i = 0; i < num_fields; i++) { 
      printf("%s ", row[i] ? row[i] : "NULL"); 

     } 
     printf("\n"); 
     index++; 

    } 


    mysql_free_result(result); 

    return 0; 
} 
void close_db_connection() { 
    mysql_close(DatabaseConnection); 
    mysql_library_end(); 
} 
int init_connect() { 

    DatabaseConnection = mysql_init(NULL); 
    printf("MySQL client version: %s\n", mysql_get_client_info()); 

    if (!mysql_real_connect(DatabaseConnection, ServerName, User, Password, 
      Name, 0, DB_Socket_Path, 0)) { 
     puts(mysql_error(DatabaseConnection)); 
     close_db_connection(); 

     return -1; 
    } 

    printf("Host : %s \n", mysql_get_host_info(DatabaseConnection)); 
    printf("Server : %s: \n", mysql_get_server_info(DatabaseConnection)); 
    printf("Protocol : %d\n", mysql_get_proto_info(DatabaseConnection)); 

    return 0; 
} 

int main(void) { 
    puts("SQL Example"); 
    init_connect() ; 
    execute_db_query("select * from test"); 
    return EXIT_SUCCESS; 
} 

我看你使用套接字更少的連接,所以你可以在這種情況下傳遞NULL。