此 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删除吧。