WP7 SQL CE - при преобразовании в datetime произошло переполнение - PullRequest
0 голосов
/ 14 октября 2011

Моя проблема, похоже, такая же, как эта запись и эта запись, но ни одна из них, похоже, не относится к моей ситуации.

У меня есть объект, определенный какследующее (изменено для отображения только столбцов и определений):

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.

Что может быть причиной этой ошибки?

Ответы [ 2 ]

1 голос
/ 16 октября 2011

Оказывается, в этом случае сообщение об ошибке было SPOT ON.Вот как я нашел свою ошибку.Надеюсь, это поможет другим в будущем:

Моя сущность была вставлена ​​без проблем, и на самом деле сообщение об ошибке было правильным.Как я выяснил, что происходит?Я обернул содержимое моего метода сохранения следующим кодом:

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

Поэтому, когда в этом методе произойдет ошибка, он запишет результаты в текстовый файл.После того, как я получил сообщение об ошибке, я загрузил файл из эмулятора, используя IsolatedStorageExplorerTool, поставляемый с WP7 SDK.Что я нашел в текстовом файле?

-- 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.Я использовал эту переменную для отслеживания выбранной учетной записи в приложении, поэтому правильные данные отображаются повсюду.На своей странице, с которой я пытался сохранить нового Получателя, при создании страницы я создаю экземпляр объекта «Транзакция», чтобы отобразить данные в / из элементов управления на экране.В моем методе OnNavigatedTo я настраивал

transaction.Account = App.ViewModel.account 

Так что, когда я собирался сохранить транзакцию, я знал, в какую учетную запись ее сохранить.Хорошо, что это действительно делало (я думаю), говорило моему тексту данных, что Эй!У меня есть объект транзакции, который я изменяю, добавляя к нему учетную запись.Поэтому, когда я вводил метод datacontext.SaveChanges, он пытался сохранить пустую сущность транзакции BLANK.

Почему эта строка находилась в OnNavigatedTo?Я не уверен.Я переместил его в метод Save, где он принадлежит.

/ doh

0 голосов
/ 14 ноября 2011

В моем случае я пытался вставить неинициализированный «System.DateTime», и поле «База данных» не могло быть пустым.Насколько я вижу из вашего журнала, TransDate является System.DateTime.MinValue.Это также даст ошибку переполнения даже в обнуляемую дату-время.Вы должны установить его в null, чтобы драйвер конвертировал его в System.DBNull.Value.

...