C++ Sqlite3 中,执行 2 个 sql 语句 - 第 2 条语句得到分段核心转储错误
C++ Sqlite3 , executing 2 sql statement - the 2nd statement get Segmentation Core Dump Error
我尝试执行以下操作。
添加记录后,我将从同一个表中选择以获取用户ID,即自动增量和主键。 但是当我尝试执行以下操作时,我得到了分段核心转储
插入代码有效,但是当我尝试执行 select 语句时,这就是我的代码导致错误的地方。我正在尝试从数据库中获取userid字段并将其分配给字符串或向量结果[0];
我的测试2.cpp代码:
#include <iostream>
#include <sqlite3.h>
#include <vector>
//g++ -o test2 test2.cpp -lsqlite3
using namespace std;
string quotesql( const string& s ) {
return string("'") + s + string("'");
}
int main()
{
int counter = 0;
sqlite3 *db;
sqlite3_stmt * stmt, * stmt2;
string name = "Kungfu Panda2";
string department = "normal";
string password = "hellopassword";
string sqlstatement = "INSERT INTO abe_account (name,department,password) VALUES ("
+quotesql(name) + ","
+quotesql(department) + ","
+quotesql(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 dbn";
}
sqlite3_finalize(stmt);
//after insert ,we select back to get the user id;
sqlstatement = "select * from abe_account where name="
+quotesql(name) + " AND department="
+quotesql(department)+";";
sqlite3_prepare( db, sqlstatement.c_str(), -1, &stmt2, NULL );//preparing the statement
sqlite3_step( stmt2 );//executing the statement
std::vector< std::vector < std:: string > > result;
while( sqlite3_column_text( stmt2, 0 ) )
{
for( int i = 0; i < 4; i++ )
result[i].push_back( std::string( (char *)sqlite3_column_text( stmt2, i ) ) );
sqlite3_step( stmt2 );
}
//cout << result.size() << endl;
sqlite3_finalize(stmt2);
sqlite3_close(db);
return 0;
}
如果我成功添加,如何检索我的数据。我需要检索以检查我的语句是否正确执行,并获取自动递增并创建为主键的用户 ID,因为我需要向客户端询问他的用户 ID 是 +userid+
如果我对 select 语句的向量用法是错误的,那么在我的插入语句执行后,我如何实现获取用户 id,我的插入语句在检查我的数据库时正在工作,记录被添加
问题是这个调用:
result[i].push_back(...);
result
是向量的向量,但它是空的。因此,尝试使用result[i]
会导致失败。
编辑:
将内部循环更改为如下所示的内容:
for( int i = 0; i < 4; i++ )
{
result.push_back(vector<std::string>());
result[i].push_back(...);
}
也许你的意思是这样的:
for (int i = 0; sqlite3_column_text(stmt2, 0); i++ )
{
result.push_back(vector<std::string>());
for (int j = 0; j < 4; j++)
result[i].push_back(...);
sqlite_step(stmt2);
}
除了未初始化的嵌套vector
的问题(参见Joachim Pileborg的答案)之外,您不应该在循环条件中检查sqlite3_column_text
的结果。SQLite 文档指出:
如果 SQL 语句当前未指向有效行,或者列索引超出范围,则结果未定义。
我更愿意在while条件下检查sqlite3_step
的结果,如下所示:
std::vector< std::vector < std:: string > > result;
while(sqlite3_step(stmt2) == SQLITE_ROW)
{
result.push_back(vector<std::string>());
for( int i = 0; i < 4; i++ )
{
result[i].push_back( std::string( (char *)sqlite3_column_text( stmt2, i ) ) );
}
}
如果采用此方法,则必须在循环上方几行中删除sqlite3_step
。
相关文章:
- 分段故障(堆芯转储)矢量
- 数组的指针从不分段故障
- 在某些循环内使用vector.push_back时出现分段错误
- 为什么在运行时没有向我们提供有关分段错误的更多信息?
- 我的简单if-else语句是如何无法访问的代码
- 有一个打印语句的函数是一种糟糕的编程实践吗
- 在线编译器中的分段C++没有打印消息
- 线程,如果else语句,都是错误的上下文切换后,会发生什么
- 为什么是0;C++中的有效语句
- 如何解决gcc编译器优化导致的centos双编译器设置中的分段错误
- 当我的阵列太大时出现分段错误
- Windows 10-使用gtkmm-3.0库和g++[包括再现]的分段故障
- 布尔变量 if 语句 C++ 上的分段错误
- IF 语句和分段错误 - C++
- C++ Sqlite3 中,执行 2 个 sql 语句 - 第 2 条语句得到分段核心转储错误
- 导致分段错误的 IF 语句
- 正在删除导致分段错误的cout语句
- 如果存储是分段的,则在类中使用If语句创建动态数组
- 为什么我的"if"语句会导致分段错误?
- 将 if 语句与指针(BST 树)一起使用时出现分段错误