从C#应用程序执行时导致事务错误的存储过程

时间:2016-01-27 09:56:48

标签: c# sql sql-server stored-procedures

我在SQL数据库中编写了以下存储过程。它在不同的数据库中执行2个程序。内部过程是简单的更新和插入查询,而不应用任何显式的TRANSACTION语句。

ALTER PROCEDURE [dbo].[usp_1]
@UserID nvarchar(MAX),
@report nvarchar(max),
@sqlErrorMsg nvarchar(MAX) OUTPUT 
AS
BEGIN
EXEC    @ret = [db1].[dbo].[usp_2]
                    @user = @UserID,
                    @msg = @sqlErrorMsg OUTPUT,
                    @date = @reportDate

            set @sqlErrorMsg = 'Report update Status: ' + @sqlErrorMsg

            EXEC    @ret = [db2].[dbo].[usp_3]
                    @UserID = @UserID,
                    @msg = @sqlErrorMsg OUTPUT,
                    @date = @reportDate     
END

当我在SQL Management Studio中执行它时,此过程运行完美。但是当我使用调用此过程的C#代码运行它时,我收到以下错误:

  

当前事务无法提交且无法支持   写入日志文件的操作。回滚交易。该   当前事务无法提交且无法支持操作   写入日志文件。回滚交易。

C#代码:( Conn在外面用正确的连接字符串定义并经过测试)

public int Upload_Excel_Timer(string userID, string report, out string message)
{
    int ret;

    SqlCommand cmd = new SqlCommand("usp_1", conn);
    cmd.CommandType = CommandType.StoredProcedure;
    cmd.Parameters.AddWithValue("@UserID", userID);
    cmd.Parameters.AddWithValue("@report", report);

    SqlParameter outputParameter = cmd.Parameters.Add("@sqlErrorMsg", SqlDbType.NVarChar, 255);
    outputParameter.Direction = ParameterDirection.Output;


    SqlParameter returnParameter = cmd.Parameters.Add("RetVal", SqlDbType.Int);
    returnParameter.Direction = ParameterDirection.ReturnValue;

    try
    {
        if (conn.State.Equals(ConnectionState.Closed))
            conn.Open();
        int tempval = cmd.ExecuteNonQuery();
        ret = Convert.ToInt32(returnParameter.Value);
        message = outputParameter.Value.ToString();
    }
    catch (Exception e)
    {
        ret = -1;
        message = e.Message;
    }
    finally
    {
        conn.Close();
    }
    return ret;
}

0 个答案:

没有答案