Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用事务运行脚本_C#_Sql Server_Tsql_Sqlcmd - Fatal编程技术网

C# 使用事务运行脚本

C# 使用事务运行脚本,c#,sql-server,tsql,sqlcmd,C#,Sql Server,Tsql,Sqlcmd,我必须执行已经编写的TSQL脚本(*.sql文件),但没有transacion。我为每个客户机编写了大约300个脚本(大部分是不同的脚本),我编写了一个小型C#应用程序,它使用sqlcmd按给定顺序执行脚本 脚本还包含insert\update\delete语句和ddl 它一个接一个地运行脚本,其中一个脚本可能会失败。如果其中一个脚本失败,它将记录哪个脚本失败,并记录sqlcmd给出的错误消息。在这种情况下,我需要后退。我不必回滚成功运行的脚本,但应该回滚最后一个失败的脚本 我所说的回滚是指我需

我必须执行已经编写的TSQL脚本(*.sql文件),但没有transacion。我为每个客户机编写了大约300个脚本(大部分是不同的脚本),我编写了一个小型C#应用程序,它使用sqlcmd按给定顺序执行脚本

脚本还包含insert\update\delete语句和ddl

它一个接一个地运行脚本,其中一个脚本可能会失败。如果其中一个脚本失败,它将记录哪个脚本失败,并记录sqlcmd给出的错误消息。在这种情况下,我需要后退。我不必回滚成功运行的脚本,但应该回滚最后一个失败的脚本

我所说的回滚是指我需要恢复到上一个脚本开始之前的状态。我真的不知道该怎么解决这个问题


谢谢你的帮助。

如果我理解正确,那么这就是你要找的东西。只要您有一个开放的连接和开放的事务,您就可以使用它。这并不完美,但只是一个开始

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;
}
public bool GenericSP\u PersistentConnection(字符串strstoredprocesdurename、SortedList值、SqlConnection s\u persistent\u conn、SqlTransaction事务、字符串returnValueName)
{
尝试
{
如果(strStoredProcedureName==“”)抛出新异常(noStoredProcedure);
if(value==null)抛出新异常(noValue);
如果(returnValueName==“”)抛出新异常(noOutputParameterName);
//如果连接对象为null,则在
如果(s_persistent_conn==null)s_persistent_conn=new SqlConnection(GetConnectionString());
//创建命令对象
s_comm=新的SqlCommand(strStoredProcedureName,s_persistent_conn);
s_comm.CommandType=CommandType.StoredProcess;
s_comm.Transaction=交易;
s_comm.CommandTimeout=600;
s_adap=新的SqlDataAdapter(s_comm);
////设置存储过程的参数
foreach(值中的var项)
s_comm.Parameters.AddWithValue(“@”+item.Key,item.Value);
s_comm.Parameters.AddWithValue(“@”+returnValueName,0);
s_comm.Parameters[“@”+returnValueName].Direction=ParameterDirection.Output;
//对数据库的异常调用
s_comm.ExecuteNonQuery();
outputValue=s_通信参数[“@”+returnValueName].Value.ToString();
}
捕获(例外情况除外)
{
//如果发生某种情况,请回滚整个事务。
transaction.Rollback();
掷骰子;
}
最后
{
s_comm.Dispose();
s_adap.Dispose();
}
返回true;
}

希望有帮助。

脚本的典型内容是什么?这只是插入/更新/删除吗?它们是否包含DDL语句?