簡體   English   中英

sqlite3_exec() 在 c++ 中失敗,沒有錯誤代碼

[英]sqlite3_exec() fails without error code in c++

我正在為 sqlite3 API 構建一個包裝器,它允許我通過單個 function 調用從數據庫中收集和格式化數據。 我所有的 SQL 都是正確的(我使用 dbBrowser for sqlite 檢查它)並且 vscode 顯示我的代碼沒有錯誤。

我的代碼失敗的 function :

void sqlWrapper::sqlop_Operator(sqlite3 *db, const char *sql, bool returnData) { 
    int result;
    char *errorMsg = 0; 
    const char* data = "Callback function called";
    
    auto callback = sqlWrapper::sqlop_Callback_Discard;
    if (returnData) {
        callback = sqlWrapper::sqlop_Callback_Return;
    }
    //test:
    std::cout << "before errorMsg\n"; //code stops here unless I remove next line
    std::cout << errorMsg << "\n";
    std::cout << "after errorMsg\n";
    
    result = sqlite3_exec(db, sql, callback, (void*)data, &errorMsg);
    
    if (result != SQLITE_OK) {
        std::cout << "Could not complete operation. SQL ERROR: " << errorMsg << "\n"; //program prints up to "SQL ERROR: " then stops
        sqlite3_free(errorMsg);
    } else {
        std::cout << "Successfully completed operation. \n";
    }
      
}

主.cpp:

#include <iostream>
#include <vector>

#include "sqlite3/sqlite3.h"
#include "sqlWrapper.hpp"

int main() {   
    sqlite3 *database;
    const char *dbRelativePath = "users/users.db";
    
    sqlWrapper::connect(database, dbRelativePath);
    
    const char *sql = "SELECT * from USERS";  
    std::vector<std::vector<char *> > data = sqlWrapper::sqlop(database, sql, true); 

    if (!data.empty()) {  //display each record   
        for (int I = 0; I<data.size()-1; I++) {
            std::cout << "\n Record: \n";
            std::vector<char *> record = data[I];
            for (int i = 0; i<record.size()-1; i++) {
                std::cout << record[i] << "\n";
            }
        }
    }

    sqlWrapper::disconnect(database);

    return 0;
}

sqlop():

std::vector<std::vector<char *> > sqlWrapper::sqlop(sqlite3 *db, const char *sql, bool returnData) {
    dataReturn.clear();
    std::vector<std::vector<char *> > data;
    sqlop_Operator(db, sql, returnData);
    data = dataReturn;
    dataReturn.clear();
    return data;
}

編輯:將char * dbRelativePath替換為const char *dbRelativePath ,從而修復了 ISO C++ 警告。

編輯:這是回調 function:

int sqlWrapper::sqlop_Callback_Return(void *Unused, int colNumber, char **fieldContent, char **colName) {
    std::cout << "callback_return";
    std::vector<char *> record;
    for (int i = 0; i<colNumber-1; i++) {
        record.push_back(fieldContent[i]);
    }
    dataReturn.push_back(record);
    return 0;
}

好吧,我是個白痴。 原來我的 sqlWrapper::connect() function 沒有正確連接到數據庫,盡管響應聲稱它是。 現在一切正常。 謝謝您的幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM