是否可以使用cfquery
执行2插入或更新语句?
如果是,如何?
如果不是,通过只打开一个与DB的连接,在Coldfusion中执行多个查询的最佳方法是什么。
我想我们每次打电话cfquery
时都会打开新的连接数据库
答案 0 :(得分:5)
是否可以执行2插入或 使用cfquery更新语句?
很可能是的。但是,您是否可以运行多个语句取决于您的数据库类型和驱动程序/连接设置。例如,在创建MS SQL数据源时,默认情况下允许IIRC多个语句。而MySQL驱动程序通常默认情况下禁用多个语句。那是为了避免sql注入。因此,在这种情况下,您必须在连接设置中明确启用多个语句。否则,您不能使用多个语句。还有一些数据库(通常是像MS Access这样的桌面数据库)根本不支持多个语句。所以我不认为这个问题有一个全面的答案。
如果两个插入/更新语句是相关的,你肯定应该像Sam建议的那样使用cftransaction。这确保了语句被视为一个单元:即它们都成功或者都失败了。因此,您不会留下部分或不一致的数据。为了实现这一点,单个连接将用于事务中的两个查询。
我想我们每次打电话给cfquery 正在打开新的连接数据库
正如Sam所说,这取决于您的设置以及您是否正在使用cftransaction。如果启用“维护连接”(在CF管理员的“数据源”设置下),CF将维护一个打开的连接池。因此,当您运行查询时,CF只会从池中获取打开的连接,而不是每次都打开一个新连接。使用cftransaction时,应对所有查询使用相同的连接。无论是否启用维护连接。
答案 1 :(得分:4)
在数据源设置中,您可以使用“维护连接”设置告诉它是否保持连接打开。
首先,我认为,由于担心SQL注入,ColdFusion 8数据源被设置为一次只运行一个查询。要更改此设置,您需要使用连接字符串进行修改。
您最好的选择是打开维护连接,如果需要,请使用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用于用户提交的值。
答案 2 :(得分:3)
我没有CF服务器试试,但它应该可以正常工作。
类似的东西:
<cfquery name="doubleInsert" datasource="dsn">
insert into table1 values(x,y,z)
insert into table1 values(a,b,c)
</cfquery>
如果您想要更具体的示例,则必须提供更具体的信息。
编辑:感谢@SamFarmer:比我使用的CF版本更新可能会阻止此
答案 3 :(得分:3)
CF8中的mySQL驱动程序现在允许多个语句。 正如Sam所说,你可以使用 将许多语句组合在一起 或者在coldfusion管理员中|数据&amp;服务|数据源, 加 的 allowMultiQueries =真强> 连接字符串字段
答案 4 :(得分:1)
对不起Necro(我是网站的新用户)。
您没有提到您正在使用的数据库。如果您碰巧使用mySQL,您可以添加最大堆大小允许的记录数。
我定期使用默认堆大小一次插入最多约4500条记录(但这取决于您拥有的数据量)。
INSERT INTO YourTable(x,y,z)VALUES('a','b','c'),('d','e','f'),('g','h' , 'I')
所有数据库都应该这样做IMO。
HTH
答案 5 :(得分:0)
使用CFTRANSACTION将多个查询分组到一个单元中。
使用CFQUERY执行并放在和标记之间的任何查询都被视为单个事务。在事务块中的所有操作都成功执行之前,不会将对这些查询所请求的数据的更改提交到数据库。如果查询中发生错误,则会回滚事务块中先前查询所做的所有更改。
使用ISOLATION属性可以进一步控制数据库引擎在事务期间执行锁定的方式。
有关详细信息,请访问http://www.adobe.com/livedocs/coldfusion/5.0/CFML_Reference/Tags103.htm