JIT Compiler encountered an internal limitation. C#, VS 2019

0

I'm starting learning C# and came up with this exception:

System.InvalidProgramException
  HResult=0x8013153A
  Message=JIT Compiler encountered an internal limitation.
  Source=<Cannot evaluate the exception source>
  StackTrace:
<Cannot evaluate the exception stack trace>

This exception happens when I try to get data from database using the stored procedure with a DateTime parameter passed in.

Here is a full info which I get:

<Error>
<Message>An error has occurred.</Message>
<ExceptionMessage>JIT Compiler encountered an internal limitation.</ExceptionMessage>
<ExceptionType>System.InvalidProgramException</ExceptionType>
<StackTrace>
at ParamInfoe2776a66-00bd-4ad7-a77a-368cc977a638(IDbCommand , Object ) at Dapper.CommandDefinition.SetupCommand(IDbConnection cnn, Action`2 paramReader) in C:\projects\dapper\Dapper\CommandDefinition.cs:line 128 at Dapper.SqlMapper.<QueryImpl>d__140`1.MoveNext() in C:\projects\dapper\Dapper\SqlMapper.cs:line 1073 at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection) at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source) at Dapper.SqlMapper.Query[T](IDbConnection cnn, String sql, Object param, IDbTransaction transaction, Boolean buffered, Nullable`1 commandTimeout, Nullable`1 commandType) in C:\projects\dapper\Dapper\SqlMapper.cs:line 721 at MFDataManager.Library.Internal.SqlDataAccess.LoadData[T,U](String storedProcedure, U parameters, String connectionStringName) in D:\MICE_forecast\MICE_forecast\MICE_Forecast\MFDataManagerLibrary\Internal\SqlDataAccess.cs:line 27 at MFDataManagerLibrary.DataAccess.FiveDaysEventsData.getFiveDaysEvents() in D:\MICE_forecast\MICE_forecast\MICE_Forecast\MFDataManagerLibrary\DataAccess\FiveDaysEventsData.cs:line 21 at MFDataManager.Controllers.FiveDaysEventsController.Get() in D:\MICE_forecast\MICE_forecast\MICE_Forecast\MFDataManager\Controllers\FiveDaysEventsController.cs:line 19 at lambda_method(Closure , Object , Object[] ) at System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ActionExecutor.<>c__DisplayClass6_2.<GetExecutor>b__2(Object instance, Object[] methodParameters) at System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ActionExecutor.Execute(Object instance, Object[] arguments) at System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ExecuteAsync(HttpControllerContext controllerContext, IDictionary`2 arguments, CancellationToken cancellationToken) --- End of stack trace from previous location where exception was thrown --- at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at System.Web.Http.Controllers.ApiControllerActionInvoker.<InvokeActionAsyncCore>d__1.MoveNext() --- End of stack trace from previous location where exception was thrown --- at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at System.Web.Http.Controllers.ActionFilterResult.<ExecuteAsync>d__5.MoveNext() --- End of stack trace from previous location where exception was thrown --- at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at System.Web.Http.Controllers.AuthenticationFilterResult.<ExecuteAsync>d__5.MoveNext() --- End of stack trace from previous location where exception was thrown --- at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at System.Web.Http.Dispatcher.HttpControllerDispatcher.<SendAsync>d__15.MoveNext()
</StackTrace>
</Error>

Would appreciate any suggestions!

The code is below

This part is calling the Stored Procedure and passing parameter:

public class FiveDaysEventsData
    {
        public List <FiveDaysEventsModel> getFiveDaysEvents()
        {
            SqlDataAccess sql = new SqlDataAccess();


            //stuff for testing:
            DateTime date = new DateTime(2019, 11, 10);

            var output = sql.LoadData<FiveDaysEventsModel, DateTime>("dbo.spGetDatePlusFiveDaysEvents", date, "MFData");

            return output;
        }
    }

This is the part for sql connection and data load (using Dapper):

internal class SqlDataAccess
    {
        public string GetConnectionString(string name)
        {
            return ConfigurationManager.ConnectionStrings[name].ConnectionString;
        }

        public List<T> LoadData<T, U>(string storedProcedure, U parameters, string connectionStringName)
        {
            string connectionString = GetConnectionString(connectionStringName);

            using (IDbConnection connection = new SqlConnection (connectionString))
            {

                List<T> rows = connection.Query<T>(storedProcedure, parameters, 
                    commandType: CommandType.StoredProcedure).ToList();

                return rows;
            }
        }

    } 

This is the model of items I'm trying to get:

public class FiveDaysEventsModel
    {
        public DateTime Event_Date { get; set; }
        public string CompanyName { get; set; }
        public string Booked_for { get; set; }
        public TimeSpan Time_From { get; set; }
        public TimeSpan Time_To { get; set; }
        public string LocationName { get; set; }
        public string ContactName { get; set; }
        public string PhoneNumber { get; set; }
        public string EventStatus { get; set; }
        public int EventID { get; set; }
    }

And here is a stored procedure:

CREATE PROCEDURE [dbo].[spGetDatePlusFiveDaysEvents]
    @EventDate Datetime2
AS

BEGIN

    set nocount on;

    SELECT 
        ed.Event_Date, c.[Name] as CompanyName, ed.Booked_for,
        ed.Time_From, ed.Time_To, loc.[Name] as LocationName, cnt.[Name] as ContactName, 
        cnt.PhoneNumber, ed.[Status] as EventStatus, ed.ID as EventID
    FROM 
        dbo.[EventData] ed, 
        dbo.Company c, 
        dbo.Contact cnt,
        dbo.[Location] loc
    WHERE 
        (ed.Event_Date>= @EventDate and ed.Event_Date<= DATEADD(day, 5, @EventDate)) and 
        c.ID = ed.Company_ID and ed.ContactID = cnt.ID;
End

UPDATE 1:

if I use a SP without parameters and LINQ-ed output - it all works fine:

var output = sql.LoadData<FiveDaysEventsModel, dynamic>("dbo.spEvents_GetAll", new { }, "MFData");

//instead of 

var output = sql.LoadData<FiveDaysEventsModel, DateTime>("dbo.spGetDatePlusFiveDaysEvents", date, "MFData");

and

return output.Where(o => (o.Event_Date >= DateTime.Today && o.Event_Date <= DateTime.Today.AddDays(5))).ToList();

//instead of 

return output;

using the SP:

CREATE PROCEDURE [dbo].[spEvents_GetAll]
AS
BEGIN

    set nocount on;

    SELECT 
        ed.Event_Date, c.[Name] as CompanyName, ed.Booked_for, ed.Time_From, ed.Time_To, loc.[Name] as LocationName, cnt.[Name] as ContactName, 
        cnt.PhoneNumber, ed.[Status] as [Status], ed.ID
    FROM 
        dbo.[EventData] ed, 
        dbo.Company c, 
        dbo.Contact cnt,
        dbo.[Location] loc
    WHERE 
        ed.Company_ID = c.ID  and
        ed.ContactID = cnt.ID and
        ed.LocationID = loc.ID
END

But I don't want to load entire table each time...

I suppose that there is a problem with DateTime conversion, any thoughts reg. where to look?

c#
compiler-errors
compilation
cil
asked on Stack Overflow Nov 10, 2019 by Vitaliy Prushak • edited Nov 10, 2019 by Vitaliy Prushak

1 Answer

1

Instead of passing the DateTime in as the parameter, pass it in as part of a dynamic object like so:

var output = sql.LoadData<FiveDaysEventsModel, dynamic>("dbo.spGetDatePlusFiveDaysEvents", new { EventDate = date }, "MFData");

The problem you are encountering is because Dapper expects some type of set of parameters. It is fairly loose with the types of sets it can take, including lists and objects. However, a struct like DateTime causes it issues. Instead of passing just one object through on its own, pass it through as part of an anonymous class object like I did where the property name corresponds to the parameter in your stored procedure and you will be fine.

answered on Stack Overflow Nov 11, 2019 by IAmTimCorey

User contributions licensed under CC BY-SA 3.0