mySql Query在查询浏览器中工作,但在CFquery中运行时失败

时间:2009-12-31 17:15:56

标签: mysql coldfusion cfquery

起初我以为我遇到了cfqueryparam和mysql的问题。但是,当我更改用静态值替换它时,我得到相同的错误。这让我感到难过,我猜我已经习惯了Microsoft SQL Server。任何帮助将不胜感激。

这是查询,这在mySql查询浏览器中完美运行,但在cfquery中运行时失败:

LOCK TABLE categories WRITE;

SELECT @myRight := rgt FROM categories WHERE catid = <cfqueryparam cfsqltype="cf_sql_integer" value="#parentCategoryId#">;

UPDATE categories SET rgt = rgt + 2 WHERE rgt > @myRight;
UPDATE categories SET lft = lft + 2 WHERE lft > @myRight;

INSERT INTO categories(categoryName, lft, rgt) VALUES(<cfqueryparam cfsqltype="cf_sql_varchar" value="#newCatName#">, @myRight, @myRight + 2);

UNLOCK TABLES;

我收到以下错误:

  

您的SQL语法有错误;检查与您的MySQL服务器版本对应的手册,以便在'SELECT @myRight:= rgt FROM categories WHERE catid = 5附近使用正确的语法;在第2行更新类别SE'

     

VENDORERRORCODE:1064   SQL状态:42000

2 个答案:

答案 0 :(得分:1)

除非您在MySQL服务器上明确允许它,否则在同一个cfquery中不能有多个sql语句。 MySQL通过defualt拒绝这一点,所以你的每个update和insert语句都必须在他们自己的cfquery标签中。

答案 1 :(得分:1)

CFGears是对的,你不能在一个语句中放置多个查询。

要从cf执行此操作,您需要避开mySQL变量。 (无论如何这都很好,因为如果你坚持使用或多或少的标准SQL,你的应用程序将更容易移植到其他品牌的表服务器。)像这样的东西?如果您正在处理myISAM表,则需要在此处放置锁表​​并解锁表。如果您正在使用InnoDB,那么在事务中执行它将正常工作。

这样的事情可能有用。

<cfquery name ="getright" datasource="#whatever#">
SELECT rgt 
  FROM categories 
 WHERE catid = <cfqueryparam cfsqltype="cf_sql_integer" value="#parentCategoryId#">
</cfquery>

<cfquery name="rgt_up_2" datasource="#whatever#">
UPDATE categories 
   SET rgt = rgt + 2 
 WHERE rgt >
  (SELECT rgt 
     FROM categories 
    WHERE catid = <cfqueryparam cfsqltype="cf_sql_integer" value="#parentCategoryId#">)
</cfquery>

<cfquery name="lft_up_2" datasource="#whatever#">
UPDATE categories 
   SET lft = lft + 2 
 WHERE lft >
  (SELECT rgt 
     FROM categories 
    WHERE catid = <cfqueryparam cfsqltype="cf_sql_integer" value="#parentCategoryId#">)
</cfquery>

<cfquery name="insrgt" datasource="#whatever#">
INSERT INTO categories(categoryName, lft, rgt) VALUES(
<cfqueryparam cfsqltype="cf_sql_varchar" value="#newCatName#">,
<cfqueryparam cfsqltype="cf_sql_integer" value="#getright.rgt#">,
<cfqueryparam cfsqltype="cf_sql_integer" value="#getright.rgt#"> + 2)
</cfquery>