ファイルからデータを取り出し、それをこのテーブル形式の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++を嫌う主な理由は、それは自然に読めません。あなたのコードのどこに行/行の定義/宣言がありますか? –
ええ、申し訳ありませんが、これは宣言です:MYSQL * conn = mysql_init(nullptr); MYSQL_RES * res = nullptr; MYSQL_ROW row = nullptr; –