Question

When using the same MVC 3 & C# code along with copies of the same MySql 5.5 database on 2 different MySql installations. One works perfectly while the other one fails with an "Object must implement IConvertible" error. When I run the query against my local PC's MySql installation the query always works perfectly, but when I try querying from local PC's Visual Studio 2010 to a copy of the same database at my Internet Service Provider's MySql installation then I receive an error "Object must implement IConvertible". The only thing I change in the code is the ConnectionString's Server Name in the web.config, otherwise the code & database are exactly the same. NOTE: All other queries to the ISP's MySql installation work perfectly only this one particular query doesn't work.

After trying to troubleshoot this for several days I'm convinced that the error message "Object must implement IConvertible" has nothing to do with what is actually happening and I'm also under the impression that the MySql configuration at my ISP may somehow be causing this issue for the following reasons:

  1. If this were truly an "Object must implement IConvertible" issue within the code then the issue would persist in the code and happen no matter which DB installation I hit.

  2. I've completely dropped & recreated the DB at the ISP from my local PC's working copy however still receive the same exactly error.

  3. MOST INTERESTINGLY is that the query has 3 nested IEnumerable lists that are all setup in the same way as IEnumerables and if I comment out any 1 of these nested lists in the query then the query runs successfully against the ISP's DB. It doesn’t matter which nested list gets commented out, only that there are 2 or less nested lists and then the query to the DB at ISP works. This is what leads me to the conclusion that MySql’s configuration at the ISP may be limiting my queries in some way, as I do not have this problem when querying my local PC's MySql installation. The error message really doesn’t appear to apply to what is actually happening. Again, all the other queries to the ISP's MySql installation work perfectly, however none of them contain more than 2 nested IEnumerable lists where this particular query contains 3?

