【发布时间】:2022-01-14 13:44:39
【问题描述】:
我有一个带有类似参数的 C++Builder SQL 语句
UnicodeString SQLStatement = "INSERT INTO TABLENAME (DATETIME) VALUES (:dateTime)"
我可以添加参数不带引号吗?
通常我会使用
TADOQuery *query = new TADOQuery(NULL);
query->Parameters->CreateParameter("dateTime", ftString, pdInput, 255, DateTimeToStr(Now()));
最终会产生 SQL 字符串
INSERT INTO TABLENAME (DATETIME) VALUES ('2022-01-14 14:33:00.000')
但因为这是一个遗留项目(当然,它总是如此)并且我必须维护不同的数据库技术,我需要能够注入数据库特定的日期时间转换方法,以便最终结果看起来像
INSERT INTO TABLENAME (DATETIME) VALUES (to_date('2022-01-14 14:33:00.000', 'dd.mm.yyyy hh24:mi:ss')))
如果我尝试通过我的“常规”方法注入它(因为我认为我不能将第二个参数注入到这个方法中)它看起来像:
TADOQuery *query = new TADOQuery(NULL);
query->Parameters->CreateParameter("dateTime", ftInteger, pdInput, 255, "to_date('" + DateTimeToStr(Now()) + "', 'dd.mm.yyyy hh24:mi:ss')");
但结果当然是这样的:
INSERT INTO TABLENAME (DATETIME) VALUES ('to_date('2022-01-14 14:33:00.000', 'dd.mm.yyyy hh24:mi:ss')'))
因此无效
或者还有其他方法可以更干净、更优雅地做到这一点吗?虽然我会接受“工作”。
我可以通过准备两条 SQL 语句来解决这个问题,并在使用另一种数据库技术时切换语句,但我只是想检查是否有其他方法。
【问题讨论】:
-
C++Builder 真的接受参数化查询,然后用字符串替换参数吗?如果是这样,那么这似乎是一个非常糟糕的库,因为它应该只传递参数化的 SQL 字符串并绑定参数值。
-
@MT0 它确实将参数绑定传递给数据库引擎。它是最终以它想要的正确格式生成 SQL 的引擎。这是使用参数化查询的好处之一
标签: c++ sql oracle11g c++builder