【问题标题】:C++ << operator to and from a database [closed]C ++ <<运算符往返于数据库[关闭]
【发布时间】:2012-11-26 17:35:49
【问题描述】:

我想使用&lt;&lt;&gt;&gt; 运算符来加载并保存到外部数据库。 外部数据库必须实现什么才能使其正常工作?

想法或经验? 我正在使用 SQL 与我的 sqlite3 数据库进行交互。

例如,我想说:

MyClass c;
c >> databaseInstance;
c << databaseInstance;

【问题讨论】:

  • 那么
  • 这是一个非常奇怪的抽象。 >> 和
  • 不,你没有。运算符重载是为了让你的代码更简洁明了。如果我看到这些运算符与 DB 一起使用,它会被视为简洁且不透明。

标签: c++ database output


【解决方案1】:

databaseInstance 需要是提供operator&gt;&gt;operator&lt;&lt; 函数的某种类型,它们以您想要的方式写入数据库,从而提供类似流的接口。这些函数的定义有点像这样:

database_type& operator<<(database_type& databaseInstance, MyClass& c)
{
  // Write to database here
  return databaseInstance;
}

database_type& operator>>(database_type& databaseInstance, MyClass& c)
{
  // Read from database here
  return databaseInstance;
}

这利用了operator overloading。没有什么比这更要说的了,使用数据库是一件很奇怪的事情,因为数据库不太像流。

为了与 C++ 标准库保持一致,您可能希望反转运算符的用法:

MyClass c;
databaseInstance << c;
databaseInstance >> c;

但是,不确定最后一行将读入您的MyClass 对象的确切内容。只有当 databaseInstance 已配置为插入特定表时,第二行才真正有意义。

【讨论】:

  • 跟我想的完全一样。一个数据库实例有这么多可以返回的东西,用这种方式真的没有意义。另外:在第一种情况下应该插入哪个表、数据库等?我想它可以通过反映实际对象来发现,但仍然如此。
  • @MooingDuck 希望你感觉好点。 :D
【解决方案2】:

嗯。有趣..

好的,我假设您只想在 operator>> 的情况下从 DB 中选择,在 operator

您可以使用stream manipulator(例如将整数输出转换为十六进制格式的“十六进制”)来确定要使用的列,因此您会得到类似

int c;
DBStreamInterface db(tableA);
c << columnA << db;

或者您可以定义一个与表格具有相同布局的结构类型,并将整行读入其中:

struct TableRow {
  int columnA;
  string columnB;
};
TableRow t << db;

但是您必须小心将数据库中的架构与结构的定义相匹配(除非您想全力以赴在模板代码生成中通过读取架构 DDL 来创建适当的结构并为类构造函数中的每个字段动态分配存储空间)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-24
    • 2011-03-26
    • 1970-01-01
    • 1970-01-01
    • 2013-10-19
    • 2015-01-07
    相关资源
    最近更新 更多