C ++ OTL SQL数据库库是否使用引擎盖下的参数化查询?
-
01-10-2019 - |
题
我一直在查看C ++数据库访问的OTL(Oracle,ODBC和DB2-CLI模板库)。我不确定我输入的查询是否已转换为基础数据库的参数化查询,或者基本上只是将所有参数串联到一个大字符串中并以这种方式将查询传递到数据库。我看到您传递给它的查询可以包含参数的类型信息,但是当时和查询击中数据库之间发生了什么,我无法分辨。
解决方案
OTL作者对我的电子邮件的回复:
OTL将占位符的查询传递到DB API层中。对于不同的DB类型,实际绑定变量的命名约定是不同的。说,对于甲骨文,
SELECT * FROM staff WHERE fname=:f_name<char[20]>
将被翻译成:
SELECT * FROM staff WHERE fname=:f_name
加上一堆主机变量绑定呼叫。
对于MS SQL Server或DB2,相同的选择看起来像这样:
SELECT * FROM staff WHERE fname=?
在手册中描述的是,对于SQL MS DB2,您不能拥有多次具有相同名称的占位符。带有占位符 /绑定变量的SQL语句的创建相对昂贵,因此,如果您通过OTL_Stream实例化了参数化的SQL,则尽可能多地重复使用流。
如果您对如何改进OTL手册有更多疑问或建议,请随时给我发送电子邮件。
干杯,谢尔盖
Pheadbaq写道:
嗨,我最近一直在评估C ++ DB库作为我希望构建的ORM库的基础,并且越来越多地吸引了OTL。顺便说一下,它看起来非常好,似乎它可以满足我所拥有的大多数需求。我只有一个挥之不去的问题,我似乎无法通过阅读文档来澄清。 OTL是将参数化查询传递到基础DBM的,还是将我传递给OTL流的参数和查询将其连接到单个字符串中并将其交给DBMS?
换句话说,如果我将此MSSQL查询授予OTL,以及字符串“ Bob”作为绑定变量:
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:C ++ OTL SQL数据库库是否使用引擎盖下的参数化查询?
感谢您的时间
其他提示
文档 谈论绑定变量。我认为图书馆 是 重写查询,但它可能只是将绑定变量的格式更改为DBMS期望的格式,然后将值绑定到绑定变量。