[英]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.