?
Evtl. sollte der Thread gespalten werden - ich kann nicht erkennen, ob C++ oder sqlite das Problem ist.
Zum sqlite-Teil: Du bereitest ein Statement vor, verknüpfst dessen Platzhalter mit Deinen Werten und führst das Statement aus.
Geht sicherlich auch mit dem "Convenience-Wrapper" sqlite3_exec() allerdings IMHO auf Kosten der Leserlichkeit.
Ein Beispiel wie sowas aussehen könnte: (Z. 35-49)
#include <fstream>
#include <iostream>
#include <iterator>
#include <memory>
#include <string>
#include <sqlite3.h>
struct person{
int id_;
std::string name_, firstname_;
};
std::istream& operator>>(std::istream& in, person& p){
return in >> p.id_ >> p.name_ >> p.firstname_;
}
std::ostream& operator<<(std::ostream& out, const person& p){
return out << p.id_ << ": " << p.name_ << ", " << p.firstname_;
}
using sqlite_db = std::unique_ptr<sqlite3, int(*)(sqlite3*)>;
sqlite_db open(){
sqlite3* tmp;
sqlite3_open(":memory:", &tmp);
return {tmp, sqlite3_close};
}
void create(const sqlite_db& db){
const char* sql = "CREATE TABLE person"
"(id INTEGER, name TEXT, firstname TEXT)";
sqlite3_exec(db.get(), sql, nullptr, nullptr, nullptr);
}
template<typename InputIterator>
void to_db(InputIterator first, InputIterator last, const sqlite_db& db){
const char* sql = "INSERT INTO person VALUES(?, ?, ?)";
sqlite3_stmt* pstmt;
sqlite3_prepare_v2(db.get(), sql, -1, &pstmt, nullptr);
while(first!=last){
sqlite3_bind_int(pstmt, 1, first->id_);
sqlite3_bind_text(pstmt, 2, first->name_.c_str(), -1, SQLITE_STATIC);
sqlite3_bind_text(pstmt, 3, first->firstname_.c_str(), -1, SQLITE_STATIC);
sqlite3_step(pstmt);
sqlite3_reset(pstmt);
++first;
}
sqlite3_finalize(pstmt);
}
template<typename OutputIterator>
void from_db(OutputIterator to, const sqlite_db& db){
const char* sql = "SELECT * FROM person";
sqlite3_stmt* pstmt;
sqlite3_prepare_v2(db.get(), sql, -1, &pstmt, nullptr);
while(sqlite3_step(pstmt)==SQLITE_ROW){
const person tmp{
sqlite3_column_int(pstmt, 0),
reinterpret_cast<const char*>(sqlite3_column_text(pstmt, 1)),
reinterpret_cast<const char*>(sqlite3_column_text(pstmt, 2))
};
*to++=tmp;
}
sqlite3_finalize(pstmt);
}
int main(){
auto db = open();
create(db);
std::ifstream file("data.txt");
using iiter = std::istream_iterator<person>;
to_db(iiter{file}, iiter{}, db);
using oiter = std::ostream_iterator<person>;
from_db(oiter{std::cout, "\n"}, db);
}
data.txt:
1 Wurble Furble
2 Mustermann Franz
3 Mustermann Susanne
Die Lernkurve ist ziemlich steil, wenn Du noch Anfänger bist, vorallem weil Du auch ein C Verständnis brauchst, um sqlite zu bändigen.