我一直在研究用于 C++ 数据库访问的 OTL(Oracle、Odbc 和 DB2-CLI 模板库)。我不确定我传入的查询是否被转换为底层数据库的参数化查询,或者它基本上只是将所有参数连接成一个大字符串并以这种方式将查询传递给数据库。我看到您传递给它的查询可以包含参数的类型信息,但是从那时到查询命中数据库之间会发生什么,我不知道。
2 回答
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 如下所示:
SELECT * FROM staff WHERE fname=?
手册中描述了对于 MS SQL、DB2,您不能多次使用相同名称的占位符。创建具有占位符/绑定变量的 SQL 语句相对昂贵,因此如果您通过 otl_stream 实例化参数化 SQL,则尽可能多地重用流是有意义的。
如果您对如何改进 OTL 手册有更多问题或建议,请随时给我发电子邮件。
干杯,谢尔盖
pheadbaq 写道:
嗨,我最近一直在评估 C++ DB 库,以用作我希望构建的 ORM 库的基础,并且越来越倾向于 OTL。顺便说一句,它看起来非常漂亮,并且似乎可以满足我的大部分需求。我只有一个挥之不去的问题,我似乎无法通过阅读文档来澄清。OTL 是否将参数化查询传递给底层 DBMS,还是将我传递给 OTL 流的参数和查询连接成单个字符串并将其交给 DBMS?
换句话说,如果我将这个 MSSQL 查询连同字符串“Bob”作为绑定变量交给 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 上回复,我已经向 StackOverflow.com 发布了同样的问题: 是 C++ OTL SQL 数据库库在后台使用参数化查询还是字符串连接?
感谢您的时间
该文档讨论了所有关于绑定变量的内容。我假设库正在重写您的查询,但它可能只是将绑定变量的格式更改为您的 DBMS 期望的格式,然后将值绑定到绑定变量。