3

次の問題があります。

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;

このコードを実行するとIncorrect token followed by ":"、ZQuery1で例外が発生します。
これを修正するにはどうすればよいですか?この選択をMySQLプロシージャに入れることができないため、Delphiを使用する必要があります。
Zeos 6は、結果セットを返すMySQLプロシージャをサポートしていません。

PS
私はDelphi2007とMySQL5.1をZEOS6.6.6で使用しています。
バージョンは関係ないと思いますが。
プロジェクトに深く関わっているので、バージョンを切り替えるつもりはありません。

4

5 に答える 5

2

これは実行できません。値をパラメーター化することしかできません。最善の方法はSQL.Text:= StringReplace()ですが、クエリの準備速度が低下します。

于 2011-04-11T19:37:25.787 に答える
1

MySQLには、@を参照するユーザー変数(セッションベース)を持つ機能があります(したがって、LaKravenは少し外れているとは言いたくありません)。Dac for MySQL(http://www.microolap.com/products/connectivity/mysqldac/)で同じ問題が発生しました。彼らは、「:」の後の文字が「=」であるかどうかを確認するために特別なチェックを入れて修正しました。そうである場合、パラメーターの置換は発生しませんでした。

Zeosコンポーネントについてはあまり詳しくないので、実行パスをたどって例外が発生している場所を確認し、コードにパッチを適用して':='の文字シーケンスを処理することだけをお勧めします。

于 2011-04-11T20:11:18.303 に答える
0

TZQuery.ParamCheckをFalseに設定してみてください。':'がパラメータマーカーの場合、自動パラメータ作成が無効になります。

于 2011-04-11T20:10:50.713 に答える
0

これがここに当てはまるかどうかはわかりませんが、SQL にエラーがあります: セミコロンIFはコンマに置き換える必要があります。後にコンマがなく、AS rank予約group語であるため、テーブル名として使用する場合は `` で引用する必要があります.

于 2011-04-11T19:43:27.277 に答える
0

OK、解決策をハックしました。
しかし、それは確かに醜いですが、それでも機能します(ちょっと)。

編集、これはdbForge-MySQLとDelphiで動作します

最初に、MySQL でストアド関数「ランキング」を作成しました。これは、@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 の完全な複雑なコードも機能します。(-_-')
邪悪な機械に対するもう 1 つの勝利

要約すると。
@varname は、ストアド プロシージャ内 (もちろん、単一の接続内)で永続的です。
select ステートメントとストアド プロシージャの間で @varname を交換すると、dbForge では機能しますが、Delphiでは失敗します。

于 2011-04-11T20:35:38.870 に答える