dポイントプレゼントキャンペーン実施中!

C APIを用いて、MYSQLにテキストファイルの中身を格納したいと考えています。
以下のプログラムのように一度ファイルの中身をchar型配列に書き出し、配列の中身をクエリにコピーというようにすると、ファイルの大きさに合わせて、非常に大きな配列を確保しなければならないと思います。

int main(void){
MYSQL mysql;
char query[1000];
char buf[1000];
FILE *fp;

fp = fopen("test.txt", "r");

mysql_init(&mysql);

if(!mysql_real_connect(&mysql,ホスト名,ユーザ名,パスワード,DB名,0,NULL,0)){
//エラー処理
}

fread(buf, sizeof(char), sizeof(buf), fp );

sprintf(query, "insert into DB名 values(buf));

mysql_real_query(&mysql, query, strlen(query));

}

これではメモリの無駄遣いなので、他の方法として、
1.データを分割して複数回に分けて挿入する
2.テキストファイルから直接読み込む
を考えました。

しかし
1.は方法が分からず、
2.はリダイレクトを使えばできると思ったのですが、リダイレクトでは
 テキストファイルにSQLコマンドも記入しておく必要があると思うの で、今回の方法には合いません。

MYSQLのフィールドにC言語から大きいデータを書き込むよい方法があれば教えてください。さらには、読み出し方まで教えていただけると助かります。
よろしくお願い致します。

A 回答 (1件)

主目的は、「C APIを使用すること」でしょうか?それとも、「MySQLにテキストデータを格納すること」でしょうか?



後者であれば、アプリケーションのメモリに溜め込まなくても、格納はinsert文でload_file関数を使用、検索はselect文でinto outfileで吐き出すことが可能です。

ちなみに、SQL99で「ロケータ」というデータそのものでなく、ポインタで操作する機能が規定されており、それがMySQLでも実装されれば今回のような操作も軽くなるのですけどね。
    • good
    • 0
この回答へのお礼

教えていただいたload_file関数、into outfileを用いて書き込み、読み出しできました!ありがとうございました!!

ファイルサイズが大きすぎるというエラーが出ましたが、max_allowed_packet変数を書き換えることで対応できました。

ただ調べてみたところ、ファイルだけでなくディレクトリにも誰でも読み書きできる権限を与える必要がある、サーバ-クライアント形式のシステムにした場合にファイルを一度サーバ側にコピーしなくてはならないなど、あまり使い勝手がよい関数とは言えないようですね。。

お礼日時:2007/09/12 17:48

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!