我们试图从一个文件中获取数据并将其插入到一个mysql表中,然后检索数据并将其放回原始文件中的数据格式。这就是我们如何创建表。
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;
2条答案
按热度按时间46scxncf1#
对于
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库,而
NULL
在c++中被定义为0
*,所以这就是为什么你在数据库中得到NULL
值的原因。解决这个问题的唯一方法是使用列类型的知识来确定它是
0
(integer)还是NULL
值,但是对于NULL
整数值,您无法知道它。如果可以的话,使用一个准备好的语句并测试
MYSQL_BIND
结构的is_null
成员,或者用c编写整个代码,因为这是一个c库。nullptr
。ymdaylpp2#
我通常是这样的
并检查
因此您可以区分是字符串(长度为1)、空字符串(长度为)还是NULL(两者都为)
但是,是的,API是糟糕的,应该有一个更好的方法