原因如下:
1.Sql脚本中带有创建存储过程。
2.存储过程中又带有动态SQL语句。
3.执行动态SQL语句时,必须要有的两句脚本
PREPARE stmt FROM @sqlStr; //@sqlStr为组装好的动态Sql脚本 EXECUTE stmt;
这个时候,使用MySqlCommand来执行这种带有@关键字的语句时,就会遇到变量未定义的问题,然后这个问题又不能通过简单的修改存储过程脚本来避开@关键字的问题。
所以,我就在网上查阅了很多的资料;终于,找到了一个叫做MySqlScript的类
此类在MySql.Data.dll 程序集中 命名空间为MySql.Data.MySqlClient
类的解释为
Provides a class capable of executing a SQL script containing multiple SQL statementsincluding CREATE PROCEDURE statements that require changing the delimiter
翻译一下:
提供一个类,该类能够执行包含多个SQL语句的SQL脚本,包括需要更改分隔符的CREATE PROCEDURE语句
到此 豁然开朗,原来还有这么好用的东西,立马用起来。
这里就用一个简单的SQL脚本来说明:
DROP PROCEDURE IF EXISTS Proc_ExecTest;; CREATE PROCEDURE Proc_ExecTest( IN P_BeginDate varchar(36), IN P_EndDate varchar(36) ) BEGIN set @sqlStr1 =''; SET @TempRowNo = 0; END;;
注意结尾的两个分号,这个特殊分隔符,自定义的,用来执行多段sql的时候进行分隔。
C#代码如下:
bool ret = false; using (MySqlConnection conn = new MySqlConnection(sql1constr)) { var mysqlScript = new MySqlScript(); mysqlScript.Delimiter = ";;"; //每个SQL语句片段的分隔符 mysqlScript.Connection = conn; //数据库连接,在执行Execute方法时 会自动打开连接 mysqlScript.Query = sql;//全部SQL脚本 mysqlScript.ScriptCompleted += (sender, args) => { //全部Sql脚本执行完成时回调 //当遇到错误时,先回调Error 然后再回调ScriptCompleted ,然后整个执行过程结束 }; mysqlScript.StatementExecuted += (sender, args) => { //成功执行一个语句片段时回调 //args.StatementText;//成功执行的语句片段内容 ret = true; }; mysqlScript.Error += (sender, args) => { //执行一个语句片段发生错误时回调 //args.Exception;//错误异常 }; mysqlScript.Execute(); } return ret;
注意: 整个过程没有事务性 !!!
留下您的脚步
最近评论