c# 三步递交模式调用同一个存储过程
主要用于批量的sql操作:第一步创建中间表,第二步多次写数据到中间表,第三步 提交执行
创建三步递交的存储过程:
CREATE PROC usp_testsbdj @bz int=0, @name VARCHAR(100)='' AS IF(@bz=1) BEGIN CREATE TABLE ##temp(id VARCHAR(100),name VARCHAR(100)) END ELSE IF(@bz=2) BEGIN IF EXISTS(SELECT 1 FROM ##temp ) BEGIN SELECT 'F' END INSERT INTO ##temp ( id, name ) VALUES ( NEWID(), -- id - varchar(10) @name -- name - varchar(100) ) END ELSE BEGIN SELECT * FROM ##temp END SELECT 'T'
封装方法:
/// <summary> /// 支持同一个连接执行sql,用于三步递交,迭代返回每次执行结果 /// </summary> /// <param name="strsqls"></param> /// <returns></returns> public IEnumerable<DataTable> YieldReturnDataTable(List<string> strsqls) { if (strsqls == null || strsqls.Count < 1) { yield return null; yield break; } using (var connection = new MySqlConnection(DbConnectionString)) { connection.Open(); foreach (string strsql in strsqls) { var ds = new DataTable(); try { using (var cmd = new MySqlCommand(strsql, connection)) { cmd.CommandTimeout = DbCommandTimeout; using (var dataAdapter = new MySqlDataAdapter(cmd)) { dataAdapter.Fill(ds); } } } catch (MySqlException ex) { Tools.Debug(String.Format("执行异常语句:{0} ,执行数据库:{1} ,报错: {2}", strsql, DbConnectionString, ex.Message)); Tools.Error(ex); yield break; } yield return ds; } } }
调用方式:
List<string> liststring = new List<string>(); liststring.Add("exec usp_testsbdj 1"); liststring.Add("exec usp_testsbdj 2,'李伟'"); liststring.Add("exec usp_testsbdj '2,'王伟伟''"); liststring.Add("exec usp_testsbdj 3"); foreach (DataTable dt in YieldReturnDataTable(liststring)) { string str = dt.Rows[0][0].ToString(); if (str == "F") { return; } }