2

そこで、プログラムの出力をデータベースにダンプする誰かのクラスのコード レビューを行っています。そのため、彼らは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 個) があるため、これはより賢明に思えます。私はここで間違っていますか?

4

1 に答える 1

0

SQLBindParameter() の利点または有用性の一部は、バッファーにバインドして、各 SQLExecute() の前にバッファーを変更できることです。

最初のコード スニピットで示した方法で行うのは少し見苦しいかもしれませんが、毎回再バインドすると、発生回数によっては非常にコストがかかる可能性があります。

Mungflesh は良い点を指摘しており、コードの見栄えと比較して、パフォーマンスが大きな問題になる可能性があることに同意します。

コードをクリーンアップする方法を見つけることができるかもしれませんが、再バインドする必要がない場合は、理想的には回避したいということを覚えておいてください。

于 2014-08-21T14:57:19.760 に答える