代码之家  ›  专栏  ›  技术社区  ›  Brett Rossier

C++ OTL SQL数据库库使用引擎下的参数化查询,还是字符串CONTAT?

  •  4
  • Brett Rossier  · 技术社区  · 15 年前

    我一直在看OTL(Oracle,ODBC和DB2-CII模板库),用于C++数据库访问。我不确定我传入的查询是否被转换为底层数据库的参数化查询,或者它基本上只是将所有参数连接成一个大字符串并以这种方式将查询传递给数据库。我看到您传递给它的查询可以包含参数的类型信息,但是我不知道从那时到查询命中数据库之间会发生什么。

    2 回复  |  直到 14 年前
        1
  •  5
  •   Community CDub    8 年前

    OTL作者对我电子邮件的回复:

    OTL将带有占位符的查询传递到DBAPI层。实际绑定变量的命名约定对于不同的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=?
    

    手册中描述过,对于MS SQL、DB2,不能多次使用相同名称的占位符。具有占位符/绑定变量的SQL语句的创建成本相对较高,因此,如果通过OTL_流实例化参数化SQL,则尽可能多地重用该流是有意义的。

    如果您对我如何改进OTL手册有更多的问题或建议,请随时给我发电子邮件。

    干杯, 谢尔盖

    菲亚巴克写道:

    嗨,我最近一直在评估C++数据库,以作为我希望构建的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上: Is C++ OTL SQL database library using parameterized queries under the hood, or string concat?

    谢谢你抽出时间

        2
  •  1
  •   Ken Bloom    15 年前

    The documentation 讨论绑定变量。我想图书馆 重写查询,但它可能只是将绑定变量的格式更改为DBMS期望的格式,然后将值绑定到绑定变量。

    推荐文章