2011-11-03 62 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

添加插入代碼作爲示例 –