"sql statement not set"和"preparestatement:Dynamic sql error"

本文记录了在使用Lazarus进行数据库操作时遇到的问题及解决过程,包括sqlstatementnotset错误和preparestatement:Dynamicsqlerror错误的原因分析及解决办法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天试了一下Lazarus的FB操作能力,反得提示“sql statement not set”,因为SQLQuery是用来插入数据的,所以sql属性没有设置,而是动态赋值:Insert...

但是老提示上面的错,刚开始以为是插入也需要一个默认的sql,其实是自已搞错了,sql语句设了,但没有赋值过去;还有一个错,老是报“preparestatement:Dynamic sql error”,

看了一下,以为是Lazarus不支持Execute procedure 的存储过程,试了N久,才发现是自已错了,数据库太老了,存储过程没有更新,所以SQL语句传入的

参数和数据库里的Procedure 参数不一致,导致报错,重新修改数据库,OK;

CREATE DEFINER=`zd_shiwenchao`@`10.212.1.15` PROCEDURE `JGJS_RADS_EAST_CHECK`() BEGIN -- 1、声明变量 DECLARE DONE INT DEFAULT FALSE; DECLARE V_SERIAL VARCHAR(50); -- 标记游标循环是否完成 DECLARE V_TABLE VARCHAR(255); -- 存储从CHECKRULES表中获取的表名 DECLARE V_SQL TEXT; -- 存储从CHECKRULES表中获取的SQL语句 DECLARE V_DATAITEMNAME VARCHAR(255); -- 存储列名(COLUMNNAME) DECLARE V_COMMIT INT DEFAULT 1; -- 定义事务用,1为正常,-10为失败 DECLARE V_MSG TEXT; -- 记录错误信息 DECLARE V_CNT INT; -- 用于记录成功时的数据量 DECLARE V_ENDDATE DATETIME DEFAULT NOW(); -- 记录当前时间 DECLARE CUR CURSOR FOR SELECT SERIALNUMBER, TABLENAME, DATAITEMNAME, SQLSTATEMENT FROM JGJS_RADS_CHECKSQL WHERE ISACTIVE = 1; -- 2、异常处理 DECLARE CONTINUE HANDLER FOR NOT FOUND SET DONE = TRUE; DECLARE CONTINUE HANDLER FOR SQLEXCEPTION BEGIN GET DIAGNOSTICS CONDITION 1 V_MSG = MESSAGE_TEXT; SET V_COMMIT = -10; ROLLBACK; -- 发生异常时回滚事务 END; -- 3、开始事务 START TRANSACTION; -- 4、打开游标 OPEN CUR; READ_LOOP: LOOP FETCH CUR INTO V_SERIAL, V_TABLE, V_DATAITEMNAME, V_SQL; IF DONE THEN LEAVE READ_LOOP; END IF; -- 5、动态执行SQL并统计错误数 SET @DYNAMIC_SQL = CONCAT( 'INSERT INTO JGJS_RADS_CHECKRESULT (SERIALNUMBER, TABLENAME, COLUMNNAME, ERROR_COUNT) ', 'SELECT ''', V_SERIAL, ''', ''', V_TABLE, ''', ''', V_DATAITEMNAME, ''', COUNT(*) ', 'FROM (', V_SQL, ') AS VALIDATION_RESULTS' ); PREPARE STMT FROM @DYNAMIC_SQL; EXECUTE STMT; DEALLOCATE PREPARE STMT; END LOOP; CLOSE CUR; -- 6、根据事务状态提交或回滚 IF V_COMMIT = -10 THEN ROLLBACK; -- 事务异常回滚 -- 7、记录报错信息到日志表 INSERT INTO JGJS_RADS_CHECKRESULT (SERIALNUMBER, TABLENAME, COLUMNNAME, ERROR_COUNT, DEALSTATUS, REMARK, CHECKTIME) VALUES ('SYSTEM', 'SYSTEM', 'SYSTEM', 0, 'ERROR', V_MSG, NOW()); ELSE -- 事务正
最新发布
03-11
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值