Bre*_*ier 4 c++ sql parameterized otl
我一直在寻找用于C++数据库访问的OTL(Oracle,Odbc和DB2-CLI模板库).我不确定我传入的查询是否转换为底层数据库的参数化查询,或者它是否基本上只是将所有参数连接成一个大字符串并将查询传递给数据库.我看到你传递给它的查询可以包含参数的类型信息,但是当时和查询命中数据库之间会发生什么,我无法分辨.
OTL将带占位符的查询传递到DB API层.对于不同的DB类型,实际绑定变量的命名约定是不同的.对于Oracle来说,
SELECT * FROM staff WHERE fname=:f_name<char[20]>
Run Code Online (Sandbox Code Playgroud)
将被翻译成:
SELECT * FROM staff WHERE fname=:f_name
Run Code Online (Sandbox Code Playgroud)
加上一堆主机变量绑定调用.
对于MS SQL Server或DB2,相同的SELECT将如下所示:
SELECT * FROM staff WHERE fname=?
Run Code Online (Sandbox Code Playgroud)
手册中描述了对于MS SQL,DB2,您不能多次使用具有相同名称的占位符.使用占位符/绑定变量的SQL语句创建起来相对昂贵,因此如果通过otl_stream实例化参数化SQL,则尽可能多地重用流是有意义的.
如果您有更多问题或有关如何改进OTL手册的建议,请随时给我发电子邮件.
干杯谢尔盖
pheadbaq写道:
嗨,我最近一直在评估C++ DB库,作为我希望构建的ORM库的基础,并且越来越多地倾向于OTL.顺便说一下它看起来很漂亮,似乎它可以满足我的大部分需求.我只是有一个挥之不去的问题,我似乎无法通过阅读文档来澄清.OTL是否将参数化查询传递给底层DBMS,或者它是否将参数和查询连接到OTL流并将其传递到单个字符串并将其传递给DBMS?
换句话说,如果我将OTL这个MSSQL查询以及字符串"Bob"作为绑定变量传递给OTL:
SELECT * FROM staff WHERE fname = :f_name<char[20]>
Run Code Online (Sandbox Code Playgroud)
OTL解析器是否产生以下结果:
SELECT * FROM staff WHERE fname = 'Bob'
Run Code Online (Sandbox Code Playgroud)
或这个:
SELECT * FROM staff WHERE fname = @f_name
Run Code Online (Sandbox Code Playgroud)
以及我的字符串作为参数
我已经向StackOverflow.com发布了同样的问题,如果你想在那里做出回应: C++ OTL SQL数据库库是否使用参数化查询或字符串连接?
感谢您的时间
| 归档时间: |
|
| 查看次数: |
3298 次 |
| 最近记录: |