读书人

此 SqlTransaction 已完成;它再也无法

发布时间: 2012-06-01 16:46:36 作者: rapoo

此 SqlTransaction 已完成;它再也无法使用。

C# code
        public static bool InStock(SqlParameter[] OrderParas, List<SqlParameter[]> InStockParas, DataTable DetailTable)        {            bool _pass = false;            string connectString = Encrypt.DecryptString(System.Configuration.ConfigurationManager.AppSettings["ConnetString"]);            using (SqlConnection Conn = new SqlConnection(connectString))            {                Conn.Open();                using (SqlTransaction Tran = Conn.BeginTransaction())                {                    try                    {                        using (SqlCommand Comm = new SqlCommand())                        {                            Comm.Transaction = Tran;                            Comm.Connection = Conn;                            Comm.CommandType = CommandType.StoredProcedure;                                                       Comm.CommandText = "p_OutOrderStateUpdate_Update";                            Comm.Parameters.AddRange(OrderParas);                            Comm.ExecuteNonQuery();                                                        Comm.CommandText = "p_ProductsInStorage_Insert";                            for (int j = 0; j < InStockParas.Count; j++)                            {                                Comm.Parameters.Clear();                                Comm.Parameters.AddRange(InStockParas[j]);                                Comm.ExecuteNonQuery();                            }                        }                        using (SqlBulkCopy copy = new SqlBulkCopy(Conn, SqlBulkCopyOptions.CheckConstraints, Tran) { DestinationTableName = "tbInStockDetail" })                        {                            for (int i = 0; i < DetailTable.Columns.Count; i++)                            {                                copy.ColumnMappings.Add(DetailTable.Columns[i].ColumnName, DetailTable.Columns[i].ColumnName);                            }                            copy.WriteToServer(DetailTable);                        }                        Tran.Commit();                        _pass = true;                    }                    catch (Exception ex)                    {                        Tran.Rollback();                        throw new Exception(ex.ToString());                    }                }            }            return _pass;        }


在copy.WriteToServer(DetailTable);时跳到catch

错误是"在从服务器接收结果时发生传输级错误。 (provider: TCP 提供程序, error: 0 - 指定的网络名不再可用。)"

然后,Tran.Rollback();提示此 SqlTransaction 已完成;它再也无法使用。

不知是不是网络问题,ping服务器ip基本没有掉包和能查询

请问应该怎么解决呢...

[解决办法]
像是网络问题哦,这个问题还经常出现吗,还是几乎很少或者无法重现。
[解决办法]
我看是 using (SqlBulkCopy copy = new SqlBulkCopy(Conn, SqlBulkCopyOptions.CheckConstraints, Tran)

的事,它在Exception的时候,先关闭了 Transcation

这里你完全可以把最后的清理工作放到 finally 里去做。

[解决办法]
你都使用using(){ }了,还些无聊的try...catch干什么呢?人家的using本来就负责清理tran的。如果闲它清理不了,要么你就把using删除吧。

读书人网 >C#

热点推荐