我必须执行已编写的TSQL脚本(* .sql文件),它们没有transacion。我为每个客户端(大多数是不同的脚本)提供了大约300个脚本,我编写了一个使用sqlcmd以给定顺序执行脚本的C#应用程序。
脚本也包含insert \ update \ delete语句和ddl。
它逐个运行脚本,并且其中一个脚本可能会失败。如果其中一个脚本失败,它会记录哪个脚本执行了,并记录了sqlcmd给出的错误消息。我需要在这些情况下回滚。我不必回滚成功运行的脚本,但我应该回滚最后一个失败的脚本。
通过回滚我的意思是我需要恢复到最后一个脚本开始之前的点。我真的不知道应该怎样解决这个问题。
感谢您的帮助。
答案 0 :(得分:0)
如果我理解正确,那么这就是你要找的东西。只要您有一个打开的连接和打开的事务,就可以使用它。它并不完美,但它是一个开始。
public bool GenericSP_PersistentConnection(string strStoredProcedureName, SortedList<string, string> values, SqlConnection s_persistent_conn, SqlTransaction transaction, string returnValueName)
{
try
{
if (strStoredProcedureName == "") throw new Exception(noStoredProcedure);
if (values == null) throw new Exception(noValue);
if (returnValueName == "") throw new Exception(noOutputParameterName);
//If Connection object is null, create a new on
if (s_persistent_conn == null) s_persistent_conn = new SqlConnection(GetConnectionString());
//Create command object
s_comm = new SqlCommand(strStoredProcedureName, s_persistent_conn);
s_comm.CommandType = CommandType.StoredProcedure;
s_comm.Transaction = transaction;
s_comm.CommandTimeout = 600;
s_adap = new SqlDataAdapter(s_comm);
////set up the parameters for the stored proc
foreach (var item in values)
s_comm.Parameters.AddWithValue("@" + item.Key, item.Value);
s_comm.Parameters.AddWithValue("@" + returnValueName, 0);
s_comm.Parameters["@" + returnValueName].Direction = ParameterDirection.Output;
//Excecute call to DB
s_comm.ExecuteNonQuery();
outputValue = s_comm.Parameters["@" + returnValueName].Value.ToString();
}
catch (Exception ex)
{
// If something happens, rollback the whole transaction.
transaction.Rollback();
throw ex;
}
finally
{
s_comm.Dispose();
s_adap.Dispose();
}
return true;
}
希望它有所帮助。