Patrick-Et. B. Ответов: 1

Выполнение двух команд SQL приводит к тому, что одна из них не выполняется


Я сравниваю две таблицы и проверяю, существует ли файл по-прежнему в пути, который хранится в БД. Если файл не существует, то запись из 'Pruefdate_import', имеющая ведущий идентификатор, будет удалена, а также все связанные записи из второй таблицы с точно таким же идентификатором. Ведущая запись (которая всегда только одна) будет удалена, но вторая таблица остается нетронутой.

List<string> PDToDelete = new List<string>();
SqlConnection sqlConn = new SqlConnection("Server=" + config.DBHOST + ";Database=" + config.DBASE + ";User Id=" + config.DBUSER + ";Password=" + Decrypt(config.DBPASSWORD) + ";MultipleActiveResultSets=True");
sqlConn.Open();

SqlCommand checkIfFileExist = new SqlCommand("SELECT Pruefdatei FROM Pruefdatei_Import", sqlConn);
SqlDataReader reader = checkIfFileExist.ExecuteReader();
if (reader.HasRows)
while (reader.Read())
{
    string path = reader.GetString(0);
    FileInfo pruefDatei = new FileInfo(path);
    if (!pruefDatei.Exists)
    {
            PDToDelete.Add(path);
    }
}
reader.Close();

foreach (string entry in PDToDelete)
{
    if (MessageBox.Show("Die Prüfdatei " + entry + " existiert nicht mehr. Sollen dazugehörige Datenbanksätze gelöscht werden?", "Löschen bestätigen", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
    {
        using (SqlCommand deleteEntriesFromDB_1 = new SqlCommand("DELETE FROM Pruefdatei WHERE Referenznummer = @PDN", sqlConn))
        {
            SqlParameter pathParam = new SqlParameter("@PDN", entry);
            deleteEntriesFromDB_1.Parameters.Add(pathParam);
            //This one doesn't work
            deleteEntriesFromDB_1.ExecuteNonQuery();
        }
        using (SqlCommand deleteEntriesFromDB_2 = new SqlCommand("DELETE FROM Pruefdatei_Import WHERE Pruefdatei = @PDN", sqlConn))
        {
            SqlParameter pathParam2 = new SqlParameter("@PDN", entry);
            deleteEntriesFromDB_2.Parameters.Add(pathParam2);
            deleteEntriesFromDB_2.ExecuteNonQuery();
        }
    }
}
sqlConn.Close();


Что я уже пробовал:

Я включил MARS и поместил операторы SQL в два отдельных использования.

0x01AA

а) это не имеет отношения к Марсу. Вы выполняете SQLs последовательно, и у них также нет результирующего набора.
Б.) есть ли исключения при отладке? Может быть, нарушение внешнего ключа? Или deleteEntriesFromDB_1 возвращает затронутые строки == 0?

1 Ответов

Рейтинг:
7

OriginalGriff

Мы ничем не можем помочь напрямую - у нас нет доступа к вашей базе данных, а вам это нужно плюс информация в вашем личном кабинете. entry переменная, чтобы понять, что происходит.

Итак, начните с отладчика и поставьте точку останова на первом using блок. когда он попадет в него, посмотрите на содержание entry и скопируйте его в буфер обмена.
Теперь откройте SSMS и выберите все записи из обеих таблиц с соответствующими записями (одна из которых соответствует Referenznummer, а другая-Pruefdatei).
Если у вас есть строки в обеих таблицах, пройдите через первую using заблокируйте и сделайте выбор снова. Вы должны иметь данные во второй таблице, но не в первой. Пройдите через второй блок и снова выберите. Вы должны были потерять данные обеих таблиц.

Если все это сработало, повторите этот процесс для каждой поездки по кругу. for петля.

Если что-то не соответствует тому, что вы ожидали, подумайте о данных, связанных с этим, и попытайтесь определить, почему нет.
Извините, но мы ничего не можем сделать для вас!


Patrick-Et. B.

К сожалению, я не могу отлаживать клиентскую систему, но постараюсь перестроить ее локально. Спасибо Вам за ваш подробный вклад.

OriginalGriff

Если вы не можете выполнить отладку, добавьте то же самое, что и операторы протоколирования, в плоский файл или БД и проверьте его после сбоя. Это может быть "старая школа", но именно так мы делали это до всех этих новомодных Идов! :смеяться: