我们试图从文件中获取数据并将其插入到具有此表格格式的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; –