2014-12-09 4 views
1

Простые сценарии.Несколько изменений и исключений отправки

Чтение данных из одного источника и сохранение в базу данных SQL с использованием LinqToSQL. В файле много строк. Возможно, что для некоторых строк может возникнуть исключение SQL, но мы хотим игнорировать его (исключение журнала) и сохранять остальные данные.

В настоящее время мы выполняем подписи после каждой строки входных данных. В первый раз, когда SQL Exception встречается, ни одна из следующих строк не может быть обработана, потому что те же исключения, как представляется, повторно представлены.

Каков наилучший способ справиться с этим?

+1

Вы, вероятно, захотите создать новый экземпляр контекста для каждого сохранить, как это будет просто продолжать пытаться сохранить те же изменения снова и снова. –

+0

Насколько я знаю, LINQ обрабатывает каждую «строку» за раз для данной команды, то есть при ее обновлении обновлялся бы каждый объект, и они сохраняли бы. Итак, я думаю, вам нужно будет сделать вашу собственную функцию, но не уверен (отсюда комментарий вместо ответа). – MVCDS

+0

Создание отдельного контекста данных для каждого из них практически не является практичным, так как до обновления система обрабатывает данные из контекста и будет либо обновить или вставить объект. –

ответ

0

Хорошо. Кажется, я нашел решение и хотел поделиться им.

Способ для этого состоит в том, чтобы очистить все ожидающие изменения перед продолжением. Поэтому, если сбой SubmitChanges, я теперь вызываю этот метод расширения в datacontext - RejectPendingChanges().

Когда следующая строка обработана, теперь она больше пытается повторно отправить плохие данные.

государственной статической силы RejectPendingChanges (это System.Data.Linq.DataContext дБ) {

 var chgset = db.GetChangeSet(); 
     if (chgset != null) 
     { 
      foreach (object objToInsert in chgset.Inserts) 
      { 
       db.GetTable(objToInsert.GetType()).DeleteOnSubmit(objToInsert); 
      } 
      //Undo deletes 
      foreach (object objToDelete in chgset.Deletes) 
      { 
       db.GetTable(objToDelete.GetType()).InsertOnSubmit(objToDelete); 
      } 
      ///this._DB.Refresh(System.Data.Linq.RefreshMode.OverwriteCurrentValues, chgset.Deletes); 
      db.Refresh(System.Data.Linq.RefreshMode.OverwriteCurrentValues, chgset.Updates); 
     } 
    } 
Смежные вопросы