技术思绪摘录旅行
在项目中遇到了需要代码执行创建存储过程的需求,但是因为在存储过程有时候需要用到变量,用到了@符号,这时候发现MySqlCommand执行报错,提示需要给这个带艾特的参数赋值,意思是他当成了sqlparameter处理了,就是我们防止注入的那个东西。这篇文章介绍一下另外的一个方案,让我们可以实现用代码执行带@符号的sql语句。

原因如下:

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;

注意: 整个过程没有事务性 !!!


CarsonIT 微信扫码关注公众号 策略、创意、技术

留下您的脚步

 

最近评论

查看更多>>

精选推荐

阅读排行

友情打赏

请打开您的微信,扫一扫