1

データベースを作成するための長いトランザクションを含む sql (テキスト ファイル) があります。

これには Kompex sqlite c++ ライブラリを使用しています。

// open database
Kompex::SQLiteDatabase *pDatabase = new Kompex::SQLiteDatabase(CT2A(strDBFilename), SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, 0);

// create statement instance for sql queries/statements
Kompex::SQLiteStatement *pStmt = new Kompex::SQLiteStatement(pDatabase);

strSQLCreateDB=get_file_contents(strSQLFilename).c_str(); // load the SQL file

try {
    pStmt->Sql(strSQLCreateDB);
    pStmt->ExecuteAndFree();        
} catch(Kompex::SQLiteException &exception)
{
    std::cerr << "Exception Occured" << std::endl;
    exception.Show();
}

pDatabase->Close();

データベースは 0 バイトでエラーなしで作成されます。データベースを作成するこのSQLトランザクションを実行するために、kompexライブラリがなくてもサンプルコードに興味があります。

sqlite ブラウザーからデータベースを実行すると、エラーなしでデータベースが作成されます。

これは SQL コマンド ファイルの一部です。

/* Disable Foreign Keys */
pragma foreign_keys = off;
/* Begin Transaction */
begin transaction;

/* Database [scanlog(1)] */
pragma auto_vacuum=0;
pragma encoding='UTF-8';
pragma page_size=1024;

/* Drop table [ApplicationNames] */
drop table if exists [ApplicationNames];

/* Table structure [ApplicationNames] */
CREATE TABLE [ApplicationNames] (
  [Id] INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, 
  [ApplicationName] TEXT, 
  [Icon] TEXT);
CREATE INDEX [IndexApps] ON [ApplicationNames] ([Id], [ApplicationName]);

/* Data [ApplicationNames] */
insert into [ApplicationNames] values(1, 'Windows System', null);
insert into [ApplicationNames] values(2, 'Internet Explorer', null); 
insert into [ApplicationNames] values(3, 'Google Chrome', null);

/* Commit Transaction */
commit transaction;

/* Enable Foreign Keys */
pragma foreign_keys = on;
4

3 に答える 3

1

問題は、関数Sqlと関数が文字列の最初のSQL コマンドsqlite3_prepareのみを実行することです。

文字列で複数のコマンドを実行するには、次を使用する必要がありますsqlite3_exec

if (SQLITE_OK != (ret = sqlite3_open_v2(CT2A(strDBFilename), &pDb, SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, NULL)))
{
    TRACE("Failed to open SQLite conn: %d\n", ret);
    break;
} 

if (SQLITE_OK != (ret = sqlite3_exec(pDb, CT2A(strSQLCreateDB), NULL, 0, NULL)))
{
    TRACE("Failed to execute SQLite script: %d, %s\n", ret, sqlite3_errmsg(pDb));
    break;
}
于 2013-11-09T08:51:51.790 に答える
0

これはうまくいくようです:

// open connection to a DB
    if (SQLITE_OK != (ret = sqlite3_open_v2(CT2A(strDBFilename), &pDb, SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, NULL)))
    {
        TRACE("Failed to open SQLite conn: %d\n", ret);
        break;
    } 

    // prepare the statement
    if (SQLITE_OK != (ret = sqlite3_prepare_v2(pDb, CT2A(strSQLCreateDB), -1, &query, NULL)))
    {
        TRACE("Failed to prepare SQLite script: %d, %s\n", ret, sqlite3_errmsg(pDb));
        break;
    }

    if (SQLITE_OK != (ret=sqlite3_exec(pDb, CT2A(strSQLCreateDB), NULL, 0, NULL)))
    {
        TRACE("Failed to execute SQLite script: %d, %s\n", ret, sqlite3_errmsg(pDb));
        break;
    }
于 2013-11-09T01:35:23.957 に答える