Query Error "Object must implement IConvertible"

    Server Error in '/' Application.
    ________________________________________
    Object must implement IConvertible. 
    Description: An unhandled exception occurred during the execution of the current web request.             Please review the stack trace for more information about the error and where it originated in the code. 

    Exception Details: System.InvalidCastException: Object must implement IConvertible.

    Source Error: 

    Line 392:
    Line 393:
    Line 394:            var query =
    Line 395:                  (from p in db.products
    Line 396:                   where p.ClientId == clientId

    Source File: C:\Users\JR\Documents\Visual Studio 2010\Projects\Subversion\ReservarMVC\ReservarMVC\Models\ProductRepository.cs    Line: 394 

    Stack Trace: 

    [InvalidCastException: Object must implement IConvertible.]
    System.Convert.ChangeType(Object value, Type conversionType, IFormatProvider provider) +9528453
    MySql.Data.Entity.EFMySqlDataReader.ChangeType(Object sourceValue, Type targetType) +566
    MySql.Data.Entity.EFMySqlDataReader.GetValue(Int32 ordinal) +231
    System.Data.Common.Internal.Materialization.ErrorHandlingValueReader`1.GetValue(DbDataReader reader, Int32 ordinal) +215
    System.Data.Common.Internal.Materialization.Shaper.GetColumnValueWithErrorHandling(Int32 ordinal) +46
    lambda_method(Closure , Shaper ) +180
    System.Data.Common.Internal.Materialization.Coordinator`1.ReadNextElement(Shaper shaper) +170
    System.Data.Common.Internal.Materialization.RowNestedResultEnumerator.MoveNext() +235
    System.Data.Common.Internal.Materialization.ObjectQueryNestedEnumerator.TryReadToNextElement() +49
    System.Data.Common.Internal.Materialization.ObjectQueryNestedEnumerator.ReadElement() +29
    System.Data.Common.Internal.Materialization.ObjectQueryNestedEnumerator.MoveNext() +68
    System.Collections.Generic.List`1..ctor(IEnumerable`1 collection) +327
    System.Linq.Enumerable.ToList(IEnumerable`1 source) +58
    ReservarMVC.Models.ProductRepository.GetProductList(Nullable`1 dateStart, Nullable`1    dateEnd,         Nullable`1 personQuantityId, Nullable`1 roomQuantityId) in C:\Users\JR\Documents     \Visual      Studio 2010\Projects\Subversion\ReservarMVC\ReservarMVC\Models\ProductRepository.cs:394
    ReservarMVC.Models.ProductRepository.GetProductListSearch(Nullable`1 dateStart, Nullable`1 dateEnd, Nullable`1 personQuantityId, Nullable`1 roomQuantityId) in C:\Users\JR\Documents\Visual Studio 2010\Projects\Subversion\ReservarMVC\ReservarMVC\Models\ProductRepository.cs:605
    ReservarMVC.Controllers.PortalController.MyExcurcion(ProductListSearchVM viewModel) in C:\Users\JR\Documents\Visual Studio 2010\Projects\Subversion\ReservarMVC\ReservarMVC\Controllers\PortalController.cs:63
     lambda_method(Closure , ControllerBase , Object[] ) +162
     System.Web.Mvc.ActionMethodDispatcher.Execute(ControllerBase controller, Object[] parameters) +17
     System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary`2 parameters) +208
      System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary`2 parameters) +27
      System.Web.Mvc.<>c__DisplayClass15.<InvokeActionMethodWithFilters>b__12() +55
      System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilter filter, ActionExecutingContext preContext, Func`1 continuation) +263
      System.Web.Mvc.<>c__DisplayClass17.<InvokeActionMethodWithFilters>b__14() +19
      System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodWithFilters(ControllerContext controllerContext, IList`1 filters, ActionDescriptor actionDescriptor, IDictionary`2 parameters) +191
      System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext controllerContext, String actionName) +343
      System.Web.Mvc.Controller.ExecuteCore() +116
      System.Web.Mvc.ControllerBase.Execute(RequestContext requestContext) +97
      System.Web.Mvc.ControllerBase.System.Web.Mvc.IController.Execute(RequestContext requestContext) +10
      System.Web.Mvc.<>c__DisplayClassb.<BeginProcessRequest>b__5() +37
      System.Web.Mvc.Async.<>c__DisplayClass1.<MakeVoidDelegate>b__0() +21
      System.Web.Mvc.Async.<>c__DisplayClass8`1.<BeginSynchronous>b__7(IAsyncResult _) +12
      System.Web.Mvc.Async.WrappedAsyncResult`1.End() +62
      System.Web.Mvc.<>c__DisplayClasse.<EndProcessRequest>b__d() +50
      System.Web.Mvc.SecurityUtil.<GetCallInAppTrustThunk>b__0(Action f) +7
      System.Web.Mvc.SecurityUtil.ProcessInApplicationTrust(Action action) +22
      System.Web.Mvc.MvcHandler.EndProcessRequest(IAsyncResult asyncResult) +60
      System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.EndProcessRequest(IAsyncResult result) +9
      System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +8967601
      System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +184

      ________________________________________
      Version Information: Microsoft .NET Framework Version:4.0.30319; ASP.NET Version:4.0.30319.261

