Visual c++ 当通过v2api通过准备好的语句在一行上进行选择时,让SQLITE_完成而不是SQLITE_行
当从数据库中选择一条记录时,我正在得到Visual c++ 当通过v2api通过准备好的语句在一行上进行选择时,让SQLITE_完成而不是SQLITE_行,visual-c++,sqlite,prepared-statement,Visual C++,Sqlite,Prepared Statement,当从数据库中选择一条记录时,我正在得到SQLITE\u DONE而不是SQLITE\u ROW。而且它也不显示返回的行 试图检查SQLITE_是否已完成并试图打印记录,但它给出了异常读取访问冲突,我已询问该异常 这是密码 int login() { char username[50], password[50]; int i = 0; char c; cout << "Enter Username: "; cin >> username;
SQLITE\u DONE
而不是SQLITE\u ROW
。而且它也不显示返回的行
试图检查SQLITE_是否已完成并试图打印记录,但它给出了异常读取访问冲突
,我已询问该异常
这是密码
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;
}
int-login(){
字符用户名[50],密码[50];
int i=0;
字符c;
cout>用户名;
cout当没有与查询匹配的记录时,会发生这种情况
将用户名和密码打印出来作为测试。我看到的一件事是,您实际上从未使用NULL终止密码。我不是肯定的,但您可能正在收集回车符和换行符作为密码的开始。如果没有与查询匹配的记录,则会发生这种情况
打印用户名和密码作为测试。我看到的一件事是,您实际上从未使用NULL终止密码。我不是肯定的,但您可能正在收集回车符和换行符作为密码的开始。读取后,您不会使用nul终止您的密码。
。当您将值发送到SQLite时可能是什么
使用调试器单步执行代码,您将看到发生了什么。读取后,您不会使用nul终止您的密码。当您将值发送到SQLite时,它可能是任何值
使用调试器逐步检查代码,您将看到发生了什么。最终得到了答案。这是以非空值结尾的密码。因此,为了保留隐藏字符的功能,我使用了以下方法:
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...
char用户名[50],密码[50];
串通;
字符c;
...
cout最终得到了答案。这是一个以非空值结尾的密码。为了保持隐藏字符的功能,我使用了以下方法:
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...
char用户名[50],密码[50];
串通;
字符c;
...
库特