【发布时间】:2009-12-10 18:19:51
【问题描述】:
是否可以使用cfquery 执行 2 个插入或更新语句?
如果是怎么办?
如果不是,在 Coldfusion 中执行多个查询的最佳方式是什么,只打开一个与 DB 的连接。
我认为每次我们调用cfquery 时,我们都会打开新的连接数据库
【问题讨论】:
标签: coldfusion cfquery
是否可以使用cfquery 执行 2 个插入或更新语句?
如果是怎么办?
如果不是,在 Coldfusion 中执行多个查询的最佳方式是什么,只打开一个与 DB 的连接。
我认为每次我们调用cfquery 时,我们都会打开新的连接数据库
【问题讨论】:
标签: coldfusion cfquery
是否可以执行 2 插入或 使用 cfquery 更新语句?
很可能是的。但是您是否可以运行多个语句取决于您的数据库类型和驱动程序/连接设置。例如,当您创建 MS SQL 数据源时,默认情况下允许 IIRC 多条语句。而 MySQL 驱动程序默认情况下经常禁用多个语句。那是为了帮助避免sql注入。因此,在这种情况下,您必须在连接设置中明确启用多个语句。否则,您不能使用多个语句。还有一些数据库(通常是 MS Access 等桌面数据库)根本不支持多语句。所以我认为这个问题没有一个笼统的答案。
如果这两个插入/更新语句是相关的,那么您绝对应该按照 Sam 的建议使用 cftransaction。这确保了语句被视为一个单一的单元:即它们要么全部成功,要么全部失败。因此,您不会留下部分或不一致的数据。为了实现这一点,事务中的两个查询都将使用一个连接。
我认为每次我们调用 cfquery 正在打开新的连接数据库
正如 Sam 所说,这取决于您的设置以及您是否使用 cftransaction。如果您启用维护连接(在 CF 管理员的数据源设置下),CF 将维护一个打开的连接池。因此,当您运行查询时,CF 只是从池中获取一个打开的连接,而不是每次都打开一个新连接。使用 cftransaction 时,应为所有查询使用相同的连接。无论是否启用维护连接。
【讨论】:
在数据源设置中,您可以通过“维护连接”设置告诉它是否保持连接打开。
我相信,从一开始,ColdFusion 8 数据源就被设置为一次只运行一个查询,因为存在 SQL 注入问题。要更改此设置,您需要使用连接字符串进行修改。
最好的办法是打开维护连接,如果需要,使用 cftransaction:
<cftransaction>
<cfquery name="ins" datasource="dsn">
insert into table1 values(<cfqueryparam value="#url.x#">)
</cfquery>
<cfquery name="ins" datasource="dsn">
insert into table2 values(<cfqueryparam value="#url.x#">)
</cfquery>
</cftransaction>
始终,始终对用户提交的值使用 cfqueryparam。
【讨论】:
CF8 中的 mySQL 驱动程序现在允许多条语句。 正如 Sam 所说,您可以使用 将许多语句组合在一起 或在coldfusion 管理员|数据与服务 |数据源, 添加 allowMultiQueries=true 到连接字符串字段
【讨论】:
我没有 CF 服务器可以尝试,但 IIRC 应该可以正常工作。
类似:
<cfquery name="doubleInsert" datasource="dsn">
insert into table1 values(x,y,z)
insert into table1 values(a,b,c)
</cfquery>
如果您需要更具体的示例,您必须提供更具体的信息。
编辑:感谢@SamFarmer:比我使用的新版本的 CF 可能会阻止这种情况
【讨论】:
对不起 Necro(我是该网站的新手)。
你没有提到你正在使用什么数据库。如果您碰巧使用 mySQL,您可以添加尽可能多的记录,只要最大堆大小允许。
我定期使用默认堆大小一次最多插入约 4500 条记录(但这取决于您拥有的数据量)。
INSERT INTO yourTable (x,y,z) VALUES ('a','b','c'),('d','e','f'),('g','h','i')
所有数据库都应该这样做 IMO。
HTH
【讨论】:
使用 CFTRANSACTION 将多个查询分组到一个单元中。
使用 CFQUERY 执行并放置在 和 标记之间的任何查询都被视为单个事务。这些查询请求的数据更改不会提交到数据库,直到事务块中的所有操作都已成功执行。如果查询发生错误,事务块中先前查询所做的所有更改都会回滚。
使用 ISOLATION 属性对数据库引擎在事务期间如何执行锁定进行额外控制。
欲了解更多信息,请访问http://www.adobe.com/livedocs/coldfusion/5.0/CFML_Reference/Tags103.htm
【讨论】: