【问题标题】:sqlite table code manager?sqlite 表代码管理器?
【发布时间】:2011-11-03 19:59:54
【问题描述】:

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

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

例如我目前正在考虑创建一个 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?
*/

【问题讨论】:

  • 分享码是什么意思?你没有写CREATE TABLE 声明有什么原因吗?
  • 我想要一份摘要,以便我可以根据需要轻松调整表格(甚至重命名表格或字段)。例如。 tb.setEntry("FirstOppsName", "bob"); //字段不存在。如何在编译时防止此类问题? tb.setEntry(kFirstName, "bob"); //这是一种解决方案。

标签: c++ sql sqlite


【解决方案1】:

我问了一个类似的问题,但被否决了,所以我删除了它。如果您有兴趣,我写了一些代码来进行插入。但我同意消极的 cmets 静态 SQL 语句不太容易出错。更不用说 CPU 密集度较低了。

对于插入,我选择了 std::setstd::pairstd::string。第一个字符串是列名,第二个字符串是它的值。查询返回了类似的结构。我玩过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(); 
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-13
    相关资源
    最近更新 更多