ramy nemer Ответов: 1

Как повторить таблицу в sqland удалить строку при совпадении


у меня есть целое число, сохраненное при загрузке формы, при нажатии кнопки я хочу найти таблицу в SQL и посмотреть, есть ли в ней это целое число, мне нужно удалить всю строку, это код :
private void button3_Click(object sender, EventArgs e)
       {
           try
           {

               using (var cmd106 = new SqlCommand("select * from [dbo].[incidentNoReserve]", cnn))
               {

                   cnn.Open();
                   SqlDataReader reader = cmd106.ExecuteReader();
                   while (reader.Read())
                   {
                       int commonNo = Convert.ToInt16(reader["incidentNoReserveId"]);
                       //Every new row will create a new dictionary that holds the columns
                       if (Convert.ToInt16(commonNo) == newLastIncidentNo)
                       {
                           newLastIncidentNo = (Convert.ToInt16(commonNo));
                           using (SqlCommand command = new SqlCommand("Delete from[dbo].[incidentNoReserve] where incidentNoReserveId = @newLastIncidentNo", cnn))
                           {
                               cnn.Open();
                               command.Parameters.AddWithValue("@newLastIncidentNo", newLastIncidentNo);
                               command.ExecuteNonQuery();
                               cnn.Close();
                           }
                       }
                   }
                   reader.Close();
                   cnn.Close();
               }
           }
           catch (Exception ex)
           {
               //If an exception occurs, write it to the console
               Console.WriteLine(ex.ToString());
           }
           finally
           {
               cnn.Close();
           }
           this.Close();
       }


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

я использовал этот код его прекрасно, пока он не достигнет команды delete, он останавливается на cnn. open () и выскакивает за пределы области действия, не знаю, в чем проблема.

FranzBe

в блоке, который вы разместили, есть два cnn.Open() один за другим.
наружный блок using должно быть ", используя соединение" внутреннее через блок не может быть "команда".
Есть пустые без вести после "удалить из"

ramy nemer

это сработало, я стер внутренний cnn.Откройте и закройте, но вы имеете в виду добавление во внешний блок соединения перед использованием (var cmd106 = new SqlCommand("select * from [dbo].[incidentNoReserve]", cnn))??

FranzBe

для меня это "нормальный" способ его использования. связь - это ваш главный объект. так что это на первом месте.

using (var connection = new SqlConnection(ConnectionString))
{
соединение.Открыть();
использование (VAR command = ... )
{
}
}

это предполагает, что вы открываете и закрываете соединение для каждой команды.

1 Ответов

Рейтинг:
4

Dave Kreskowiak

С чего мне начать?.. С этим кодом масса проблем

Во-первых, код немного сложен для понимания, но похоже, что вы перечисляете все записи в таблице [incidentNoReserve], удаляя их все. Есть лучшие способы сделать это, чем удалять записи по одной.

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

По тем же линиям у вас есть соединение "Си-эн-эн", которое открывается дважды. Она уже открыта, вы не можете открыть ее снова, не закрыв сначала.

Ваш оператор SELECT возвращает все столбцы ( * ) в таблице incidentNoReserve, но вы используете только один столбец из нее. Никогда не используйте спецификатор*. Всегда указывайте каждый столбец, который вы хотите. Таким образом, вы ограничиваете объем работы, которую должен выполнять SQL server, ограничиваете объем информации, идущей "по проводам" в ваш код, делаете ваш код более устойчивым к изменениям схемы и облегчаете его отладку.

Вы преобразуете идентификатор записи в Int16. Это ограничивает ваши значения идентификатора записи максимум 32767. По большому счету, это не так уж много записей.

Что вы на самом деле пытаетесь сделать с этим кодом?


ramy nemer

очень полезное спасибо, я не удаляю все строки, основываясь на совпадении, я удаляю одну строку с соответствующим идентификатором.
что я пытаюсь сделать, это запустить приложение Я вывести последний id +1 от incidentNo, а затем сохранить этот идентификатор в incidentNoReserve ТБЛ,если я выйти из приложения этот код удаляется, не сохраняя ничего, но если приложение хранится этот идентификатор сохраняется в incidentNo ТБЛ и удален от incidentNoReserve ,на этой работе я могу получить удостоверение личности форма нагрузки и забронировать место в базе. Сейчас меняю и исправляю операторы if для обеспечения безопасности в базе данных.

ramy nemer

у меня есть вопрос относительно итерации, при чтении строк, если есть строка с Id = newLastIncidentNo, я увеличиваю newLastIncidentNo, но я хочу, чтобы читатель начал все сначала, как я должен это сделать ? это код :


using (var cmd105 = new SqlCommand ("select incidentNoReserveId from [dbo].[incidentNoReserve]", cnn))
{
телеканал CNN.Открыть();

Sqldatareader reader = cmd105. ExecuteReader();

в то время как (читатель. читать())
{//Каждая новая строка создает новый словарь, содержащий столбцы
если ((преобразовать.ToInt16(reader ["incidentNoReserveId"])) = = newLastIncidentNo)
{
newLastIncidentNo = newLastIncidentNo + 1;
//читатель.Закрывать();
}

}
телеканал CNN.Рядом();

}

Dave Kreskowiak

Я не знаю, что находится в таблице, но код опасно близок к удалению каждой отдельной записи в таблице.

То, что вы описываете в своем другом комментарии, звучит очень похоже на то, что вы пытаетесь присвоить свои собственные идентификационные номера таблице. Этот код никогда не будет работать в многопользовательской системе, где у вас есть несколько копий вашего приложения, работающих с одной и той же базой данных.

Вы действительно должны использовать столбцы идентификаторов с автоматической нумерацией для этого материала. Нет такой вещи, как" зарезервировать " идентификационный номер и заставить его работать хорошо.