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

【讨论】:

以上是关于C# SQLConnection 到 SQL Azure 挂起的主要内容,如果未能解决你的问题,请参考以下文章

c#使用SqlConnection连接SqlServer的connectstring

C#操作SQL Server数据库

C# 在EF中直接运行SQL命令

sql server C#操作。原文在收藏页面

C# 如何确定SQL Server 中数据表是否存在

如何通过单击按钮 [C#] 执行 2 个 sql 查询