【问题标题】:mySql Query works in query browser but fails when I run in CFquerymySql Query 在查询浏览器中工作,但在 CFquery 中运行时失败
【发布时间】:2009-12-31 17:15:55
【问题描述】:

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

【问题讨论】:

  • 可能是数据库驱动程序问题?
  • 真的吗?你认为是 @myRight := rgt 语法爆炸了吗?

标签: mysql coldfusion cfquery


【解决方案1】:

除非您在 MySQL 服务器上明确允许它,否则您不能在同一个 cfquery 中拥有多个 sql 语句。 MySQL 默认拒绝了这一点,因此您的每个更新和插入语句都必须在它们自己的 cfquery 标记中。

【讨论】:

  • 如何在 mySql 服务器上明确允许它?
  • 如果我将它们放在不同的 cfquery 块中,我可以将它们放入 cftransaction 中还是 mysql 不会那样?
  • 这是dev.mysql.com/doc/refman/5.0/en/c-api-multiple-queries.html 的技术答案,但如果我记得这是一个服务器设置,您应该可以使用任何用于管理服务器的软件(navicat、sqlyog 等)进行更改。具体我记不太清了。和你一样,我大部分时间都花在 SQL Server(或 Oracle)上。
  • mysql 变量会在 cfquery 块上持续存在吗?
  • 你应该能够毫无问题地将它们放入 cftransaction 块中,尽管我不能肯定地说,因为我面前没有 MySQL 设置来测试它。
【解决方案2】:

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>

【讨论】:

  • 存储过程怎么样?这在存储过程中会更好吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-31
  • 1970-01-01
  • 1970-01-01
  • 2016-03-12
  • 1970-01-01
相关资源
最近更新 更多