【问题标题】:SQL DateTime Overflow Using Multiple LINQ Statements使用多个 LINQ 语句的 SQL 日期时间溢出
【发布时间】:2017-01-23 16:55:59
【问题描述】:

我有以下问题。

在下面的代码块中,第一次通过 if 语句触发,一切正常。第二次通过 formData.Where 出现 SQL DateTime 溢出错误。被拉回的值是一个字符串,与日期无关。被引用的记录确实有日期,但它是当天。我已经更改了这些 if 语句触发的顺序,无论哪个是第一个或第二个都没有关系。第二个总是抛出异常。

foreach (string riderGroup in riderGroups)
            {
                if (riderGroup == "69")
                {
                    var deathRiderValue = formData.Where(x => x.FieldName == "rider69Value").Select(x => x.FieldValue).Single().ToString();
                    var rider = _riderDataService.GetRiderById(Convert.ToInt32(deathRiderValue));
                    premiumAccount.AddRider(new PolicyRider { Rider = rider, PremiumAccount = premiumAccount, Policy = policy });                        
                }
                if (riderGroup == "211")
                {
                    var gmabRiderValue = formData.Where(x => x.FieldName == "rider211Value").Select(x => x.FieldValue).Single().ToString();
                    var rider = _riderDataService.GetRiderById(Convert.ToInt32(gmabRiderValue));
                    premiumAccount.AddRider(new PolicyRider { Rider = rider, PremiumAccount = premiumAccount, Policy = policy });
                }
                if (riderGroup == "96")
                {
                    var giveawayPromoValue = formData.Where(x => x.FieldName == "rider96Value").Select(x => x.FieldValue).Single().ToString();
                    if (giveawayPromoValue == "1")
                    {
                        var rider = _riderDataService.GetRiderById(5);
                        premiumAccount.AddRider(new PolicyRider { Rider = rider, PremiumAccount = premiumAccount, Policy = policy });
                    }
                }
            }

有什么想法吗?

异常详细信息:System.Data.SqlTypes.SqlTypeException:SqlDateTime 溢出。必须在 1753 年 1 月 1 日凌晨 12:00:00 到 9999 年 12 月 31 日晚上 11:59:59 之间。

