BCBでSQLite操作

このQ&Aのポイント
  • BCB5からSQLite3を操作するためのコンパイルエラー対処法とは?
  • TEdit1に郵便番号を入力し、Button1クリックで該当住所を表示するプログラムの謎エラー
  • BCBでSQLite3を扱う際の注意点とは?
回答を見る
  • ベストアンサー

BCBでSQLite操作

下記のサイトを参考にさせて頂き、BCB5からSQLite3を操作しようと格闘中です。 http://members.jcom.home.ne.jp/komina/wiki/4243422F53514C69746533A4F2BBEEA4B9.html TEdit1に郵便番号7桁を入力して、Button1クリックでMemo1に該当住所等を表示するものですが コンパイルエラーが発生して対処法がわかりません。ご教授お願いいたします。 ちなみに、そこで紹介されているライブラリのリンクが上手くいかないので sqlite3.cをプロジェクトに追加してメイクしております。 また、別のサイトではUTF-8を使わないといけない様なことも書いてありました。 エラー内容は、 E2034 'int(*(_closure)(void*,int char**,char**))(void*,int,char**,char**)'型は'int(*)void*,int,char**,char**)'型に変換できない E2342 パラメータ'callback'はint(*)(void*,int,char**,char**)型として定義されているのでvoidは渡せない 以下、ソース抜粋です。 int TFmMain::callback(void* arg,int argc,char** argv,char** column){ AnsiString addr1=argv[0]; AnsiString addr2=argv[1]; AnsiString addr3=argv[2]; add_message(addr1+addr2+addr3); return SQLITE_OK; } void __fastcall TFmMain::Button1Click(TObject *Sender) { sqlite3* db; if(sqlite3_open("DBTEST1.db",&db)==SQLITE_OK){ add_message("DB open"); int rtn; char* sql; sql=sqlite3_mprintf("SELECT ADDR1,ADDR2,ADDR3 FROM ZIP WHERE ZIP=%d" ,StrToInt(Edit1->Text)); add_message(sql); rtn=sqlite3_exec(db,sql,callback,NULL,NULL); <<< ここでエラー発生します!! if(rtn!=SQLITE_OK){ add_message("COMMAND err"); } sqlite3_free(sql); sqlite3_close(db); add_message("DB close"); }else{ add_message("DB open err"); } }

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

> 具体的にはどのように直せばいいんでしょうか? callback巻子をstaticメンバにする。

yoshiyossy
質問者

お礼

遅くなりましたが、ありがとうございます。 私の乏しい知識ではうまくいかない様です。

yoshiyossy
質問者

補足

できたようです。 Main.cppに void add_message(AnsiString msg){ FmMain->Memo1->Lines->Add(msg); } static int callback(void* arg,int argc,char** argv,char** column){ AnsiString addr1=argv[0]; AnsiString addr2=argv[1]; AnsiString addr3=argv[2]; ~ } とし、Main.hのextern部に両方宣言するとうまくいきました。

その他の回答 (1)

回答No.1

callbackが 非-staticなメンバ関数だから。

yoshiyossy
質問者

お礼

度々ありがとうございます。 一回目の質問は削除依頼出しときました。 具体的にはどのように直せばいいんでしょうか?

