我們試圖從文件中獲取數據並將其插入到具有此表格格式的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;
我們在代碼中沒有使用mysql_stmt_bind_result()或mysql_stmt_fetch(),所以有什麼方法可以在我們當前正在使用的循環中測試NULL,還是必須以這種方式綁定結構?我們試圖從文檔中做到這一點:https://dev.mysql.com/doc/refman/5.7/en/mysql-fetch-row.html –
@ShakeyJay你看,我討厭C++的主要原因是因爲這自然是不可讀的。你的代碼中的任何地方是否有'row'的定義/聲明? –
對不起,不包括它,但這是聲明:MYSQL * conn = mysql_init(nullptr); MYSQL_RES * res = nullptr; MYSQL_ROW row = nullptr; –