[英]C# SQLConnection to SQL Azure hangs
我具有此功能,可以更新Azure SQL DB上的某些记录。 计时器每10分钟调用一次该函数:
static public bool CaricaOccupazioniiMae(DataTable dtOccupazioni)
{
using (SqlConnection conn = new SqlConnection(GetSQLAzureConnectionStringiMae()))
{
conn.Open();
using (SqlTransaction tr = conn.BeginTransaction())
{
using (SqlCommand SQLCmd = new SqlCommand("DELETE_t_Promemoria", conn))
{
try
{
SQLCmd.CommandType = CommandType.StoredProcedure;
SQLCmd.Parameters.Add("@CodScuola", mCodiceScuolaiMae);
SQLCmd.Transaction = tr;
SQLCmd.ExecuteNonQuery();
}
catch (System.Exception ex)
{
tr.Rollback();
tr.Dispose();
return false;
}
}
using (SqlBulkCopy SQLCopy = new SqlBulkCopy(conn, SqlBulkCopyOptions.Default, tr))
{
try
{
SQLCopy.DestinationTableName = "t_Promemoria";
SQLCopy.WriteToServer(dtOccupazioni);
}
catch (System.Exception ex)
{
tr.Rollback();
tr.Dispose();
return false;
}
}
tr.Commit();
}
conn.Close();
}
return true;
}
在两种情况下,该函数只是挂在那里...我唯一确定的是,它尚未到达此块,同时它通过了conn.open():
SQLCmd.CommandType = CommandType.StoredProcedure;
SQLCmd.Parameters.Add("@CodScuola", mCodiceScuolaiMae);
SQLCmd.Transaction = tr;
SQLCmd.ExecuteNonQuery();
因此,合乎逻辑的结论是,它陷入了以下两点之一:
1)SqlTransaction tr = conn.BeginTransaction()
2)SqlCommand SQLCmd =新的SqlCommand(“ DELETE_t_Promemoria”,conn);
你有什么线索吗?
提前致谢!
尽管我认为您的代码没有太多错误,但可以进行一些重构。 如果未“提交”事务,则默认情况下将回滚该事务,并且try/catch
次数少一些可能有助于避免资源锁定:
using (SqlConnection conn = new SqlConnection(GetSQLAzureConnectionStringiMae()))
{
conn.Open();
using (SqlTransaction tr = conn.BeginTransaction())
{
try
{
using (SqlCommand SQLCmd = new SqlCommand("DELETE_t_Promemoria", conn))
{
SQLCmd.CommandType = CommandType.StoredProcedure;
SQLCmd.Parameters.Add("@CodScuola", mCodiceScuolaiMae);
SQLCmd.Transaction = tr;
SQLCmd.ExecuteNonQuery();
}
using (SqlBulkCopy SQLCopy = new SqlBulkCopy(conn, SqlBulkCopyOptions.Default, tr))
{
SQLCopy.DestinationTableName = "t_Promemoria";
SQLCopy.WriteToServer(dtOccupazioni);
}
tr.Commit();
}
catch (Exception ex)
{
tr.Rollback();
}
}
conn.Close();
}
return true;
}
如果您确实需要在不同的事务中同时执行两个SQL操作( SqlCommand
和SqlBulkCopy
),则为每个事务创建一个新的事务。 我上面构造的方式可以在同一事务中完成所有操作,并且可以解决您的问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.