2012-05-17 3 views
1

У меня есть цикл, который проходит через каждый элемент списка и добавляет его в базу данных. Код ниже - это метод, который я вызываю, когда кнопка нажата на форму WPF. Он получает значение ID и список шагов (DTO) из app.xaml.cs и помещает данные из списка в базу данных.Почему этот код работает только дважды?

using (SQLiteConnection sqConnection = getDatabaseConnection()) 
{ 
    SQLiteCommand addItemCommand = sqConnection.CreateCommand(); 
    sqConnection.Open(); 
    SQLiteTransaction stepTrans; 
    // Start a local transaction 
    stepTrans = sqConnection.BeginTransaction(System.Data.IsolationLevel.ReadCommitted); 
    // Assign transaction object for a pending local transaction 
    addItemCommand.Transaction = stepTrans; 
    addItemCommand.Connection = sqConnection; 

    foreach (Step step in StepsGlobal) 
     { 
      string sqAddItem = String.Format 
       ("INSERT INTO Steps(ID, RecipeID, Description, StepTime, Dependency, Priority, Type) Values(null, '{0}', '{1}', '{2}', '{3}', '{4}', '{5}')", 
       recipeID, step.Description, step.StepTime, step.Dependency, step.Priority, step.Type); 

      addItemCommand.CommandText = sqAddItem; 
      addItemCommand.ExecuteNonQuery(); 
      stepTrans.Commit(); 
     } 

Однако он работает только для первых двух элементов, и я получаю следующую ошибку, если список содержит более двух элементов.

A first chance exception of type 'System.ArgumentNullException' occurred in 
System.Data.SQLite.dll 
System.ArgumentNullException: Value cannot be null. 
Parameter name: No connection associated with this transaction 
    at System.Data.SQLite.SQLiteTransaction.IsValid(Boolean throwError) 
    at System.Data.SQLite.SQLiteTransaction.Commit() 
    at Project.Methods.addStepsToDatabase() 
+1

Вы вызываете BeginTransaction один раз, вне вашей петли. Затем Commit в конце вашего цикла на каждой итерации. – svenv

ответ

2

Лучше всего предположить, что stepTrans.Commit ... совершает транзакцию и аннулирует объект. Вам необходимо будет начать новую транзакцию после фиксации текущей.

+0

m (_ _) m Просто переместил его за пределы петли. Благодаря.! – user1335169

+0

было очень острое наблюдение. хорошо идет – Rohan

Смежные вопросы