4

以下は私がtest2.cppで試したコードです

データベースを確認したところ、新しいレコードが追加されていないことがわかりました。私の声明で実際に何が悪かったのですか?

#include <iostream>
#include <sqlite3.h>

//g++ -o test2 test2.cpp -lsqlite3
using namespace std;

int main()
{
int counter = 0;

    sqlite3 *db;
    sqlite3_stmt * stmt;

string username = "panda";
string name = "Kungfu Panda";
string department = "normal";
string password = "hellopassword";

string sqlstatement = "INSERT INTO abe_account (" + username + "," + name + "," + department + "," + password + ");";

    if (sqlite3_open("abeserver.db", &db) == SQLITE_OK)
    {
    sqlite3_prepare( db, sqlstatement.c_str(), -1, &stmt, NULL );//preparing the statement
    sqlite3_step( stmt );//executing the statement
        }
    else
    {
        cout << "Failed to open db\n";
    }

    sqlite3_finalize(stmt);
    sqlite3_close(db);


    return 0;

}

ステートメントが正常に実行されたかどうかを知ることができるかどうかを尋ねたいと思います。追加された1つの行のように、sqlite3からの何らかの形式の確認。そして、エラーが発生した場合、それもカウトアウトすることができますか?

4

3 に答える 3

3

挿入を行うときは、通常、データを提供する順序でフィールドを指定します。それ以外の場合は、すべてのデータを正しい順序で指定する必要があります (定義された順序でテーブル内のすべてのフィールドに値を渡します)。

したがって、構文は不完全です...次のいずれかを行います。

INSERT INTO tablename (field1, field2, field3) VALUES (value1, value2, value3);

またはこれ:

INSERT INTO tablename VALUES (value1, value2, value3)

また、準備されたクエリにデータをバインドしていないため、文字列を引用符で囲む必要があります。pandaユーザー名を単に置き換えるだけでは問題ありません。を供給する必要があります'panda'。したがって、文字列は次のようになります。

"('" + username + "','" + name + "','" + department + "','" + password + "');"

これを台無しにするのは簡単なので (そして、単一引用符などの特殊文字のエスケープ コードがあります)、文字列を引用符で囲む関数を作成することをお勧めします

string quotesql( const string& s ) {
    return string("'") + s + string("'");
}

それで:

"(" + quotesql(username) + "," + quotesql(name) + ...

したがって、最終的には次のようになる可能性があります (フィールド名を想定):

string sqlstatement =
    "INSERT INTO abe_account (username, name, department, password) VALUES ("
    + quotesql(username) + ","
    + quotesql(name) + ","
    + quotesql(department) + ","
    + quotesql(password) + ");";
于 2012-08-14T05:31:26.937 に答える
1

文字列を一重引用符で囲んでみてください。

string sqlstatement = "INSERT INTO abe_account ('" + username + "','" + name + "','" + department + "','" + password + ");";

sqllite には詳しくありませんが、通常、INSERT は次のようになります。

string sqlstatement = "INSERT INTO abe_account (ColumnName1, ColumnName2, ColumnName3, ColumnName4) VALUES ('" + username + "','" + name + "','" + department + "','" + password + "');";
于 2012-08-14T05:18:50.067 に答える
0

はい、なぜ失敗するのかを知ることができます。

「sqlite_exception.h」を含める

この方法に従ってください:

int m = sqlite3_step(stmt);
if(m == SQLITE_BUSY)
{

/* sleep() を使用して遅延させて、もう一度 sqlite3_step を実行してみてください ** / }

if(m == SQLITE_ERROR)
    std::cout(sqlite3_sql(stmt), sqlite3_errmsg(db));
if(m == SQLITE_MISUSE)
    std::cout(sqlite3_sql(stmt), sqlite3_errmsg(db));

これらを見てください: http://www.sqlite.org/c3ref/c_abort.html

于 2012-08-14T05:41:51.500 に答える