将SQLBindParameter设置为成员变量是否标准

时间:2013-12-17 18:34:00

标签: c++ odbc sqlbindparameter

所以我正在对某人的类进行代码审查,将我们程序的输出转储到数据库中。所以他们得到了一群struct Foo的成员名单。现在,他们在类中有一个成员变量,并在每次调用时复制值,而不是更改SQLBindParameter表。

struct Foo
{
  int bar;
  int baz;
};
class SQLWriter
{
public:
  SQLWriter()
  {
    //initializes SQLHSTMT hQuery to something that takes two ? inputs      
    SQLBindParameter(hQuery,0,SQL_PARAM_INPUT,SQL_C_INT, 0, 0, &bar_, 0, NULL);
    SQLBindParameter(hQuery,1,SQL_PARAM_INPUT,SQL_C_INT, 0, 0, &baz_, 0, NULL);
  }
  void WriteFoos(const std::vector<Foo> foos)
  {
     for (int i = 0; i < foos.size(); i++)
     {
       const Foo& foo = foos[i];
       bar_ = foo.bar;
       baz_ = foo.baz;
       SQLExecute(hQuery);
     }
  }
private:
  SQLHSTMT hQuery; int bar_; int baz_;
};

这似乎......对我来说很疯狂,但老实说,我不知道数据库的东西,我更像是一个C ++程序。在我看来,正确的做法是:

struct Foo
{
  int bar;
  int baz;
};
class SQLWriter
{
public:
  SQLWriter()
  {
    //initializes SQLHSTMT hQuery to something that takes two ? inputs
  }
  void WriteFoos(const std::vector<Foo> foos)
  {
     for (int i = 0; i < foos.size(); i++)
     {
       const Foo& foo = foos[i];
       SQLBindParameter(hQuery,0,SQL_PARAM_INPUT,SQL_C_INT, 0, 0, &foo.bar, 0, NULL);
       SQLBindParameter(hQuery,1,SQL_PARAM_INPUT,SQL_C_INT, 0, 0, &foo.baz, 0, NULL);
       SQLExecute(hQuery);
     }
  }
private:
  SQLHSTMT hQuery;
};

这种写调用没有那些奇怪的副作用和所有那些多余的变量。由于foo确实有更多的变量(10),这似乎更明智。我错了吗?

1 个答案:

答案 0 :(得分:0)

SQLBindParameter()的一部分美妙或有用之处在于,您可以绑定到缓冲区,只需在每个SQLExecute()之前更改缓冲区。

虽然按照你在第一个代码snippit中显示的方式来执行它可能会有点难看,但每次重新绑定可能会非常昂贵,具体取决于它发生的次数。

Mungflesh提出了一个很好的观点,我同意,与代码看起来干净相比,性能可能会成为一个更大的问题。

您仍然可以找到清理代码的方法,但请记住,如果没有必要,您最好不要重新绑定。