sql参数的最佳stl容器
Best stl container for sql parameters
我必须建立一个动态sql查询。要正确执行它,我必须分三个步骤:
- <
- 准备声明/gh>
- 用函数绑定参数:bindString(字符串值,int索引);binint (int value, int index);
因为这个查询是动态构建的,所以我必须为给定的索引存储适当的值。
例如:
SELECT * FROM Table WHERE A = ?AND E = '?';
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返回结果也可能是答案。
我建议在绑定函数中限制类型,而不是在存储中。
相关文章:
- 在STL容器中使用模板类
- 检查函数返回类型是否与STL容器类型值相同
- 为什么 STL 容器适配器堆栈中的 top 返回常量引用?
- 如果我真的真的想从 STL 容器继承,并且我继承构造函数并删除新运算符,会发生什么?
- 对象 C++ 向量的 STL 容器
- 如何在不破坏现有应用程序的情况下更改 API 中 stl 容器的数据类型?
- 在 STL 容器的 STL 容器上调用 clear
- "迭代器"和"const_iterator"不是 STL 容器的必需成员?
- 删除包含包含动态对象的 STL 容器的智能指针
- C++:在子类中扩展静态 STL 容器/映射成员?
- ostream 运算符<< 为获取 STL 容器而过载,传递 std::string 会破坏它?
- 没有 STL 容器的迭代器
- 为什么某些 STL 容器(堆栈、队列、优先级队列)不支持迭代器?
- 接受任何 STL 容器的函数
- C++ STL 容器中优先级搜索的优雅方法
- 我们如何打印出C++ STL 容器的value_type?
- 获取嵌套 stl 容器的大小(以字节为单位)
- 如何在C++中重新实现包含指针的 STL 容器的类的迭代器
- 迭代器和 STL 容器的关系
- 如何用索引增量generate_n填充STL容器