1

起初我以为我遇到了 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'

供应商错误代码:1064 SQL 状态:42000

4

2 回答 2

1

Unless you've explicitly allowed it on your MySQL server, you can't have multiple sql statements in the same cfquery. MySQL denies this by defualt, so each of your update and insert statements have to be in their own cfquery tags.

于 2009-12-31T17:21:18.613 回答
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>
于 2009-12-31T17:43:33.857 回答