2017-03-16 139 views
1

我們試圖從文件中獲取數據並將其插入到具有此表格格式的mysql表中。然後稍後檢索數據並將其恢復爲與原始文件中的數據相同的格式。這是我們如何創建表格。MySQL C API爲NULL值返回零而不是NULL

create_query = "CREATE TABLE IF NOT EXISTS "; 
string date = "20170223"; 
string table_format = " (IDpk INT NOT NULL auto_increment," 
         " symbol CHAR(8) NOT NULL," 
         " number_1 BIGINT unsigned DEFAULT NULL," 
         " number_2 BIGINT unsigned NOT NULL," 
         " PRIMARY KEY(IDpk))"; 

這就是我們如何創建插入數據庫的字符串。

uint32_t item_type = stoi(tokens[2]); 
     query = insert_query; 

     switch(item_type) 
     { 
     case 0: //bid 
     case 1: //ask 
     {   "###,%s,%s," 
        "NULL," 
        "%s,%s", 
        tokens[0], tokens[1], tokens[2]); 
      break; 
     } 

然後我們將數據傳遞給這個函數,我們將數據插入表中。

void read_in_data(string date, string file, MYSQL* conn) 
{ 
string query = "LOAD DATA INFILE " + file + 
       "INTO TABLE " + date + 
       "FIELDS TERMINATED BY ','" 
       "LINE STARTING BY '###'"; 

mysql_query(conn, query.c_str()); 
} 

當我們試圖從數據庫中取回數據並將其重新格式化爲原始輸入文件時,會出現此問題。我們注意到我們的NULL值由0表示而不是NULL。我們很好奇如何插入它們以使它們爲NULL而不是0.這是我們目前的提取方法。

ofstream out_file; 
out_file.open("test.txt", fstream::in); 
if(out_file.good()) 
{ 
    res = mysql_store_result(conn); 
    int num_fields = mysql_num_fields(res); 
    while((row = mysql_fetch_row(res))) 
    { 
    unsigned long * lengths; 
    lengths = mysql_fetch_lengths(res); 
    for(int i = 0; i < num_fields; i++) 
    { 
     if(row[i]) 
     { 
     out_file << row[i] << " "; 
     } 
    } 
    out_file << endl; 
    } 
}else 
cout << strerror(errno) << endl; 

回答

0

對於NULL值,則需要從檢查的結果is_null,相信MYSQL_BIND結構。

由於你的情況,你正在使用mysql_fetch_row()I recommend reading this

值的行數由mysql_num_fields(result)給出。如果row將呼叫的返回值保存爲mysql_fetch_row(),則指向該值的指針將被訪問爲row[0]row[mysql_num_fields(result)-1]NULL行中的值由NULL指針指示。

正如你所看到的,問題是,這是一個C庫,並在C NULL ++定義爲0*,所以這就是爲什麼你得到0在數據庫中的NULL值。

解決這個問題的唯一辦法,就是用列類型的知識,以確定它是否是一個0整數)或NULL值,但對於NULL整數值,你沒有辦法知道。

如果可以,請使用準備好的語句並測試MYSQL_BIND結構的is_null成員,或者將整個事件寫入c中,因爲這是一個c庫。


*我想這就是爲什麼新標準建立的nullptr

+0

我們在代碼中沒有使用mysql_stmt_bind_result()或mysql_stmt_fetch(),所以有什麼方法可以在我們當前正在使用的循環中測試NULL,還是必須以這種方式綁定結構?我們試圖從文檔中做到這一點:https://dev.mysql.com/doc/refman/5.7/en/mysql-fetch-row.html –

+0

@ShakeyJay你看,我討厭C++的主要原因是因爲這自然是不可讀的。你的代碼中的任何地方是否有'row'的定義/聲明? –

+0

對不起,不包括它,但這是聲明:MYSQL * conn = mysql_init(nullptr); MYSQL_RES * res = nullptr; MYSQL_ROW row = nullptr; –