在delphi查询中使用@variables:=不起作用



我有以下问题:

ZQuery1.SQL.Text:= 
  ' SELECT                                                  '+
  '   IF(q.rank2 = 1, @rank:= 1, @rank:= @rank + 1) AS rank '+
  '   ,q.* FROM (                                            '+
  '   SELECT groep.id - MinGroepId(groep.id) AS rank2       '+
  '     ,groep.otherfields                                  '+
  '   FROM groep                                            '+
  '   ORDER BY rank2 ) q;                                   ';
ZQuery.Open;

当我运行这段代码时,我在ZQuery1中得到一个异常Incorrect token followed by ":"
我该如何解决这个问题?我需要用Delphi,因为我不能把这个选择在MySQL过程。
Zeos 6不支持返回结果集的MySQL过程。

注:
我使用Delphi 2007和MySQL 5.1与ZEOS 6.6.6。
虽然我很确定版本不重要。
我不愿意切换版本,因为我已经深入到项目中了。

这是不可能的,你只能参数化这个值。最好的方法是使用SQL。Text:= StringReplace()但是你失去了准备查询的速度

MySQL有能力让用户变量(基于会话)被引用到@(所以我讨厌说LaKraven有点偏离目标)。我有同样的问题与Dac MySQL (http://www.microolap.com/products/connectivity/mysqldac/)在工作中。他们通过添加特殊检查来检查':'后面的字符是否是'='来进行纠正,如果是,则不进行参数替换。

我不太了解Zeos组件,所以我唯一能建议的是跟踪执行路径,查看异常发生的位置,并修补代码以处理':='

的字符序列

我不知道这里是不是这样,但是你在SQL中有错误:IF中的分号应该用逗号代替,AS rankgroup之后缺少逗号是保留词,所以当用作表名时,应该用' '引用。

尝试设置TZQuery。ParamCheck为False。当':'是参数标记时,将禁用自动创建参数。

好了,我破解了一个解决方案。
但它确实是丑陋的,但它仍然工作(有点)。

编辑,这个工作在dbForge-MySQL和Delphi

首先,我在MySQL中创建了一个存储函数'ranking',它在@rank中存储一个值和/或偏移量。

CREATE DEFINER = 'root'@'localhost'
FUNCTION MyDatabase.Ranking(NewRank INT, Addition INT)
  RETURNS int(11)
BEGIN
  IF NOT(NewRank IS NULL) THEN SET @rank:= NewRank; END IF;
  IF NOT(Addition IS NULL) THEN SET @rank:= @rank + Addition; END IF;
  RETURN @rank;   
END

接下来,我将ZQuery1修改为:

select ranking(null,1) as rank
  ,groep.*
  from groep
join (select ranking(0,null)) r

可以工作,并且Delphi中的完整复杂代码也可以工作。(-_-')
又一次战胜邪恶的机器

总结一下。
@varname是存储过程中的持久(当然是在单个连接中)。在select语句和存储过程之间交换@varname在dbForge中是有效的,但是在Delphi中是失败的。

相关内容

  • 没有找到相关文章

最新更新