2017-03-16 10 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の値は、あなたは私がMYSQL_BIND構造を信じて、その結果からis_nullをチェックする必要があります。

あなたのケースでは、あなたがmysql_fetch_row()を使用しているので、I recommend reading this

は、行の値の数はmysql_num_fields(result)で与えられます。 rowmysql_fetch_row()への呼び出しからの戻り値を保持する場合、値へのポインタはrow[0]からrow[mysql_num_fields(result)-1]としてアクセスされます。 NULLの値はNULLポインターで示されます。

あなたが見ることができるようには、問題は、これはCライブラリで、あなたは、データベース内のNULL値に対する0を得ている理由ですので、C言語でNULLが++、*0として定義されていることです。

これを回避する唯一の方法は、それが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++を嫌う主な理由は、それは自然に読めません。あなたのコードのどこに行/行の定義/宣言がありますか? –

+0

ええ、申し訳ありませんが、これは宣言です:MYSQL * conn = mysql_init(nullptr); MYSQL_RES * res = nullptr; MYSQL_ROW row = nullptr; –

関連する問題