こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

SQLite C/C++ でのテーブル数の取得

よろしくお願いします。
 テーブル名「TB1332」の有無を確認するSQL 文をこのようにしました
select count(*) from sqlite_master where type='table' and name='TB1332';

PupSQLite でのcount(*)の値
当該テーブルが存在する場合1
当該テーブルが存在しない場合0
このように正しい結果が得られます。

しかし、Visul Studio 2010 C++ で下記のコードを実行しますと、result の値は、テーブルの有無に関係なく、常に0となります。
int result = sqlite3_exec(pDb, "select count(*) from sqlite_master where type='table' and name='TB1332';", NULL, NULL, &err);

C/C++ で該当する、テーブル数を取得するコードの書き方を教えていただけないでしょうか。

環境
C/C++
Visual Studio 2010 Proffesional
SQLite3
PupSQLitehttps://www.eonet.ne.jp/~pup/software.html

投稿日時 - 2012-01-03 12:02:27

QNo.7222530

すぐに回答ほしいです

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

http://idocsq.net/page/514
「sqlite3_exec」の戻り値は正常終了が0で異常終了がそれ以外なので、SELECT文が正常に行われていれば常に0が返ります。

cygwin環境ですが以下のようにすれば、テーブルがあるかどうか判断できました。

#pragma comment( lib, "sqlite3.lib" )

#include <sqlite3.h>
#include <stdio.h>

// 抽出結果が返るコールバック関数
static int callback(void *NotUsed, int argc, char **argv, char **azColName){
int i;
for(i=0; i<argc; i++)
printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");
return SQLITE_OK;
}

int main(int argc, char* argv[])
{
sqlite3 *db;
char *zErrMsg = 0;

// データベースファイルを新規生成
int rc = sqlite3_open("Sample.db", &db);


rc = sqlite3_exec(db, "SELECT count(*) from sqlite_master where type='table' and name='sample'", callback, 0, &zErrMsg);

// データベースを閉じる
sqlite3_close(db);
return 0;
}

投稿日時 - 2012-01-04 13:47:09

お礼

nora1962さん。お世話になります
その後当方も調べ、下記のような方法でもテーブルの有無が確認できたことを合わせて、掲示しておきます。
Visual Studio 2010 C/C++ でnora1962さんのコードも正しく検証できました。
ありがとう御座いました。

#pragma comment( lib, "sqlite3.lib" )

#include "sqlite3.h"
#include <stdio.h>

int main(int argc, char* argv[])
{
sqlite3 *db;
char *zErrMsg = 0;
sqlite3_stmt *statement;
int rc;
// データベースファイルを新規生成
rc = sqlite3_open("Sample.db", &db);

rc = sqlite3_exec(db, "CREATE TABLE 'sample' (NUM INTEGER PRIMARY KEY, NAME TEXT);", NULL, NULL, &zErrMsg );

sqlite3_prepare_v2(db, "select count(*) from sqlite_master where type='table' and name='sample';", -1, &statement, NULL);

zErrMsg = sqlite3_errmsg(db);

while (sqlite3_step(statement) == SQLITE_ROW) {
rc = sqlite3_column_int(statement, 0);
}
printf("%d\n", rc);
sqlite3_finalize(statement);

// データベースを閉じる
sqlite3_close(db);

return 0;
}

投稿日時 - 2012-01-06 17:32:50

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.1

テーブル名を登録した、新しいテーブルを作られてはいかがでしょうか。

基本的にテーブルはあることが前提なので、
テーブルがあるかどうか確認する処理に無理があるような気がします。

投稿日時 - 2012-01-03 12:52:45