2013-03-22 2 views
0

В моем приложении C# я взаимодействую с базой данных SQL Compact. В этом контексте у меня есть три таблицы; customer, list и customerlist (клиенты и списки являются отношениями «многие ко многим»).Неверная попытка прочитать, когда читатель закрыт, но не закрывает считыватель?

У меня есть функция, которую я вызываю, когда хочу удалить список. Функция также удаляет соответствующие записи из таблицы customerlist также только для чистоты (поскольку они не работают, если сам список был удален).

Мой код такой:

private void clearRedundantSubscriptions() 
    { 
     string sql; 
     // Check if there are any entries in customerlist table which point to non-existing lists 
     try 
     { 
      sql = "select distinct cl.listid from customerlist cl inner join list l on cl.listid != l.listid"; 
      SqlCeCommand cmdGetDisusedLists = new SqlCeCommand(sql, DbConnection.ceConnection); 
      SqlCeDataReader reader = cmdGetDisusedLists.ExecuteReader(); 
      while (reader.Read()) 
      { 
       DbFunctions.DeleteList(reader.GetInt32(0), false, false); 
      } 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show("Error cleaning up list entries." + ex.Message); 
     } 
     return; 
    } 

    public static bool DeleteList(int id, bool display, bool close) 
    { 
     string sql; 
     string title = ""; 
     bool ranOk = false; 
     try 
     { 
      sql = "select ShortDesc from list where listid=" + id; 
      DbFunctions.runSQL(sql, out title); 
      sql = "delete from list where ListId=" + id; 
      SqlCeCommand cmdDelList = new SqlCeCommand(sql, DbConnection.ceConnection); 
      cmdDelList.ExecuteNonQuery(); 
      sql = "delete from customerlist where listid=" + id; 
      SqlCeCommand cmdDelEntries = new SqlCeCommand(sql, DbConnection.ceConnection); 
      cmdDelEntries.ExecuteNonQuery(); 
      if (display) 
       General.doneWork(title + " list deleted."); 
      ranOk = true; 
     } 
     catch (Exception ex) 
     { 
      if (display) 
       MessageBox.Show("Unable to delete list. " + ex.Message); 
     } 
     finally 
     { 
      if (close) 
       DbConnection.closeConnection(); 
     } 
     return ranOk; 
    } 

    public static void closeConnection() 
    { 
     if (_sqlCeConnection != null) 
      _sqlCeConnection.Close(); 
    } 

Вы заметите в своей функции deletelist, я прохожу в качестве параметра BOOL имени «закрыть». Я добавил это, потому что закрытие соединения с базой данных, в то время как внутри читателя вызвало вышеуказанную ошибку. Итак, если я хочу использовать эту функцию внутри читателя, я вызываю функцию deleteList и удостоверяюсь, что параметр «закрыть» передается как false. Это не проблема - это означает, что DbConnection.closeConnection - это NOT, вызываемый в этой функции.

Так что я не закрываю читателя или соединение с базой данных. Итак, любые идеи, почему я все еще получаю эту ошибку?

+0

Вы забыли добавить самое важное: _Where_ вы получаете исключение? –

+0

На втором проходе читателя :( –

+1

Вы используете одно и то же соединение для других команд sql. Сначала прочтите список, затем DeleList(). –

ответ

1

Я изменил ваш код, попробуйте это.

Я не знаю, что происходит внутри вашего метода DbFunctions.runSQL, поэтому вам может потребоваться повторно открыть соединение до этого вызова.

private void clearRedundantSubscriptions() 
{ 
    string sql; 
    // Check if there are any entries in customerlist table which point to non-existing lists 
    var list = new List<int>(); 
    try 
    { 
     if (DbConnection.ceConnection.State == ConnectionState.Closed) 
      DbConnection.ceConnection.Open(); 

     sql = "select distinct cl.listid from customerlist cl inner join list l on cl.listid != l.listid"; 

     SqlCeCommand cmdGetDisusedLists = new SqlCeCommand(sql, DbConnection.ceConnection); 
     SqlCeDataReader reader = cmdGetDisusedLists.ExecuteReader(); 
     while (reader.Read()) 
     { 
      list.Add(reader.GetInt32(0)); 
     } 
    } 
    catch (Exception ex) 
    { 
     MessageBox.Show("Error cleaning up list entries." + ex.Message); 
     throw; 
    } 
    finally 
    { 
     DbConnection.closeConnection(); 
    } 

    foreach(var id in list) 
    { 
     DeleteList(id,false); 

    } 
    return; 
} 

public static bool DeleteList(int id, bool display) 
{ 
    string sql; 
    string title = ""; 
    bool ranOk = false; 
    try 
    { 
     sql = "select ShortDesc from list where listid=" + id; 
     DbFunctions.runSQL(sql, out title); 


     sql = "delete from list where ListId=" + id; 
     SqlCeCommand cmdDelList = new SqlCeCommand(sql, DbConnection.ceConnection); 
     cmdDelList.ExecuteNonQuery(); 
     sql = "delete from customerlist where listid=" + id; 
     SqlCeCommand cmdDelEntries = new SqlCeCommand(sql, DbConnection.ceConnection); 
     cmdDelEntries.ExecuteNonQuery(); 
     if (display) 
      General.doneWork(title + " list deleted."); 
     ranOk = true; 
    } 
    catch (Exception ex) 
    { 
     if (display) 
      MessageBox.Show("Unable to delete list. " + ex.Message); 
    } 
    finally 
    { 
      DbConnection.closeConnection(); 
    } 
    return ranOk; 
} 

public static void closeConnection() 
{ 
    if (_sqlCeConnection != null) 
     _sqlCeConnection.Close(); 
} 
Смежные вопросы