LINQ-to-Entities Query:

    public IEnumerable<ProductListVM> GetProductList(DateTime? dateStart, DateTime? dateEnd, int? personQuantityId, int? roomQuantityId)
    {
        var query =
              (from p in db.products
               where p.ClientId == clientId
               where p.ProductTypeId == 5 
               where personQuantityId <= p.Capacity
               where roomQuantityId <= p.Quantity
               select new ProductListVM
               {
                   ProductId = p.ProductId,
                   ClientId = p.ClientId,
                   Name = p.Name_en,
                   Title = p.Title_en,
                   Description = p.Description_en,
                   Quantity = p.Quantity,
                   Capacity = p.Capacity,
                   newbookings = from b in db.bookings 
                                 where b.ProductId == p.ProductId
                                 from res in db.reservations
                                 where b.ReseravationId == res.ReservationId
                                 where b.BookingDateTime >= dateStart && b.BookingDateTime <= dateEnd && res.ReservationStateId != 3 
                                 select new BookingVM
                                 {
                                     ProductId = b.ProductId,
                                     BookingId = b.BookingId,
                                     ClientId = b.ClientId,
                                     ReservationId = b.ReseravationId,
                                     BookingDateTime = b.BookingDateTime
                                 },                  
                   newratecategories = from prc in db.productratecategories
                                       where prc.ProductId == p.ProductId
                                       from rc in db.ratecategories
                                       where prc.RateCategoryId == rc.RateCategoryId
                                       where (dateStart >= rc.DateStart && dateEnd <= rc.DateEnd) || (dateStart >= rc.DateStart || dateEnd <= rc.DateEnd)                                           
                                       select new MegaRateCategoryVM
                                       {
                                           RateCategoryId = rc.RateCategoryId,                                               
                                           DateStart = rc.DateStart,
                                           DateEnd = rc.DateEnd                                      
                                       },
                   newproductimages = (from pi in db.productimages
                                       where pi.ProductId == p.ProductId
                                       from ig in db.imagegalleries
                                       where pi.ImageGalleryId == ig.ImageGalleryId
                                       select new MegaProductImageVM
                                       {
                                           ig_Description = ig.ig_Description,
                                           ImageGalleryId = pi.ImageGalleryId
                                       }).OrderByDescending(i => i.ImageGalleryId)
               }).ToList();

        return query;
    }

Product List ViewModel:

    namespace Project.ViewModels
    {
        [Serializable]
        public class ProductListVM : BaseViewModel
        {        
            public int ProductId { get; set; }        
            public int? ClientId { get; set; }
            public int? ProductTypeId { get; set; }
            public int? ProductStateId { get; set; }
            public String Name { get; set; }        
            public String Title { get; set; }
            public String Description { get; set; }
            public int? Quantity { get; set; }
            public int? Capacity { get; set; }        

            //PRODUCTIMAGE table fields
            public IEnumerable<MegaProductImageVM> newproductimages { get; set; }

            //RATECATEGORY table fields
            public IEnumerable<MegaRateCategoryVM> newratecategories { get; set; }

            //BOOKING table fields
            public IEnumerable<BookingVM> newbookings { get; set; }       

        }

    }

What could be causing this behavior? Could this be caused by a query threshold setting or network setting on the MySql 5.5's database configuration? I haven't changed any of the defaults on either of the MySql 5.5 installations. I'm just using the standard MySql Connector/Net 6.5.4 to access the DB along with Microsoft's standard MVC 3, C#, Entity Framework 4, LINQ-to-Entities code.

Any help on this is greatly appreciated. Thanks, Atlas361

Was it helpful?

Solution 2

I published my MVC application to the ISP so that any potential issue caused by querying across the internet was eliminated but I still had the same exact error "Object must implement IConvertible”. After troubleshooting this further with the completely inept support staff at Arvixe.com I discovered that the actual version of MySql they had the database on was 5.1.54 released 2008 and not MySql 5.5 that was released in late 2010. According to the MySql documentation the MySql Connector/Net 6.5.4 & Microsoft's Entity Framework 4 are compatible, but I found this not to be true. After fighting with Arvixe.com to put me on MySql 5.5 server the problem went away. So in the end this was version compatibility issue.

Hope the answer helps! Atlas361

OTHER TIPS

To fix this, add 'respect binary flags=false' to your connection string, e.g.:

connectionString="metadata=res://*/Something.csdl|res://*/Something.ssdl|
res://*/Something.msl;provider=MySql.Data.MySqlClient;
provider connection string=&quot;server=my-server;User Id=some-user;
Persist Security Info=True;database=some-database;respect binary flags=false&quot;"

This is a known issue with certain versions of MySQL 5.0 and 5.1

There are certain situations where MySQL will return incorrect metadata about one or more columns... In the event that the changes required to your application would be too large, adding 'respect binary flags=false' to your connection string causes the connector to use the prior behavior: any column that is marked as string, regardless of binary flags, will be returned as string. Only columns that are specifically marked as a BLOB will be returned as BLOB.

Hope this helps future travelers.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top