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