sqlite таблица кодового менеджера? - PullRequest
1 голос
/ 03 ноября 2011

Довольно новый для 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?
*/

1 Ответ

1 голос
/ 04 ноября 2011

Я задал похожий вопрос, и за него проголосовали, поэтому я удалил его. Я написал код для вставки, если вам интересно. Но я согласился с отрицательными комментариями, что статические операторы SQL менее подвержены ошибкам. Не говоря уже о менее интенсивном использовании процессора.

Для вставки я взял std::set из std::pair из std::string. Первая строка - это имя столбца, а вторая - его значение. И Запрос вернул похожую структуру. Я играл с std::map, std::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(); 
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...