5

是否可以使用 执行 2 个插入或更新语句cfquery

如果是怎么办?

如果不是,在 Coldfusion 中执行多个查询的最佳方法是什么,只打开一个与数据库的连接。

我认为每次我们打电话时,cfquery我们都会打开新的连接数据库

4

6 回答 6

5

是否可以使用 cfquery 执行 2 个插入或更新语句?

很可能是的。但是您是否可以运行多个语句取决于您的数据库类型和驱动程序/连接设置。例如,当您创建 MS SQL 数据源时,默认情况下允许 IIRC 多条语句。而 MySQL 驱动程序通常默认禁用多个语句。那是为了帮助避免sql注入。因此,在这种情况下,您必须在连接设置中明确启用多个语句。否则,您不能使用多个语句。还有一些数据库(通常是 MS Access 等桌面数据库)根本不支持多语句。所以我认为这个问题没有一个笼统的答案。

如果这两个插入/更新语句是相关的,那么您绝对应该按照 Sam 的建议使用 cftransaction。这确保了语句被视为一个单一的单元:即它们要么全部成功,要么全部失败。因此,您不会留下部分或不一致的数据。为了实现这一点,事务中的两个查询都将使用一个连接。

我认为每次我们调用 cfquery 时,我们都会打开新的连接数据库

正如 Sam 提到的,这取决于您的设置以及您是否使用 cftransaction。如果您启用维护连接(在 CF 管理员的数据源设置下),CF 将维护一个打开的连接池。因此,当您运行查询时,CF 只是从池中获取一个打开的连接,而不是每次都打开一个新连接。使用 cftransaction 时,应为所有查询使用相同的连接。无论是否启用维护连接。

于 2009-12-10T20:39:56.433 回答
4

在数据源设置中,您可以使用“维护连接”设置告诉它是否保持连接打开。

我相信,从一开始,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。

于 2009-12-10T18:41:43.080 回答
4

CF8 中的 mySQL 驱动程序现在允许多个语句。正如山姆所说,你可以使用将许多语句组合在一起或在coldfusion 管理员中| 数据与服务 | 数据源,将 allowMultiQueries=true添加 到 Connection String 字段

于 2010-07-22T16:20:26.097 回答
3

我没有 CF 服务器可以尝试,但它应该可以正常工作 IIRC。

就像是:

<cfquery name="doubleInsert" datasource="dsn">
insert into table1 values(x,y,z)
insert into table1 values(a,b,c)
</cfquery>

如果您想要更具体的示例,则必须提供更具体的信息。

编辑:感谢@SamFarmer:比我用过的更新版本的CF可能会阻止这种情况

于 2009-12-10T18:28:32.323 回答
1

对不起死灵(我是该网站的新手)。

你没有提到你正在使用什么数据库。如果您碰巧使用 mySQL,您可以添加最大堆大小允许的尽可能多的记录。

我定期使用默认堆大小一次最多插入约 4500 条记录(但这取决于您拥有的数据量)。

INSERT INTO yourTable (x,y,z) VALUES ('a','b','c'),('d','e','f'),('g','h','i')

所有数据库都应执行此 IMO。

高温高压

于 2010-01-06T16:33:52.140 回答
0

使用 CFTRANSACTION 将多个查询分组到一个单元中。

使用 CFQUERY 执行并放置在 和 标记之间的任何查询都被视为单个事务。这些查询请求的数据更改不会提交到数据库,直到事务块中的所有操作都已成功执行。如果查询中发生错误,则事务块中先前查询所做的所有更改都将回滚。

使用 ISOLATION 属性对数据库引擎在事务期间如何执行锁定进行额外控制。

有关更多信息,请访问http://www.adobe.com/livedocs/coldfusion/5.0/CFML_Reference/Tags103.htm

于 2010-01-04T12:25:19.620 回答