JIT编译器遇到内部限制。 C#,VS 2019

我开始学习C#并提出了以下例外情况:

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

当我尝试使用传递了DateTime参数的存储过程从数据库中获取数据时,会发生此异常。

这是我得到的完整信息:

<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>

将感谢您的任何建议!

代码在下面

这部分正在调用存储过程并传递参数:

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;
        }
    }

这是sql连接和数据加载(使用Dapper)的一部分:

internal class SqlDataaccess
    {
        public string getconnectionString(string name)
        {
            return Configurationmanager.ConnectionStrings[name].ConnectionString;
        }

        public List<T> LoadData<T,U>(string storedProcedure,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;
            }
        }

    } 

这是我要获取的商品的模型:

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; }
    }

这是一个存储过程:

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

更新1

如果我使用没有参数和LINQ版本输出的SP-一切正常:

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

//instead of 

var output = sql.LoadData<FiveDaysEventsModel,"MFData");

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

//instead of 

return output;

使用SP:

CREATE PROCEDURE [dbo].[spEvents_Getall]
AS
BEGIN

    set nocount on;

    SELECT 
        ed.Event_Date,ed.[Status] as [Status],ed.ID
    FROM 
        dbo.[EventData] ed,dbo.[Location] loc
    WHERE 
        ed.Company_ID = c.ID  and
        ed.ContactID = cnt.ID and
        ed.LocationID = loc.ID
END

但是我不想每次都加载整个表...

我想DateTime转换有问题,任何想法。在哪里看?

zhanggang1496 回答:JIT编译器遇到内部限制。 C#,VS 2019

与其将DateTime作为参数传递,不如将其作为动态对象的一部分传递:

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

您遇到的问题是因为Dapper需要某种类型的参数集。它可以采用的集合类型(包括列表和对象)相当宽松。但是,类似DateTime的结构会导致它发出问题。与其像过去那样只传递一个对象,不如像我那样将其作为匿名类对象的一部分传递,其中属性名称对应于存储过程中的参数,您会很好的。

本文链接:https://www.f2er.com/3128933.html

大家都在问