Delphi XE7使用UniDAC执行MySQL触发器代码报语法错误求助
问题原因与解决方案
你遇到的问题核心在于DELIMITER是MySQL客户端工具(比如命令行、HeidiSQL)专属的命令,并不是MySQL服务器能识别的SQL语法。
当你在HeidiSQL或命令行里使用DELIMITER时,是告诉客户端:“接下来我要用//作为语句的结束分隔符,直到我改回;”——这个过程是客户端在处理,不会把DELIMITER命令发送给MySQL服务器。但Delphi的SQL组件(比如TQuery、TSQLQuery)会把你写的所有内容原封不动发送给服务器,服务器看到DELIMITER就会判定为语法错误,因为它根本不认识这个命令。
正确的Delphi代码写法
直接去掉所有DELIMITER相关的行,把触发器的创建语句作为完整的SQL块发送即可。另外注意Delphi里字符串中的单引号需要用两个单引号转义:
sorgu.Close; sorgu.SQL.Clear; sorgu.SQL.Add('CREATE TRIGGER pdfdenemeu BEFORE INSERT'); sorgu.SQL.Add('ON denemetbl'); sorgu.SQL.Add('FOR EACH ROW'); sorgu.SQL.Add('BEGIN'); // 这里的两个单引号是Delphi的字符串转义方式 sorgu.SQL.Add('SET NEW.iki = CONCAT(NEW.bir,''''.pdf'''');'); sorgu.SQL.Add('END'); sorgu.ExecSQL;
为什么这样能行?
Delphi的SQL组件会把整个CREATE TRIGGER语句作为一个单独的命令发送给MySQL服务器,服务器本身可以正确解析BEGIN...END块内部的分号,不需要客户端提前修改分隔符。
你之前在客户端工具里需要用DELIMITER,是因为客户端默认以分号作为语句结束标记,如果触发器内部有分号,客户端会误以为整个SQL已经结束,提前发送不完整的语句给服务器。但Delphi的组件是把你添加的所有SQL行拼接成一个完整的字符串后再发送,不存在这个问题,所以完全不需要DELIMITER。
内容的提问来源于stack exchange,提问作者Sheshman
相关产品推荐
相关产品推荐

