我开始学习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, 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;
}
}
}
这是我要获取的商品的模型:
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, DateTime>("dbo.spGetDatePlusFiveDaysEvents", date, "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, 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
但是我不想每次都加载整个表...
我想DateTime转换有问题,任何想法。在哪里看?
答案 0 :(得分:0)
与其将DateTime作为参数传递,不如将其作为动态对象的一部分传递:
var output = sql.LoadData<FiveDaysEventsModel, dynamic>("dbo.spGetDatePlusFiveDaysEvents", new { EventDate = date }, "MFData");
您遇到的问题是因为Dapper需要某种类型的参数集。它可以采用的集合类型(包括列表和对象)相当宽松。但是,类似DateTime的结构会导致它发出问题。与其像过去那样只传递一个对象,不如像我那样将其作为匿名类对象的一部分传递,其中属性名称对应于存储过程中的参数,您会很好的。