这里是调用栈:

    [SqlTypeException: SqlDateTime overflow. Must be between 1/1/1753 12:00:00 AM and 12/31/9999 11:59:59 PM.]
   System.Data.SqlClient.TdsParser.TdsExecuteRPC(SqlCommand cmd, _SqlRPC[] rpcArray, Int32 timeout, Boolean inSchema, SqlNotificationRequest notificationRequest, TdsParserStateObject stateObj, Boolean isCommandProc, Boolean sync, TaskCompletionSource`1 completion, Int32 startRpc, Int32 startParam) +7688
   System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async, Int32 timeout, Task& task, Boolean asyncWrite, SqlDataReader ds, Boolean describeParameterEncryptionRequest) +2026
   System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, TaskCompletionSource`1 completion, Int32 timeout, Task& task, Boolean asyncWrite) +375
   System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method) +53
   System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior, String method) +161
   System.Data.SqlClient.SqlCommand.ExecuteDbDataReader(CommandBehavior behavior) +41
   System.Data.Common.DbCommand.System.Data.IDbCommand.ExecuteReader() +14
   NHibernate.AdoNet.AbstractBatcher.ExecuteReader(IDbCommand cmd) +347
   NHibernate.Id.InsertSelectDelegate.ExecuteAndExtract(IDbCommand insert, ISessionImplementor session) +77
   NHibernate.Id.Insert.AbstractReturningDelegate.PerformInsert(SqlCommandInfo insertSQL, ISessionImplementor session, IBinder binder) +112
   NHibernate.Persister.Entity.AbstractEntityPersister.Insert(Object[] fields, Boolean[] notNull, SqlCommandInfo sql, Object obj, ISessionImplementor session) +283
   NHibernate.Persister.Entity.AbstractEntityPersister.Insert(Object[] fields, Object obj, ISessionImplementor session) +391
   NHibernate.Action.EntityIdentityInsertAction.Execute() +283
   NHibernate.Engine.ActionQueue.Execute(IExecutable executable) +48
   NHibernate.Event.Default.AbstractSaveEventListener.PerformSaveOrReplicate(Object entity, EntityKey key, IEntityPersister persister, Boolean useIdentityColumn, Object anything, IEventSource source, Boolean requiresImmediateIdAccess) +839
   NHibernate.Event.Default.AbstractSaveEventListener.PerformSave(Object entity, Object id, IEntityPersister persister, Boolean useIdentityColumn, Object anything, IEventSource source, Boolean requiresImmediateIdAccess) +579
   NHibernate.Event.Default.AbstractSaveEventListener.SaveWithGeneratedId(Object entity, String entityName, Object anything, IEventSource source, Boolean requiresImmediateIdAccess) +278
   NHibernate.Event.Default.DefaultSaveOrUpdateEventListener.SaveWithGeneratedOrRequestedId(SaveOrUpdateEvent event) +118
   NHibernate.Event.Default.DefaultSaveOrUpdateEventListener.EntityIsTransient(SaveOrUpdateEvent event) +219
   NHibernate.Event.Default.DefaultSaveOrUpdateEventListener.PerformSaveOrUpdate(SaveOrUpdateEvent event) +232
   NHibernate.Event.Default.DefaultSaveOrUpdateEventListener.OnSaveOrUpdate(SaveOrUpdateEvent event) +347
   NHibernate.Impl.SessionImpl.FireSaveOrUpdate(SaveOrUpdateEvent event) +193
   NHibernate.Impl.SessionImpl.SaveOrUpdate(String entityName, Object obj) +155
   NHibernate.Engine.SaveUpdateCascadingAction.Cascade(IEventSource session, Object child, String entityName, Object anything, Boolean isCascadeDeleteEnabled) +106
   NHibernate.Engine.Cascade.CascadeToOne(Object parent, Object child, IType type, CascadeStyle style, Object anything, Boolean isCascadeDeleteEnabled) +238
   NHibernate.Engine.Cascade.CascadeAssociation(Object parent, Object child, IType type, CascadeStyle style, Object anything, Boolean isCascadeDeleteEnabled) +101
   NHibernate.Engine.Cascade.CascadeProperty(Object parent, Object child, IType type, CascadeStyle style, Object anything, Boolean isCascadeDeleteEnabled) +135
   NHibernate.Engine.Cascade.CascadeCollectionElements(Object parent, Object child, CollectionType collectionType, CascadeStyle style, IType elemType, Object anything, Boolean isCascadeDeleteEnabled) +667
   NHibernate.Engine.Cascade.CascadeCollection(Object parent, Object child, CascadeStyle style, Object anything, CollectionType type) +292
   NHibernate.Engine.Cascade.CascadeAssociation(Object parent, Object child, IType type, CascadeStyle style, Object anything, Boolean isCascadeDeleteEnabled) +188
   NHibernate.Engine.Cascade.CascadeProperty(Object parent, Object child, IType type, CascadeStyle style, Object anything, Boolean isCascadeDeleteEnabled) +135
   NHibernate.Engine.Cascade.CascadeOn(IEntityPersister persister, Object parent, Object anything) +588
   NHibernate.Event.Default.AbstractFlushingEventListener.CascadeOnFlush(IEventSource session, IEntityPersister persister, Object key, Object anything) +130
   NHibernate.Event.Default.AbstractFlushingEventListener.PrepareEntityFlushes(IEventSource session) +363
   NHibernate.Event.Default.AbstractFlushingEventListener.FlushEverythingToExecutions(FlushEvent event) +203
   NHibernate.Event.Default.DefaultAutoFlushEventListener.OnAutoFlush(AutoFlushEvent event) +144
   NHibernate.Impl.SessionImpl.AutoFlushIfRequired(ISet`1 querySpaces) +289
   NHibernate.Impl.SessionImpl.List(IQueryExpression queryExpression, QueryParameters queryParameters, IList results) +206
   NHibernate.Impl.AbstractSessionImpl.List(IQueryExpression queryExpression, QueryParameters parameters) +227
   NHibernate.Impl.ExpressionQueryImpl.List() +146
   NHibernate.Linq.DefaultQueryProvider.ExecuteQuery(NhLinqExpression nhLinqExpression, IQuery query, NhLinqExpression nhQuery) +72
   NHibernate.Linq.DefaultQueryProvider.Execute(Expression expression) +93
   NHibernate.Linq.DefaultQueryProvider.Execute(Expression expression) +50
   System.Linq.Queryable.Single(IQueryable`1 source) +211
   FrontOffice.HelperExtensions.FormProcessHelper.AddOnPremiumProcess(Int32 id) in c:\Users\hprentiss\Documents\SI Project\T3 Core\Dev\FrontOffice\HelperExtensions\FormProcessHelper.cs:314
   FrontOffice.Areas.NewBusiness.Controllers.ImportFormsController.ProcessFormAddOnPremium(Int32 id) in c:\Users\hprentiss\Documents\SI Project\T3 Core\Dev\FrontOffice\Areas\NewBusiness\Controllers\ImportFormsController.cs:135
   lambda_method(Closure , ControllerBase , Object[] ) +161
   System.Web.Mvc.ActionMethodDispatcher.Execute(ControllerBase controller, Object[] parameters) +19
   System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary`2 parameters) +209
   System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary`2 parameters) +27
   System.Web.Mvc.Async.<>c__DisplayClass42.<BeginInvokeSynchronousActionMethod>b__41() +28
   System.Web.Mvc.Async.<>c__DisplayClass8`1.<BeginSynchronous>b__7(IAsyncResult _) +15
   System.Web.Mvc.Async.WrappedAsyncResult`1.End() +58
   System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeActionMethod(IAsyncResult asyncResult) +49
   System.Web.Mvc.Async.<>c__DisplayClass39.<BeginInvokeActionMethodWithFilters>b__33() +57
   System.Web.Mvc.Async.<>c__DisplayClass4f.<InvokeActionMethodFilterAsynchronously>b__49() +223
   System.Web.Mvc.Async.<>c__DisplayClass4f.<InvokeActionMethodFilterAsynchronously>b__49() +223
   System.Web.Mvc.Async.<>c__DisplayClass4f.<InvokeActionMethodFilterAsynchronously>b__49() +223
   System.Web.Mvc.Async.<>c__DisplayClass4f.<InvokeActionMethodFilterAsynchronously>b__49() +223
   System.Web.Mvc.Async.<>c__DisplayClass37.<BeginInvokeActionMethodWithFilters>b__36(IAsyncResult asyncResult) +15
   System.Web.Mvc.Async.WrappedAsyncResult`1.End() +58
   System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeActionMethodWithFilters(IAsyncResult asyncResult) +49
   System.Web.Mvc.Async.<>c__DisplayClass2a.<BeginInvokeAction>b__20() +24
   System.Web.Mvc.Async.<>c__DisplayClass25.<BeginInvokeAction>b__22(IAsyncResult asyncResult) +102
   System.Web.Mvc.Async.WrappedAsyncResult`1.End() +58
   System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeAction(IAsyncResult asyncResult) +44
   System.Web.Mvc.<>c__DisplayClass1d.<BeginExecuteCore>b__18(IAsyncResult asyncResult) +15
   System.Web.Mvc.Async.<>c__DisplayClass4.<MakeVoidDelegate>b__3(IAsyncResult ar) +16
   System.Web.Mvc.Async.WrappedAsyncResult`1.End() +58
   System.Web.Mvc.Controller.EndExecuteCore(IAsyncResult asyncResult) +54
   System.Web.Mvc.Async.<>c__DisplayClass4.<MakeVoidDelegate>b__3(IAsyncResult ar) +16
   System.Web.Mvc.Async.WrappedAsyncResult`1.End() +58
   System.Web.Mvc.Controller.EndExecute(IAsyncResult asyncResult) +44
   System.Web.Mvc.Controller.System.Web.Mvc.Async.IAsyncController.EndExecute(IAsyncResult asyncResult) +12
   System.Web.Mvc.<>c__DisplayClass8.<BeginProcessRequest>b__3(IAsyncResult asyncResult) +25
   System.Web.Mvc.Async.<>c__DisplayClass4.<MakeVoidDelegate>b__3(IAsyncResult ar) +16
   System.Web.Mvc.Async.WrappedAsyncResult`1.End() +58
   System.Web.Mvc.MvcHandler.EndProcessRequest(IAsyncResult asyncResult) +44
   System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.EndProcessRequest(IAsyncResult result) +11
   System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +9724953
   System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +155

FormData 类

public class FormData : Entity
{
    public virtual int FormSubmissionID { get; set; }
    public virtual string FieldName { get; set; }
    public virtual string FieldValue { get; set; }

    public FormData()
    {

    }
}

它继承的实体类

[Serializable]
public class Entity
{
    public virtual int ID { get; set; }
    public virtual bool IsActive { get; set; }
    public virtual DateTime DateCreated { get; set; }
    public virtual DateTime? DateModified { get; set; }
    public virtual int? ModifiedBy { get; set; }

    public Entity()
    {
        IsActive = true;
        DateCreated = DateTime.Now;
    }
    public override bool Equals(object obj)
    {
        if (ID != 0)
        {
            Entity obj2 = obj as Entity;
            return ((obj2 != null) && (ID == obj2.ID));
        }
        return base.Equals(obj);
    }

    public override int GetHashCode()
    {
        return (ID != 0) ? ID.GetHashCode() : base.GetHashCode();
    }

    public virtual void Deactivate()
    {
        IsActive = false;
    }

    public virtual void EncryptFields()
    {
    }

    public virtual object AddHistoryRecord()
    {
        return null;
    }
}

表单数据映射

public class FormDataMap : BaseMap<FormData>
{
    public FormDataMap ()
    {
        Table("tblFormData");
        Id(x => x.ID, "FormDataID");
        Map(x => x.FormSubmissionID);
        Map(x => x.FieldName);
        Map(x => x.FieldValue);
    }        
}

实体图

public BaseMap()
    {
        Id(x => x.ID);
        MapEntity();
        Map(x => x.IsActive).Not.Nullable().Default("1");
        Map(x => x.DateCreated).Not.Nullable().Default("getdate()");
        Map(x => x.DateModified);
        Map(x => x.ModifiedBy);
    }
    protected virtual void MapEntity()
    {
    }

【问题讨论】:

  • DateTime overflow 是什么意思?在所有这些代码中,DateTime 是在哪里使用的? 实际错误是什么? datetime 字段根本不允许您存储无效值,那么怎么会有溢出呢?您是否将日期存储为字符串并尝试将它们转换为DateTime?这本身就是一个严重的错误。
  • 发布 full 异常,包括其调用堆栈。您可以通过Exception.ToString() 获得它。还要发布实际引发错误的代码。您在此处发布的内容似乎没有在任何地方使用日期
  • 添加了异常和堆栈跟踪
  • 您可能正在将0001-01-01 值传递给datetime 字段,但是,Single 调用如何导致 INSERT 语句?属性里面发生了什么???您的课程中是否有任何 getter 尝试在某处插入数据?

标签: c# sql-server linq


【解决方案1】:

您的异常定义了“fromdate”变量中发生的情况,它设置为空。在那里使用断点,“fromdate”内的跟踪值,它不能小于 1/1/1753 12:00:00 AM 并且不大于 12/31/9999 11:59:59 PM。 如果您尝试将 DateTime 类型的变量设置为 null,则会发生此错误。将变量声明为可为空,即 DateTime? 。这样就可以解决问题了。

【讨论】:

  • 有 2 列必须使用 DateTime。 1 是我们不允许为空的 DateCreated 和已经可以为空的 DateModified。
  • fromdate 是 DateTime 类型吗?
  • 没有起始日期。我不确定你在哪里看到的。有一个 FormData 类继承自具有 DateCreated 和 DateModified 的 Entity 类。
  • 分享那个类的实现。
  • 添加了类和地图
【解决方案2】:

应该是评论,但是太长了:

就像@M Adeel Khalid 在他的回答中所说,导致此异常的最常见条件是试图在 SQL Server datetime 列中放入一个有效的值strong> 用于 C#,而 invalid 用于 SQL Server。 这可能发生在哪里是关键,但很难从您提供的内容中判断。

  1. 您粘贴的代码的哪一行发生了异常?

  2. 堆栈跟踪中的那两个行号(粘贴在下面)呢?

c:\Users\hprentiss\Documents\SI Project\T3 Core\Dev\FrontOffice\HelperExtensions\FormProcessHelper.cs:314 中的 FrontOffice.HelperExtensions.FormProcessHelper.AddOnPremiumProcess(Int32 id)

C:\Users\hprentiss\Documents\SI Project\T3 Core\Dev\FrontOffice\Areas\NewBusiness\Controllers\ImportFormsController.cs:135 中的 FrontOffice.Areas.NewBusiness.Controllers.ImportFormsController.ProcessFormAddOnPremium(Int32 id)

我猜这些不是您自己的代码,但您可以从中获得线索。如果我们假设 Datetime.Now 是一个有效值,那么将 null 值更改为其他值怎么样,只是为了进行健全性检查?

【讨论】:

  • 那里没有日期时间。它是 NHibernate 触发更新并决定空日期应该是最小值。
  • 很公平,但这实际上是“带有日期时间的东西”。仅仅因为它发生在 NHibernate 中并不会改变异常的性质。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-10
  • 1970-01-01
  • 2017-08-15
  • 1970-01-01
  • 2019-07-14
  • 1970-01-01
相关资源
最近更新 更多