我一直在寻找用于C++数据库访问的OTL(Oracle,Odbc和DB2-CLI模板库)。我不确定是否将传入的查询转换为针对基础数据库的参数化查询,或者基本上只是将所有参数连接成一个大字符串并将查询以这种方式传递给数据库。我看到传递给它的查询可以包含参数的类型信息,但是我无法确定从那时到查询命中数据库之间会发生什么。
最佳答案
OTL作者对我的电子邮件的回复:
OTL将带有占位符的查询传递到DB API层。对于不同的数据库类型,实际绑定(bind)变量的命名约定不同。对Oracle说,
SELECT * FROM staff WHERE fname=:f_name<char[20]>
将被翻译成:
SELECT * FROM staff WHERE fname=:f_name
再加上一堆主机变量绑定(bind)调用。
对于MS SQL Server或DB2,相同的SELECT看起来像这样:
SELECT * FROM staff WHERE fname=?
手册中描述了,对于MS SQL,DB2,不能有多个相同名称的占位符。具有占位符/绑定(bind)变量的SQL语句创建起来相对昂贵,因此,如果通过otl_stream实例化参数化的SQL,则尽可能多地重用该流是有意义的。
如果您还有其他问题或对如何改进OTL手册的建议,请随时给我发送电子邮件。
干杯,
谢尔盖
pheadbaq写道:
嗨,我最近一直在评估C++ DB库,将其用作我要构建的ORM库的基础,并且越来越倾向于OTL。顺便说一句,它看起来非常不错,并且看起来可以满足我的大多数需求。我只有一个挥之不去的问题,我似乎无法通过阅读文档来澄清。 OTL是将参数化查询传递给基础DBMS,还是将我传递给OTL流的参数和查询合并为一个字符串,然后传递给DBMS?
换句话说,如果我将这个MSSQL查询以及字符串“Bob”作为绑定(bind)变量进行OTL处理:
SELECT * FROM staff WHERE fname = :f_name<char[20]>
OTL解析器是否产生以下内容:
SELECT * FROM staff WHERE fname = 'Bob'
或这个:
SELECT * FROM staff WHERE fname = @f_name
连同我的字符串作为参数
如果您想在此处答复,我已经将相同的问题发布到StackOverflow.com:
Is C++ OTL SQL database library using parameterized queries under the hood, or string concat?
感谢您的时间