Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++ ja SQLite - virhekoodi 21 tietokantayhteyttä suljettaessa

KoodausPurje [25.06.2020 00:02:02]

#

Eli päätin opetella hiukan C++:aa ja tämä on käytännössä minun ensimmäinen C++ -ohjelma. Samaan syssyyn on todettava, että en ole myöskään koskaan ennen käyttänyt nimenomaisesti SQLiteä.

Ongelma koskee sitä, että tietokantayhteyden sulku (eli siis sqlite3_close() ) antaa virhekoodin 21 (tekstiversio - "Error message: bad parameter or other API misuse"). Muilta osin ohjelma näyttäisi toimivan.

Voi olla ihan taidoista kiinni, mutta en yksinkertaisesti saa kiinni mikä on ongelma tämän osalta.

Periaatteessa manuaalista selviää mitä tuo tarkoittaa, mutta en saa kiinni miten se käytännössä ilmenee koodissani. Linkki manuaalin kyseessä olevaan kohtaan:

https://sqlite.org/rescode.html#misuse"

Valitettavasti koska en tiedä mikä kohta koodiani spesifisti aiheuttaa ongelman, niin joudun laittamaan tähän koko koodin. Onneksi ei ole ihan järisyttävän pitkä, pahoittelen silti jo etukäteen.

app.cpp

#include <iostream>
#include <string>
#include <sqlite3.h>
#include "DatabaseConnection.hpp"

int main(int argc, char* argv[]) {

  const char *dbname;
  std::string sql;
  sql = "CREATE TABLE PEOPLE ("  \
      "ID INTEGER PRIMARY KEY     AUTOINCREMENT," \
      "NAME           TEXT    NOT NULL);";

  DatabaseConnection dbconnection;
  dbconnection.connectToDB();
  dbconnection.runSQL(sql);
  sql = "INSERT INTO PEOPLE (NAME) VALUES ('Trump')";
  dbconnection.runSQL(sql);
  dbconnection.closeDBConnection();
  return 0;
}

DataBaseConnection.hpp

#define DB_NAME "test.db"

class DatabaseConnection {
private:
  int m_rc;
  char *m_zErrMsg;
  sqlite3 *m_db;

public:
  void connectToDB();
  void closeDBConnection();
  static int callBack(void*, int, char**, char**);
  void runSQL(const std::string& sql);
};

DatabaseConnection.cpp

#include <iostream>
#include <string>
#include <sqlite3.h>
#include "DatabaseConnection.hpp"

void DatabaseConnection::connectToDB() {
  m_rc = sqlite3_open(DB_NAME, &m_db);
  if (m_rc) {
    std::cout << "Failed to open database connection" << sqlite3_errmsg(m_db) << std::endl;
  }
  else {
    std::cout << "Opened database connection succesfully" << std::endl;
  }
}

void DatabaseConnection::closeDBConnection() {
  m_rc = sqlite3_close(m_db);
  if (m_rc) {
    std::cout << "Closed database connection succesfully." << std::endl;
  }
  else {
    std::cout << "Possibly failed to close database connection. Error message: " << sqlite3_errmsg(m_db) << std::endl;
  }
}

int DatabaseConnection::callBack(void *NotUsed, int argc, char **argv, char **azColName) {
  return 0;
}


void DatabaseConnection::runSQL(const std::string& sql) {
  m_rc = sqlite3_exec(m_db, sql.c_str(), &DatabaseConnection::callBack, 0, &m_zErrMsg);
  if (m_rc) {
    std::cout << "Operation successful." << std::endl;
  }
  else {
    std::cout << "Failed to do the operation. Error message: " << sqlite3_errmsg(m_db) << std::endl;
  }
}

Metabolix [25.06.2020 12:39:21]

#

Ilmeisesti kuitenkin SQLITE_OK on nolla ja näin ollen closeDBConnection-funktion if-lause toimii väärin päin. (Vertaa muihin tekemiisi virhetarkastuksiin!) Virheilmoitus kertoo siitä, että virhefunktiolle annettu tietokanta on jo suljettu.

KoodausPurje [25.06.2020 12:59:28]

#

Metabolix kirjoitti:

Ilmeisesti kuitenkin SQLITE_OK on nolla ja näin ollen closeDBConnection-funktion if-lause toimii väärin päin. (Vertaa muihin tekemiisi virhetarkastuksiin!) Virheilmoitus kertoo siitä, että virhefunktiolle annettu tietokanta on jo suljettu.

No näinhän se totta kai menee. Kiitos vastauksesta! Tulikin ihmeteltyä aika montaa juttua tuon virheen osalta, hyvä välillä näköjään kysyä jostain. Omalle koodille sokeutuu aika äkkiä, kun tekee uudella kielellä ja ei tauota tekemistä tarpeeksi.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta