Re: Is there a better way to access the data of a template class?
On Fri, 15 May 2009 14:01:11 +0200, Walter Eicher
<walter.eicher@nospam.microcrystal.ch> wrote:
a wrong version of class TSimpleDataBase
the correct one is here:
class TSimpleDataBase
{
public:
void AddRecord (const VRecord& rec);
};
using namespace std;
void TSimpleDataBase::AddRecord (const VRecord& rec)
{
LPCTSTR ctx = _T("TSimpleDB::AddRecord");
if (mDB == NULL)
throw TException (_T("DB not open!"), ctx);
TFormat sci;
sci.Scientific ();
sci.Precision (16);
wstring s = _T("INSERT INTO ") + mTableName + _T(" VALUES (");
DBRecord dbr = rec.Record ();
for (UInt i = 0; i < dbr .size (); ++i)
{
Tstringstream ss; // typedef basic_stringstream<TCHAR>
VDBColumn* col = rec[i];
switch (col->ColType ())
{
case eCol_DATE:
{
TTimeDate val = *static_cast<TTimeDate*>(col->DataPtr ());
ss << val.GetTime ();
}
break;
case eCol_INT:
{
Int val = *static_cast<Int*>(col->DataPtr ());
ss << val;
}
break;
case eCol_DOUBLE:
{
Double val = *static_cast<Double*>(col->DataPtr ());
ss << sci(val);
}
break;
case eCol_TEXT:
{
Tstring val = *static_cast<Tstring*> (col->DataPtr ());
ss << _T("'") << val << _T("'");
}
break;
default:
throw TException (_T("create table, illegal column type!"),
ctx);
}
s += ss.str ();
if (i < mRecordDef.size () - 1)
s += _T(", ");
}
s += _T(")");
sqlite3_stmt* stmt;
int rc = sqlite3_prepare16_v2 (mDB, s.c_str (), -1, &stmt, NULL);
if (rc != SQLITE_OK)
throw TException (_T("prepare add record failed!"), ctx);
sqlite3_step (stmt);
if (sqlite3_finalize (stmt) != SQLITE_OK)
throw TException (_T("add record failed!"), ctx);
}
Sorry
Walter