C#

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;
}
}


作者:皑上雪,发布于:2019/08/15
原文:https://www.cnblogs.com/songconglai/p/11352987.html