sql参数的最佳stl容器

Best stl container for sql parameters

本文关键字:stl 容器 最佳 参数 sql      更新时间:2023-10-16

我必须建立一个动态sql查询。要正确执行它,我必须分三个步骤:

    <
  1. 准备声明/gh>
  2. 用函数绑定参数:bindString(字符串值,int索引);binint (int value, int index);

因为这个查询是动态构建的,所以我必须为给定的索引存储适当的值。

例如:

  1. SELECT * FROM Table WHERE A = ?AND E = '?';

  2. SELECT * FROM Table WHERE A = ?b = ?AND E = '?';

在构建查询期间,我必须存储在某个地方:

第一种情况:

  • 索引0用于int A,
  • 索引1用于字符串E

第二种情况:

  • 索引0用于int A
  • 索引1用于int B
  • 索引2用于字符串E

我最好的想法是创建两个地图:和在创建查询集时,首先是索引,其次是值,然后创建两个循环,一个用于字符串,第二个用于整数,并在其中绑定参数,它工作得很好。

然而,我想知道是否有可能在一个循环中使用后续索引并以类型安全的方式完成所有操作。

谢谢。

我会考虑创建一个类来包装SQL参数。

实际上我会创建一个这样的抽象类:

SQLParameterBase
{
   std::string toString() = 0;
   void print()
   {
     std::cout << toString();
   }
}
然后是模板类:

template<class ParamType>
SQLParameter : public SQLParameterBase
{
private:
    ParamType value;
public:
    std::string toString()
    {
       // You can use std::ostringstream to convert to string,
       // or create another class (derivated from SQLParameterBase) with very specific values
    }
}

你可以这样使用:

SQLParameterBase * params[10];
maps[0] = new SQLParameter<int>();

希望对你有帮助

实际上是修改后的AMDG解决方案。多亏了他!

class SQLParam {
public:
   virtual ~SqlParam(){}
   void bind(DatabaseHandler &db, int index) = 0;
};
class SQLParamInt {
private:
   int value;
public:
   SqlParamInt(int p_value) : value(p_value) {
   }
   ~SqlParamInt() {}
   int bind(DatabaseHandler &db, int index) {
       return db.bindInt(value, index);
   }
};
class SQLParamString {
private:
   string value;
public:
   SqlParamString(std::string p_value) : value(p_value) {
   }
   ~SqlParamString() {}
   int bind(DatabaseHandler &db, int index) {
       return db.bindString(value, index);
   }
};
typedef std::vector<std::unique_ptr<SqlParam>> SqlParamsContainer;
typedef std::unique_ptr<SqlParamInt> SqlParamIntPtr;
typedef std::unique_ptr<SqlParamString> SqlParamStringPtr;
在我的函数中,构建查询:

int buildQuery(RequestHandler &request) {
    SqlParamsContainer params;
    stringstream query << "SELECT * FROM Table WHERE A = ?";
    params.push_back(SqlParamIntPtr(new SqlParamInt(request.A())));
    if(request.has_B()) {
         params.push_back(SqlParamIntPtr(new SqlParamInt(request.B())));
         query << " AND B = ?";
    }
    if(request.has_C()) {
         params.push_back(SqlParamStringPtr(new SqlParamString(request.C())));
         query << " AND C = ?";
    }
    query << ";";
    db.prepare(query.str());
    for(int i = 0; i < v_container.size(); i++)
        v_container.at(i)->bind(db,i);
}

有Boost::任何时候,它比你要求的更通用,并且不阻止用户存储不支持的类型,你不需要担心创建相应的子类。

如果你想从你的DB Boost::Any返回结果也可能是答案。

我建议在绑定函数中限制类型,而不是在存储中。

如果你使用可变绑定函数,这是必要的。