首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >C++ Sqlite3,执行2条sql语句-第2条语句获取分段核心转储错误

C++ Sqlite3,执行2条sql语句-第2条语句获取分段核心转储错误
EN

Stack Overflow用户
提问于 2012-08-14 19:09:04
回答 2查看 534关注 0票数 0

我试着做了以下事情。

添加记录后,我将从同一个表中进行选择,以获得userid,即自动递增和主键。但是当我尝试执行以下操作时,我得到了分段核心转储

插入代码可以工作,但是当我尝试执行select语句时,这就是代码导致错误的地方。我正在尝试从数据库中获取userid字段,并将其分配给字符串或向量结果;

我的test2.cpp代码:

代码语言:javascript
运行
复制
#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 db\n";
    }

    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;

}

如果添加成功,如何检索我的数据。我需要检索的目的是检查我的语句执行是否正确,还需要获取用户I,该用户I是自动递增的,并在我需要时创建为主键,并告诉客户端他的用户I是+userid+

如果select语句的向量使用错误,在执行insert语句、insert语句在检查数据库、添加记录后如何获得用户id

EN

回答 2

Stack Overflow用户

发布于 2012-08-14 19:16:00

问题是这个调用:

代码语言:javascript
运行
复制
result[i].push_back(...);

result是向量的向量,但它是空的。因此,尝试使用result[i]会导致失败。

编辑:

将内部循环改为如下所示:

代码语言:javascript
运行
复制
for( int i = 0; i < 4; i++ )
{
    result.push_back(vector<std::string>());
    result[i].push_back(...);
}

也许你的意思是这样的:

代码语言:javascript
运行
复制
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);
}
票数 0
EN

Stack Overflow用户

发布于 2012-08-14 19:46:57

除了未初始化的嵌套vector的问题(参见Joachim Pileborg的答案)之外,您不应该在循环条件中检查sqlite3_column_text的结果。SQLite documentation声明:

如果SQL语句当前未指向有效行,或者列索引超出范围,则结果未定义,则为

我更喜欢在while条件中检查sqlite3_step的结果,如下所示:

代码语言:javascript
运行
复制
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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11951018

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档