我一直在研究用于 C++ 数据库访问的 OTL(Oracle、Odbc 和 DB2-CLI 模板库)。我不确定我传入的查询是否转换为底层数据库的参数化查询,或者它是否基本上只是将所有参数连接成一个大字符串并以这种方式将查询传递给数据库。我看到您传递给它的查询可以包含参数的类型信息,但是我不知道从那时到查询访问数据库之间发生了什么。
最佳答案
OTL 作者对我的电子邮件的回复:
OTL 将带有占位符的查询传递到数据库 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 手册有更多疑问或建议,请随时给我发电子邮件。
干杯, 谢尔盖
phadbaq 写道:
您好,我最近一直在评估 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?
谢谢你的时间
关于c++ - C++ OTL SQL 数据库库是在后台使用参数化查询还是字符串连接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3149974/