2016-04-05 1 views
0

SQLITE_ROWの代わりにSQLITE_DONEが得られます.dbから1つのレコードを選択しています。また、返された行も表示されません。SQLite_ROWをSQLite_ROWで取得すると、v2 apiでプリペアドステートメントで1行選択すると

はSQLITE_DONEに確認しようとしたレコードを印刷しようとしたが、それは私がここにhere

を求めている例外read access violationを与えていたコード

int login() { 
    char username[50], password[50]; 
    int i = 0; 
    char c; 
    cout << "Enter Username: "; 
    cin >> username; 
    cout << "Enter Password: "; 
    c = _getch(); 
    while (c != 13) // for hiding password on console 
    { 
     password[i] = c; 
     i++; 
     cout << "*"; 
     c = _getch();  
    } 

    sqlite3 * conn = NULL; 

    int res = sqlite3_open("./mtbs.db" , &conn); 

    if (SQLITE_OK != res) { 
     printf("%s\n", sqlite3_errmsg(conn)); 
     return res; 
    } 

    sqlite3_stmt * stmt = NULL; 
    char * sql = "SELECT id, username FROM admin WHERE username = ? AND password = ? LIMIT 1"; 
    res = sqlite3_prepare_v2(conn, 
      sql, 
      -1, 
      &stmt, 
      NULL); 

    if (SQLITE_OK != res) { 
     printf("\n%s\n", sqlite3_errmsg(conn)); 
     sqlite3_close(conn); 
     return res; 
    } 

    res = sqlite3_bind_text(stmt, 1, username, strlen(username), SQLITE_STATIC); 
    if (SQLITE_OK != res) { 
     printf("\n%s\n", sqlite3_errmsg(conn)); 
     sqlite3_close(conn); 
     return res; 
    } 

    res = sqlite3_bind_text(stmt, 2, password, strlen(password), SQLITE_STATIC); 
    if(SQLITE_OK != res){ 
     printf("\n%s\n", sqlite3_errmsg(conn)); 
     sqlite3_close(conn); 
     return res; 
    } 

    if (SQLITE_ROW == sqlite3_step(stmt)) { // this ends up as SQLITE_DONE 
     cout<< endl << sqlite3_column_text(stmt, 0) << "\t" << sqlite3_column_text(stmt, 1) << endl; 
    } 
    sqlite3_finalize(stmt); 
    sqlite3_close(conn); 
    return 1; 
} 

答えて

1

あるレコードがクエリに一致しない場合に発生します。

テストとしてユーザー名とパスワードを印刷します。私が見ることの1つは、実際には決してNULLを決してパスワードを終了させないことです。私は肯定的ではありませんが、パスワードの開始として改行と改行を収集している可能性があります。

2

あなたはpasswordを読んだ後でnulで終了しません。あなたがSQLiteに値を送るとき、それは何でもよい。

デバッガを使用してコードをステップ実行すると、何が起きているかがわかります。

-1

結果に干渉している行数を取得している可能性があります。 NOCOUNTをONに設定してみてください。

SET NOCOUNT ON; 
+0

SQLiteにはこのようなことはありません。 –

0

最後に回答を得ました。それは非ヌル終了値のパスワードでした。だから私は、これを使用*として文字を隠す機能を保つために:

char username[50], password[50]; 
string pass; 
char c; 
... 
cout << "Enter Password: "; 
c = _getch(); 
while (c != 13) 
{ 
    pass.push_back(c); 
    cout << "*"; 
    c = _getch(); 
} 

strcpy_s(password, pass.c_str()); // this saved me... 

をそして今、期待通りのリターンSQLITE_ROWを問い合わせます。

関連する問題