c# 三步遞交模式呼叫同一個儲存過程

皚上雪發表於2019-08-14

主要用於批量的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;
}
}

相關文章