Copied to clipboard

Flag this post as spam?

This post will be reported to the moderators as potential spam to be looked at


  • Alex Brown 129 posts 618 karma points
    Apr 26, 2017 @ 09:04
    Alex Brown
    0

    Umbraco Database Fatal Error

    Hi I'm using Umbraco 7.5.11

    I've been getting this error every so often which follows:

    ERROR - Database exception occurred  System.InvalidOperationException: Internal connection fatal error.     at System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady)     at System.Data.SqlClient.SqlDataReader.TryCloseInternal(Boolean closeReader)     at System.Data.SqlClient.SqlDataReader.Close()     at System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString)     at System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async, Int32 timeout, Task& task, Boolean asyncWrite, SqlDataReader ds)     at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, TaskCompletionSource`1 completion, Int32 timeout, Task& task, Boolean asyncWrite)     at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method)     at System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior, String method)     at System.Data.SqlClient.SqlCommand.ExecuteDbDataReader(CommandBehavior behavior)     at StackExchange.Profiling.Data.ProfiledDbCommand.ExecuteDbDataReader(CommandBehavior behavior) in c:\Code\github\SamSaffron\MiniProfiler\StackExchange.Profiling\Data\ProfiledDbCommand.cs:line 235     at System.Data.Common.DbCommand.System.Data.IDbCommand.ExecuteReader()     at Umbraco.Core.Persistence.PetaPocoCommandExtensions.<>c__DisplayClass4.<ExecuteReaderWithRetry>b__3()     at Umbraco.Core.Persistence.FaultHandling.RetryPolicy.ExecuteAction[TResult](Func`1 func)     at Umbraco.Core.Persistence.Database.<Query>d__7`1.MoveNext()
    

    This seems to happen with only one specific method in the database, which follows:

            public ProductViewModel GetById(int id)
        {
            var productViewModel = new ProductViewModel();
            if (id <= 0) return productViewModel;
    
            using (var tr = _db.GetTransaction())
            {
                // Get the basic product information from the DB.
                var product = _db.SingleOrDefault<Product>("SELECT * FROM Products WHERE Id = @0", id);
    
                // Bind direct ProductViewModel's properties.
                productViewModel = Mapper.Map<ProductViewModel>(product);
    
                try
                {
                    // Set the product's images
                    productViewModel.Images = GetPicturesById(product.Id).ToList();
    
                    // Set the Products Variants
                    productViewModel.Variants = GetProductsVariantsByProductId(product.Id);
    
                    // Set the Alternatives Products
                    productViewModel.Alternatives = GetAlternativesProductsById(product.Id);
    
                    // Set the Cross-sells Products
                    productViewModel.CrossSells = GetCrossSellsProductsById(product.Id);
    
                    // Set the Product SEO
                    productViewModel.Seo = GetProductSeoById(product.Id);
    
                    // Set the Size guide
                    productViewModel.SizeGuide = _sizeGuidesRepository.GetById(product.SizeGuideTopicId);
    
                    // Set the brand
                    productViewModel.Brand = GetBrandById(productViewModel.Id);
    
                    // Set the Market Sectors
                    productViewModel.MarketSectorIds = GetMarketSectorsById(productViewModel.Id);
    
                    // Set the Product Features
                    productViewModel.ProductFeatures = GetProductFeaturesById(productViewModel.Id);
    
                    // Set the Product News Ids
                    productViewModel.RelatedNewsIds = GetProductNewsById(productViewModel.Id);
    
                    tr.Complete();
                }
                catch (Exception e)
                {
                    _log.Error(string.Format(@"Product Details - Id:{0}, Images:{1}, Variants:{2}, Alternatives:{3}, CrossSells:{4}, Seo:{5}, SizeGuide:{6}, Brand:{7}, Market Sectors:{8}, 
                                            Features:{9}, RelatedNewsIds:{10}. Product Object: {11}", productViewModel.Id, productViewModel.Images, productViewModel.Variants,
                                            productViewModel.Alternatives, productViewModel.CrossSells, productViewModel.Seo, productViewModel.SizeGuide, productViewModel.Brand,
                                            productViewModel.MarketSectorIds, productViewModel.ProductFeatures, productViewModel.RelatedNewsIds), e);
                }
            }
    
            return productViewModel;
        }
    

    As you can see there's a lot of calls within the Using statement, however I'm unsure whether the Using statement is needed.

    The method GetCrossSellsProductsById has a Using statement within it too (so effectively, a nested Using).

    Each method within the Using statement use Database methods such as Fetch etc.

    As previously mentioned, this error only occurs a couple of times per week, and only on a live database.

    So my questions are:

    1. Are Using statements required for basic database transactions?
    2. Can nested Using statements cause trouble?

    P.S. I know the code isn't very clean.

  • This forum is in read-only mode while we transition to the new forum.

    You can continue this topic on the new forum by tapping the "Continue discussion" link below.

Please Sign in or register to post replies