C# SQLConnection 到 SQL Azure 挂起
Posted
技术标签:
【中文标题】C# SQLConnection 到 SQL Azure 挂起【英文标题】:C# SQLConnection to SQL Azure hangs 【发布时间】:2013-12-23 11:48:05 【问题描述】:我有这个功能,它可以更新 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();
所以合乎逻辑的结论是它挂在这 2 点之一:
1) SqlTransaction tr = conn.BeginTransaction()
2) SqlCommand SQLCmd = new SqlCommand("DELETE_t_Promemoria", conn);
你有什么线索吗?
提前致谢!
【问题讨论】:
每次删除多少数据? 不超过 300 行...这可能是原因吗?未命中 executenonquery... 我很确定,因为我在 "conn.open()" 之后添加了一个日志写入并且它被命中了,但另一个就在 QLCmd.CommandType = CommandType.StoredProcedure 之前;没有被击中 现在我绝对确定代码挂在: using (SqlTransaction tr = conn.BeginTransaction()) 【参考方案1】:虽然我没有看到您的代码有太多错误,但进行一些重构可能会奏效。如果事务未“提交”,则默认情况下将回滚,其中少一点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
),请为每个事务创建一个新的。我在上面构建它的方式在同一个事务中完成所有事情,并且可能会解决您的问题。
【讨论】:
以上是关于C# SQLConnection 到 SQL Azure 挂起的主要内容,如果未能解决你的问题,请参考以下文章