В моем приложении 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, вызываемый в этой функции.
Так что я не закрываю читателя или соединение с базой данных. Итак, любые идеи, почему я все еще получаю эту ошибку?
Вы забыли добавить самое важное: _Where_ вы получаете исключение? –
На втором проходе читателя :( –
Вы используете одно и то же соединение для других команд sql. Сначала прочтите список, затем DeleList(). –