Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Visual c++ 当通过v2api通过准备好的语句在一行上进行选择时,让SQLITE_完成而不是SQLITE_行_Visual C++_Sqlite_Prepared Statement - Fatal编程技术网

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;
...
库特