所以我正在寻找一个完全隐藏任何文本SQL语句的C ++ SQL包装器。我似乎无法找到任何,我想知道为什么所有的包装器似乎在某些时候想要你写一个文本的SQL语句,如:
SELECT * FROM stock WHERE item = 'Hotdog Buns'
这里是MySQL ++,例如:
mysqlpp::Query query = conn.query("select * from stock where item = 'Hotdog Buns'");
对我来说,最明显的方法是创建一个包含属性(列)的类,该类的每个实例都是一行。所以要做上面的查询,我会做类似的事情:
// Class defined something like this...
class stock_item : public sql::row
{
public:
stock_item() : m_name( NULL ), m_amount( 0 ) {};
~stock_item() {};
// Statically define the table
static void CreateTable( void )
{
// Some C++ reflective mechanism
sql::column( "name", char[50] );
sql::column( "amount", u32 );
}
private:
const char* m_name;
u32 m_amount;
}
// Then a table defined like this
sql::table<stock_item> stock;
// Query function defined something like this...
stock GetHotDogBuns( const stock& shopStock )
{
stock hotDogBuns = shopStock.Select( stock_item::Name(), "Hotdog Buns" );
return hotDogBuns;
}
现在我不是SQL专家,我没有花很长时间思考上面的代码,但是如果你从C ++背景而不是必须成为数据库专家那么处理数据库似乎是一种合乎逻辑的方式。这种方法有什么问题?
是否有一个允许您以类似方式访问数据库的开源库?
EDIT 之所以我想要这样的东西,是因为使用我们的代码的C ++程序员不必学习SQL语法并为他们提供更自然的编码环境。我在用PHP编写的SilverStripe CMS中看到过这样的东西。
答案 0 :(得分:4)
RogueWave曾经(可能仍然如此)拥有像这样的C ++数据库访问库 - 使用它纯粹是地狱。 SQL是一种非常强大的语言,在C ++类中封装它是一个非常困难的命题。另外,至少对你来说,你还没有明确表达你这样做的动机是什么。
答案 1 :(得分:2)
答案 2 :(得分:1)
Quince是一个开源的C ++库,可以节省您使用SQL语法或SQL类型,但仍然提供与SQL相同的表达能力。目前仅支持PostgreSQL和sqlite,但总是可以添加新的后端。请参阅quince-lib.com。 (完全披露:我写了。)
答案 3 :(得分:0)
我已经编写了自己的Fields和Records库。
Field类包含以下方法:
virtual std::string get_sql_creation_text(void) const = 0;
virtual std::string get_sql_insert_data(void) const = 0;
virtual std::string get_sql_where_clause_equals(void) const = 0;
virtual std::string get_value_as_string(void) const = 0;
My Record类是指向字符串的指针的容器。 我通过使用上述方法迭代字段来构建SQL语句。
所以我的一个查询看起来像是:
12:37:41: Selecting rows for iterating using:
SELECT *
FROM Ing_Quantified
LEFT JOIN Ing_Processing USING (ID_Processing)
LEFT JOIN Ing_Process_Degrees USING (ID_Process_Degree)
LEFT JOIN Ing_Process_Methods USING (ID_Process_Method)
LEFT JOIN Ingredients USING (ID_Ingredient)
LEFT JOIN Ing_Titles USING (ID_Title)
LEFT JOIN Ing_Varieties USING (ID_Variety)
LEFT JOIN Ing_Categories USING (ID_Category)
LEFT JOIN Ing_Container_Sizes USING (ID_Container_Size)
LEFT JOIN Ing_Container_Types USING (ID_Container_Type)
LEFT JOIN Meas_Fundamentals USING (ID_Measurements)
LEFT JOIN Meas_Systems USING (ID_System)
LEFT JOIN Meas_Types USING (ID_Types)
WHERE (ID_Recipe = 1);
所有这些都是在将记录和字段视为通用时完成的。 Fields返回它们的名称,这有助于创建WHERE子句和上面的USING子句。
我使用wxWidgets wxDbTable,但它不容易支持通用字段和记录。