sqlite表代码管理器?

时间:2011-11-03 19:59:55

标签: c++ sql sqlite

sqlite(和sql)相当新。我需要使用多个列名生成几个表,这些表可以随着代码的变化而变化(在c ++中)。我该如何管理它们?我做得对吗?必须有更好的实用程序代码。

编辑:具体来说,我想通过在编译时对表和字段名称进行抽象来避免运行时错误(例如,使用#defines,但也许其他更好的东西)。

E.g。我正在考虑创建一个类TableHandler:

sqlite *db; 
....
TableHandler tb("TableName");
tb.addField("FirstName", "TEXT");
tb.addField("Id", "INTEGER");

tb.createTable(db); //calls sqlite3_exec("create table TableName(FirstName TEXT, Id INTEGER)");

tb.setEntry("FirstName", "bob");
tb.addEntry(); //calls sqlite3_exec("insert ...");

tb.createCode(stdout); 
//this will generate
/*
#define kTableName "TableName"
#define kFirstName "FirstName"
#define kId "Id"
...anything else useful?
*/

1 个答案:

答案 0 :(得分:1)

我问了一个类似的问题而且它被投了票,所以我删除了它。如果你有兴趣,我写了一些代码来做插入。但我同意负面评论,即静态SQL语句不易出错。更不用说减少cpu密集了。

对于插入,我获得了std::set std::pair std::string。第一个字符串是列名,第二个字符串是其值。 Query返回了类似的结构。我使用std::mapstd::vector以及std::unordered_set进行游戏,所有这些都会带来不同的好处。

如果你能解决这个问题,那将是一个很小的实用程序,它可以读取类的定义并为你编写所有的SQL。我开始这个并放弃了,因为解析C ++头文件变得复杂,我将在未来的项目中节省时间。

<强>加

std::string Insert(std::string table, std::vector< std::pair<std::string,std::string> >  row)
{
  if (row.size()==0 || table.size()==0) 
    return "";

    std::stringstream name,value;
    auto it = row.begin();
    name << "INSERT INTO " <<  table.c_str()<<"('" << (*it).first << "'";
    value << "VALUES('" <<(*it).second << "'";  

  for ( ; it < row.end(); it++)
  {
        name << ", '" << (*it).first << "'";
        value << ", '" <<(*it).second << "'";
  }

    name <<  ") ";
    value << ");";
    name << value.str();

    return name.str(); 
}