繁体   English   中英

C#SQLConnection到SQL Azure挂起

[英]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操作( SqlCommandSqlBulkCopy ),则为每个事务创建一个新的事务。 我上面构造的方式可以在同一事务中完成所有操作,并且可以解决您的问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM