【问题标题】:Can I add a string type parameter to a SQL statement without quotes?我可以在不带引号的 SQL 语句中添加字符串类型参数吗?
【发布时间】: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


【解决方案1】:

当您的输入值显然不是整数时,为什么要将参数的 DataType 定义为 ftInteger?您应该将DataType 定义为ftDateTime,然后将Now() 按原样 分配给参数的Value。让数据库引擎根据自己的规则决定如何格式化最终 SQL 中的日期/时间值。

query->Parameters->CreateParameter("dateTime", ftDateTime, pdInput, 0, Now());

【讨论】:

  • 那是一个错字,我是想写 ftString。如果数据库引擎与数据库技术无关,这仍然有效吗?生产环境中有三个数据库,都通过 ODBC 驱动程序连接,到目前为止我还没有找到任何方法来告诉数据库引擎底层是哪种技术。
  • @Tigerplush "我的意思是写 ftString" - 如果实际列是日期/时间类型而不是字符串类型,那仍然是错误的类型。 “如果数据库引擎与数据库技术无关,这仍然有效吗?” - 是的,如果使用得当。 “生产环境中有三个数据库,都通过 ODBC 驱动程序连接,到目前为止,我还没有找到任何可能告诉数据库引擎底层的技术。” - 你不需要.
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-04
  • 2015-03-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多