升级MySqlConnector 2.0.0后创建存储过程失败问题咨询
问题诱因
MySqlConnector 2.0.0版本对MySqlCommand.Prepare()的实现逻辑做了调整:调用该方法时,驱动会默认用原生SQL分隔符;对CommandText做语句拆分,仅将拆分得到的第一段SQL发送至MySQL服务端做预编译处理。
你提交的存储过程创建语句内部存在多个;分隔符,拆分逻辑会在SET p_out = 1;处截断语句,发送到服务端的SQL为不完整片段,因此触发第3行附近的语法错误。
未调用Prepare()时,驱动会直接将完整的CommandText全部发送至服务端,不会做提前拆分,所以可以正常执行。
解决方案
- 优先方案:创建存储过程、函数等包含内置
;分隔符的DDL语句时,跳过Prepare()调用,直接执行ExecuteNonQuery()即可。这类单次执行的DDL语句没有预编译的业务价值,跳过调用即可完全规避语句截断问题。 - 兼容方案:如果公共数据库操作层封装了强制调用
Prepare()的逻辑无法单独修改,可改用MySqlScript对象执行存储过程创建脚本,该对象原生支持多分隔符SQL解析,不会出现语句截断问题。 - 临时方案:如果必须使用
MySqlCommand且必须调用Prepare(),可以在存储过程SQL前后显式声明自定义分隔符,同时开启连接字符串的AllowMultiStatement参数,示例SQL如下:
DELIMITER // CREATE PROCEDURE proc(OUT p_out INT) BEGIN SET p_out = 1; SELECT 200; END // DELIMITER ;
内容的提问来源于stack exchange,提问作者George Polevoy
相关产品推荐
相关产品推荐

