【问题标题】:WP7 SQL CE - An overflow occurred while converting to datetimeWP7 SQL CE - 转换为日期时间时发生溢出
【发布时间】:2011-10-14 19:56:28
【问题描述】:

我的问题似乎与this 帖子和this 帖子相同,但似乎都不适用于我的情况。

我有一个实体定义如下(修改为仅显示列和定义):

public partial class Payee
{
    [Column(Storage = "_PayeeId", IsPrimaryKey = true, IsDbGenerated = true, DbType = "INT NOT NULL Identity", CanBeNull = false)]
    public int PayeeId { get; set; }

    [Column(Storage = "_PayeeName", DbType = "NVarChar(20)", CanBeNull = false)]
    public string PayeeName { get; set; }

    [Column(Storage = "_Active")]
    public System.Nullable<bool> Active

    [Column(IsVersion = true)]
    private Binary _version;

    [Association(Storage = "_Transactions", ThisKey = "PayeeId", OtherKey = "PayeeId")]
    public EntitySet<Transaction> Transactions { get; set; }
}

来自App.xaml.cs,当应用程序最初启动时,我正在将一些示例数据加载到数据库中:

Payee pay1 = new Payee { PayeeName = "My Bank" };
App.ViewModel.SavePayee(pay1);

而SavePayee方法如下:

public void SavePayee(Payee payee)
{
    Datacontext.Payees.InsertOnSubmit(payee);
    Datacontext.SubmitChanges();
}

当我从App.xaml.cs 调用它时创建我的“示例数据”时,这工作正常。现在,当我稍后尝试在应用程序中创建新的收款人时(txtPayee.Text 确实有值):

Payee payee = txtPayee.SelectedItem as Payee;
if (payee == null)
{
    payee = new Payee { PayeeName = txtPayee.Text };
    App.ViewModel.SavePayee(payee);
}

我收到错误:An overflow occurred while converting to datetime.

什么可能导致这个错误?

【问题讨论】:

    标签: c# wpf linq-to-sql windows-phone-7 sql-server-ce


    【解决方案1】:

    事实证明,在这种情况下,错误消息是 SPOT ON。这是我发现错误的方法。希望它在未来对其他人有所帮助:

    我的实体被插入没有问题,实际上,错误消息是正确的。我怎么知道发生了什么?我用这段代码包装了我的保存方法的内容:

    System.IO.IsolatedStorage.IsolatedStorageFile iso = System.IO.IsolatedStorage.IsolatedStorageFile.GetUserStoreForApplication(); 
    using (checkbookDB.Log = new System.IO.StreamWriter(iso.CreateFile("log.txt"))) 
    { 
    }
    

    因此,当该方法发生错误时,它会将结果写入文本文件。收到错误消息后,我使用 WP7 SDK 附带的 IsolatedStorageExplorerTool 从模拟器下载了文件。我在文本文件中发现了什么?

    -- CURSOR BASED INSERT [Payees] 
    -- [PayeeName] <= [test payee] 
    -- [Active] <= [] 
    
    -- AUTOSYNC [_version] <= [System.Byte[]] 
    -- AUTOSYNC [PayeeId] <= [13] 
    -- CURSOR BASED INSERT [Transactions] 
    -- [TransDate] <= [1/1/0001 12:00:00 AM]
    -- [TransAmount] <= [0] 
    -- [TransType] <= [0] 
    -- [RefNum] <= [] 
    -- [Memo] <= [] 
    -- [PayeeId] <= [0] 
    -- [CategoryId] <= [] 
    -- [AccountId] <= [1] 
    -- [Cleared] <= [False] 
    

    嗯....好的...看起来我的收款人正确插入,我什至有一个新的 PayeeId。但是等等……交易?为什么会有事务试图插入?

    Welp:我是 MVVM 的菜鸟。在过去的一个半月里,我一直在下班时间使用它,所以我不熟悉最佳实践。在我的 ViewModel 上,我创建了一个名为 account 的公共实体。我使用此变量来跟踪应用程序中选定的帐户,以便在各处显示正确的数据。在我试图从中保存新收款人的页面中,创建页面时,我创建了一个 Transaction 实体的实例,以将数据映射到屏幕上的控件/从屏幕上的控件映射数据。好吧,我在 OnNavigatedTo 方法中所做的是设置

    transaction.Account = App.ViewModel.account 
    

    所以当我去保存交易时,我知道将其保存到哪个帐户。好吧,这实际上是在做什么(我认为),是告诉我的 datacontext 嘿!我有这个交易实体,我正在通过向它添加一个帐户来更改它。因此,当我输入 datacontext.SaveChanges 方法时,它会尝试保存一个空的 BLANK 事务实体。

    为什么这条线路在 OnNavigatedTo 中排在前面?我不知道。我把它移到了它所属的 Save 方法。

    /doh

    【讨论】:

      【解决方案2】:

      就我而言,我试图插入一个未初始化的“System.DateTime”,而我的数据库字段不可为空。 据我从您的日志中可以看出,TransDate 是 System.DateTime.MinValue。即使在可为空的日期时间,它也会给出溢出错误。您必须将其设置为 null,以便驱动程序将其转换为 System.DBNull.Value。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-10-07
        • 2014-07-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-12-12
        • 1970-01-01
        相关资源
        最近更新 更多