0

さて、コードには2つのメソッドがあります。1つはデータベースを作成するためのもので、もう1つはレコードを挿入するためのものです。はい、どうぞ:

void DatabaseManager::insert_entry_into_database() {
ostringstream ss;
int choice;

do {
    cout << "Press 1 to add a teacher or 2 for student";
    cin >> choice;
} while (choice != 1 && choice != 2);       

if (choice == 1) {
    Teacher t;
    ss << "INSERT INTO Teachers ('" << t.get_firstName() << "', '" << t.get_lastName() << "', " << t.get_NID() 
        << ", " << t.get_avg_horarium() << ");";
}

const string tmp = ss.str();
const char *query = tmp.c_str();

cout << query;

sqlite3_open("Database.sqlite", &database);
if (sqlite3_prepare_v2(database, query, -1, &statement, 0) == SQLITE_OK) {
    cout << "A new record has been added to the database!" << endl;
}
else {
    cout << "Error adding new record!";
}   
sqlite3_finalize(statement);
sqlite3_close(database); 
}

void DatabaseManager::create_database() {
sqlite3_open("Database.sqlite", &database);

char * query = "CREATE TABLE Students (firstName STRING, lastName STRING, NID BIGINT, grade DOUBLE);";

if (sqlite3_prepare_v2(database, query, -1, &statement, 0) == SQLITE_OK) {
    cout << "Empty database with students created!" << endl;
}

query = "CREATE TABLE Teachers (firstName STRING, lastName STRING, NID BIGINT, avg_horarium INT);";

if (sqlite3_prepare_v2(database, query, -1, &statement, 0) == SQLITE_OK) {
    cout << "Empty database with teachers created!" << endl;
}

sqlite3_finalize(statement);
sqlite3_close(database);

}

私はそれらをmain関数でテストします:

int _tmain(int argc, _TCHAR* argv[])
{
DatabaseManager m;
m.create_database();
m.insert_entry_into_database();
return 0;
}

テーブルの作成クエリは成功したようで、確認メッセージがコンソールに表示されますが、挿入クエリは無効として扱われます。cout << query呼び出しを追加して、それが正しく、100パーセント有効であることを確認しました。これの何が問題になっていますか?


選択方法

vector<vector<string>> DatabaseManager::select_entry() {
vector<vector<string>> results;
sqlite3_open("Database.sqlite", &database);

char* query = "SELECT firstName FROM Teachers WHERE firstName = 'Ivan';";
cout << query;

if (sqlite3_prepare_v2(database, query, -1, &statement, 0) == SQLITE_OK) {
    int cols = sqlite3_column_count(statement);
    int result = 0;

    while (true) {
        result = sqlite3_step(statement);

        if (result == SQLITE_ROW) {
            cout << "test"; 
            vector<string> values;
            for (int i=0; i<cols; i++) {
                cout << (char*)sqlite3_column_text(statement, i);
                values.push_back((char*)sqlite3_column_text(statement, i));
            }
            results.push_back(values);
        }
        else break;
    }

    sqlite3_finalize(statement);
    string error = sqlite3_errmsg(database);
    if(error != "not an error") cout << query << " " << error << endl;

    return results;
}

}

4

1 に答える 1

1

INSERTステートメントの有効な構文は次のいずれかです。

INSERT INTO MyTable(Col1, Col2, ...) VALUES (value1, value2, ...)

また

INSERT INTO MyTable VALUES (value1, value2, ...)

を省略VALUESしたため、SQLiteは括弧内のものが列名のリストであると見なします。


データベースファイルはによって自動的に作成されますsqlite3_open


sqlite3_step実際にコマンドを実行するには、を呼び出す必要があります。

于 2012-11-19T15:02:42.057 に答える