2011-11-03 63 views
1

相当新的sqlite(和sql)。我有几个表,我需要与几个列名称,可以改变我的代码(在C + +)生成。我如何管理它们?我做对了吗?在那里必须有实用程序代码,这要好得多。sqlite表代码管理器?

编辑:特别是,我想通过在编译时抽象表和字段名称来避免运行时错误(例如使用#define,但也许别的更好)。

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? 
*/ 
+0

你说的共享代码是什么意思?有没有理由不写'CREATE TABLE'语句? – mikerobi

+0

我想要一个摘要,以便我可以轻松调整表格,以便根据需要调整表格(甚至可以重命名表格或字段)。 E.g. tb.setEntry(“FirstOppsName”,“bob”); //字段不存在。我如何在编译时防止这些问题? tb.setEntry(kFirstName,“bob”); //这是一个解决方案。 – jobobo

回答

1

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

对于插入,我拍了std::setstd::stringstd::pair。第一个字符串是列名,第二个字符串是其值。查询返回了一个类似的结构。我玩std::mapstd::vectorstd::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(); 
} 
+0

添加插入代码作为示例 –