関連するQ&A

  • BCBでSQLite

    下記のサイトを参考にさせて頂き、BCB5を使用してSQLite3を操作しようと格闘中です。 自分のレベル的には初心者を脱しようかといったところだと思います。 http://members.jcom.home.ne.jp/komina/wiki/4243422F53514C69746533A4F2BBEEA4B9.html TEdit1一つに郵便番号7桁を入力して、Button1クリックで該当する住所を検索してMemo1に表示するものですが、コンパイルエラーになってしまい対処法がわかりません。 ちなみにそこで紹介されている、ライブラリをリンクするのが上手くいきませんで sqlite3.cをプロジェクトに追加してメイクしました。 また、文字コードをUTF-8に変換するというのが別サイトにも書かれていました エラー内容は、 E2034 'int(*(_closure))(void *,int,char**,char**))(void*,int char**,char**)'型は'int(*)(void*,int,char**,char**)'型に変換できない。 E2342 パラメータ'callback'はint(*)(void*,int,char**,char**)型として定義されているのでvoidは渡せない 以下、ソース抜粋です。宜しくご教授お願いいたします。 int TFmMain::callback(void* arg,int argc,char** argv,char** column){ AnsiString addr1=argv[0]; AnsiString addr2=argv[1]; AnsiString addr3=argv[2]; add_message(addr1+addr2+addr3); return SQLITE_OK; } void __fastcall TFmMain::Button1Click(TObject *Sender) { sqlite3* db; if(sqlite3_open("DBTEST1.db",&db)==SQLITE_OK){ add_message("DB open"); int rtn; char* sql; sql=sqlite3_mprintf("SELECT ADDR1,ADDR2,ADDR3 FROM ZIP WHERE ZIP=%d" ,StrToInt(Edit1->Text)); add_message(sql); rtn=sqlite3_exec(db,sql,callback,NULL,NULL); <<< ここでエラー発生!! if(rtn!=SQLITE_OK){ add_message("COMMAND err"); } sqlite3_free(sql); sqlite3_close(db); add_message("DB close"); }else{ add_message("DB open err"); } }

  • SQlite

    SQLiteを使って メールを保存するデータベースを作っています。 以下のようになっています。  さらに、 アドレス帳を作りたいのですが 新たにデータベースを開くのか 同じデータベースで別のテーブルを開けばよいのかわかりません。 ご存知の方よろしくお願いします。 また、 C++からSQLiteを扱う上での参考書などもありましたら 教えてください。 rc = sqlite3_open(".\\mailbox\\SQMail.db", &db); if( rc ){ AfxMessageBox("Can't open database:", MB_OK); sqlite3_close(db); return; } rc = sqlite3_exec(db, "create table MailTbl (id INTEGER PRIMARY KEY, attach varchar(20), subject varchar(120),addressfrom varchar(80),addressto varchar(80),date varchar(80),size integer,priority integer, read integer, state integer, alldata blob);", callback, 0, &zErrMsg); if( rc!=SQLITE_OK ){ // AfxMessageBox("SQL error:", MB_OK); sqlite3_free(zErrMsg); }

  • sqlite_open()なんですが

    PHPで <?php $db=sqlite_open("rensyuu.sqlite",0666,$err); $row=sqlite_query($db,"select count(*) from sqlite_master where name='tb1';"); $kotae=sqlite_fetch_single($row); print($kotae); sqlite_close($db); ?> と打ったものを実行したら、 Warning: sqlite_open() [function.sqlite-open]: file is encrypted or is not a database in.... というエラーになりました。 どうもsqlite3で作ったのが原因っぽいんですがなにか ご存知でしたら教えていただけませんか。

  • 質問させてください(かなり長いです)

    int main(int argc,char *argv[]) { if(argc != 3){ char err_message[] = "ファイル名を指定して下さい、またはファイル名が多すぎる\n"; write(2,err_message, strlen(err_message)); exit(EXIT_FAILURE); } char *InFile = argv[1]; /*入力ファイル名設定*/ char *OutFile = argv[2]; /*出力ファイル名設定*/ myclass ob(InFile,OutFile); ob.open(); ob.main(); ob.close(); return(0); } このようなソースがありif(arg=!3)のところを実行して終了してしまいます。よくint main(int argc,char *argv[])という書き出しを見ますがmainの引数はどこで使われているのでしょうか。よろしければご教授ください。

  • SQLiteのデータベースについて

    PHP初心者です。以下のSQLiteより作成するデータベースについて教えてください。 $DB = sqlite_open('db1.db'); $sql="create table tables(id integer ,name,texts)"; $result=sqlite_query($db,$SQL); 上記、プログラムにより、同ディレクトリに、db1.dbが作成されますが、このデータベース情報はどのようにして、閲覧するのでしょうか(MS-ACCESS、SQLのように簡単に閲覧できないのか)。主キーやテーブルの名前またはフィールドの名前の変更、データ一覧閲覧などどのようにするのでしょうか。 環境は、Windows環境で、PHP4を使用しております。 よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • 関数の引数の書き方。

    AとBのどちらの書き方でもよいのですか? 私が読んだ本(やさしいC)には、 Aパターンのみだったような? Aパターン ------------------ void main(int argc,char *argv[]) { int i; ・・・・ } Bパターン ------------------ void main(argc, argv) int argc; char *argv[]; { int i; ・・・・ } http://ash.jp/db/ora_c.htm

  • SQLite3:: escapeString使用法

    SQLite3クラスのメソッドescapeStringを使って、 SQL文の中に挿入する文字列の 浄化(SQLインジェクション対策)をする場合の、 一般的な作法について教えて下さい。 例えば、 //----------------------- //エスケープしたい文字列 $var= "Let's"; //オープンするデータベース $db= ":memory:" $obj = new SQLite3($db); $tmp = $obj->escapeString($var); $db->close(); //----------------------- こんな感じで使おうとしていますが、 「オープンするデータベース」の所が、 ちょっと理解できていません。 とりあえず文字列の浄化だけを行いたい場合には、 必ずしも、DBをオープンする必要はないと思いますので、 オープンするDBなんて、ないですよ! ということで、 :memory: を指定していたりしますが、 この辺りの正しい作法について、どなたか教えて下さい。

    • ベストアンサー
    • PHP
  • C言語で自作したcpコマンドが上手く動作しません

    当方、プログラミングを勉強中の学生です。 先日、ファイル入出力関数を用いてcpコマンドを自作しました。 一応、コンパイルは通るのですが、コピーしたファイルを開くことができません。 そのファイルのパーミッションを確認してみたところ 「----------」となっており、読み書き実行すべて不可となっていました。 ソースは以下の通りなのですが、何が問題でしょうか。 回答よろしくお願い致します。 #include<stdio.h> #include<fcntl.h> #include <string.h> #include <errno.h> #include <sys/types.h> #include <sys/uio.h> #include <unistd.h> #define SIZE 8192 int main(int argc, char *argv[]) { int fd1, fd2; char buf[SIZE]; if ( argc != 3 ){ char err_message[] = "ファイル名を指定して下さい。\n"; write(2, err_message, strlen(err_message)); return 1; } argv[0] = "mycopy"; fd1 = open(argv[1], O_RDONLY); fd2 = open(argv[2], O_WRONLY | O_CREAT); if (fd1 < 0 || fd2 < 0) { char err_message[] = "ファイルをオープンできません。"; write(2, err_message, strlen(err_message)); write(2, strerror(errno), strlen(strerror(errno))); write(2, "\n", 1); return 1; } while(1) { if (read(fd1, buf, SIZE) == 0) { break; } else if (read(fd1, buf, SIZE) > 0) { write(fd2, buf, SIZE); } else { char err_message[] = "エラーが発生しました。"; write(2, err_message, strlen(err_message)); write(2, strerror(errno), strlen(strerror(errno))); write(2, "\n", 1); return 1; } } close(fd1); close(fd2); return 0; }

  • SQLiteでたまにアクセスログが取れない

    PHPが使えないサーバーにあるホームページのアクセスログを取得するため、 JavaScriptを使ってPHPが使えるレンタルサーバーに飛び、 PHP+SQLite2でアクセスログを集計していました。 最近パソコンを買い替えたのを機にPHPをVersion 5.4.8にアップデートしたところ、 ローカル環境でSQLite2が使えなくなり、この際pdo_sqliteにプログラムを書き換えました。 レンタルサーバーではSQLite2 がまだ使えるため、以前のプログラムはそのままにして SQLite2 とPDO両方でログをとってみました。 するとSQLite2では取れているのにPDOでは取れていない、 逆にPDOでは取れているのにSQLite2では取れていないログがあることに気が付きました。 (詳しくは下記の画像をご覧ください 赤丸がついているものが他方にはないログです) https://box.yahoo.co.jp/guest/viewer?sid=box-l-oolzr4jkzfiedw4zavuldosoha-1001&uniqid=12bc9230-5e96-41fb-b00e-271a1aa79397&viewtype=detail#du%3D12bc9230-5e96-41fb-b00e-271a1aa79397%26ds%3Dbox-l-oolzr4jkzfiedw4zavuldosoha-1001%26tu%3D12bc9230-5e96-41fb-b00e-271a1aa79397%26ts%3Dbox-l-oolzr4jkzfiedw4zavuldosoha-1001%26vt%3Dpublic%26lf%3Dlist%26ls%3D1%26lm%3D20%26il%3D1 何が問題なのでしょうか? プログラム? SQLite? PHP? サーバー? 閲覧者のブラウザ? また回避法をご存知でしたらご教授願います。 (log.js) ref =document.referrer; var qword=""; if(ref.indexOf("?")!=-1){ ref2=ref.split("?"); query=ref2[1].split("&"); qword="?qword="; for (i=0; i<query.length; i++){ qword+=query[i]+"*"; } ref=ref2[0]; } document.write('<script src=" http://○○○/log2.php?ref='+ ref + qword +'"></script>'); document.write('<script src=" http://○○○/log.php?ref='+ ref + qword +'"></script>'); (log.php) <?php $referer = stripslashes($_GET['ref']); $d=date_create(); $date=date_format($d,"Y/m/d"); $time=date_format($d,"H:i:s"); $day=date_format($d,"w"); $referer=sqlite_escape_string($referer); $url=sqlite_escape_string($_SERVER['HTTP_REFERER']); $accept_language=sqlite_escape_string($_SERVER['HTTP_ACCEPT_LANGUAGE']); $remote_addr=sqlite_escape_string($_SERVER['REMOTE_ADDR']); $user_agent=sqlite_escape_string($_SERVER['HTTP_USER_AGENT']); $db=sqlite_open("log.sqlite"); $sql="INSERT INTO log_table ( log_date, log_time, log_day, log_url, log_referer, log_language, log_remote_addr, log_user_agent) VALUES( '$date', '$time', $day, '$url', '$referer', '$accept_language', '$remote_addr', '$user_agent')"; sqlite_query($db,$sql); sqlite_close($db); (log2.php) <?php $referer = stripslashes($_GET['ref']); $d=date_create(); $date=date_format($d,"Y/m/d"); $time=date_format($d,"H:i:s"); $day=date_format($d,"w"); $db=new PDO("sqlite:/home/○○○/www/log.sqlite3",null,null); $referer=$db->quote($referer); $url=$db->quote($_SERVER['HTTP_REFERER']); $accept_language=$db->quote($_SERVER['HTTP_ACCEPT_LANGUAGE']); $remote_addr=$db->quote($_SERVER['REMOTE_ADDR']); $user_agent=$db->quote($_SERVER['HTTP_USER_AGENT']); $sql="INSERT INTO log_table ( log_date, log_time, log_day, log_url, log_referer, log_language, log_remote_addr, log_user_agent) VALUES( '$date', '$time', $day, $url, $referer, $accept_language, $remote_addr, $user_agent)"; $res=$db->prepare($sql); $res->execute(); $db=null; レンタルサーバーの環境 さくらインターネット PHP Version 5.2.17 Apache/1.3.42 (Unix) mod_ssl/2.8.31 OpenSSL/0.9.8e SQLite 2.8.17 pdo_sqlite 3.3.7

    • 締切済み
    • PHP
  • SQLiteってcloseする必要あるんですか?

    1.タイトルの通りなんですが、closeする必要ってあるんでしょうか? 2.PHP+SQLiteでWEBページを作成しているんですが、 SQL文を発行するたびにopenしていますが、最初にOPENしてしまえば 各SQL文発行時にopenする必要って無いのでしょうか? 3.closeを入れると、下記のようなエラーが・・・原因が分かりません・・・orz 「Warning: sqlite_close() expects parameter 1 to be resource, boolean given in C:\xampp\htdocs\php\dev\wedding\add.php on line 51」 有識者の方がおられたら、ご教授お願いいたしますm(__)m

専門家に質問してみよう