vijay_bale Ответов: 2

Удаление некоторых записей в sqldatabase вновь назначить autocount количество из C#


Я ограничил свой Datagridview файлом базы данных SQL.Я веду колонку в SQL под названием slno. Я показывать, что сльно в элементе управления datagridview.
When I am selecting a row and deleting the record I want to reassign the autocount numbers to slno.


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

Я попытался подсчитать строки в файле базы данных и присвоить это число
DBCC CHECKIDENT ('tempsales', RESEED, rowcount)\\in my case 5
But error is coming "Parameter 5 is incorrect for the DBCC statement"

2 Ответов

Рейтинг:
2

Wendelius

Если вы пытаетесь использовать переменную для повторного заполнения таблицы, используйте @ перед именем или переменной. Например

DECLARE @rowcount INT;
SET @rowcount = 5;
DBCC CHECKIDENT ('tempsales', RESEED, @rowcount);

Или просто
DBCC CHECKIDENT ('tempsales', RESEED, 5);

Обратите внимание, что обычно повторное заполнение идентификатора не требуется, так как единственная цель-дать уникальные значения. Никогда не предполагайте, что значения непрерывны!


vijay_bale

Я сделал в точности то, что ты сказал. Но приходит Ошибка "необходимо объявить переменную скалера" @rowcount"

Wendelius

Не выполняйте операторы отдельно, вместо этого выполняйте их в одном пакете.

Если вы используете Management Studio, вы можете, например, выбрать все три строки и нажать клавишу F5, чтобы запустить выбранные операторы.

vijay_bale

работает в c#, так что все будет работать в сингальской пакетной na.
Мой код таков
против.Открыть();
SqlCommand cmd = new SqlCommand ("SELECT COUNT (*) FROM tempsales", con);
УМК.Метод executenonquery();
Int32 rowcount = (Int32)cmd.Executescalar так();
Ящик для сообщений.Шоу(количество строк.Метод toString());
Команда sqlcommand кд = новая команда sqlcommand("инструкция DBCC checkident, будет ('tempsales', повторное заполнение, @строк)", кон);
компакт-диск.Метод executenonquery();

Wendelius

Как уже было сказано,вы не можете получить непрерывную последовательность чисел с полем идентификации. Единственная цель идентичности-дать уникальные числа, а не непрерывные.

Рассмотрим ситуацию, когда у вас есть строки 1, 2, 3 и 4. Если 1 будет удален, что должно произойти? Если вы пересчитаете идентичность, она получит число 3, но оно уже существует...

Если вам нужно показать текущие номера строк, просто используйте ROW_NUMBER (Transact-SQL) | Microsoft Docs[^] при запросе.

Wendelius

На основе описания из решения 2:
"ex: - у меня есть записи 2,3,4,6,7,8 sno(index number) (1,5 я уже удалил), но это отображение чисел 1,2,3,4,5,6. Вот чего я хочу. Но когда я пытаюсь удалить 2 записи, это не так, потому что нет 2 существующих в обоих. но я попытался удалить 5-ю запись, которую он удалит. потому что этот 5-й индекс записи sno(index number) не находится в файле базы данных, но есть в этом списке то, что вы сказали, поэтому он будет удален, а номера также обновлены с самого начала. Может быть, я думаю, что объяснил все, что мог."

Я не уверен, правильно ли я понимаю, но вы пытаетесь удалить/обновить запись на основе ординалов? Например, если у вас есть значения 1,5,9 и 11 в базе данных, у вас будет 4 записи. При заказе у вас будет список 1,2,3 и 4. Однако вы не можете обновить запись 2 на основе порядкового номера, так как значение ключа равно 5. Поэтому, чтобы манипулировать записью, всегда используйте ключевое значение, а не позицию в списке или что-то подобное.

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

Рейтинг:
0

OriginalGriff

Не. Идея поля идентичности заключается в том, что оно уникально, но (намеренно) не обязательно последовательно. На практике они последовательны, но SQL никогда не "повторно использует" освобожденные числа при удалении записей, чтобы любые другие системы или таблицы, ссылающиеся на строку через поле, не забирали "неправильные" данные.
Если вы хотите последовательный номер строки в поле идентификатора, а затем использовать row_number и порядок:

SELECT ROW_NUMBER() OVER (ORDER BY ID ASC) AS [Sequence Number], * FROM MyTable
Это всегда даст вам последовательность, начинающуюся с 1, без пробелов.


"да, это дает, но я хочу отобразить все в datagridview, чтобы каждый раз, когда пользователь удаляет запись, она пересчитывалась"


Это тривиально! Все, что вам нужно, - это столбец, чтобы поместить его в него и обработать событие RowPrePaint:
void myDataGridView_RowPrePaint(object sender, DataGridViewRowPrePaintEventArgs e)
    {
    myDataGridView.Rows[e.RowIndex].Cells[0].Value = e.RowIndex + 1;
    }


vijay_bale

да это дает но я хочу отобразить все в datagridview так что каждый раз если пользователь удалит запись он будет пересчитывать

OriginalGriff

Ответ обновлен

vijay_bale

Это не работает точно.Эти порядковые номера не равны тому, что я поддерживаю в поле sno, которое записывает только удаленные записи.

OriginalGriff

Хочешь попробовать еще раз, на этот раз по-английски? :смеяться:

vijay_bale

конечно. Я попробую. Но я не настолько хорош. Потому что английский-не мой родной язык.
пример: - у меня есть 2,3,4,6,7,8 записей sno(index number) (1,5 я уже удалил), но это отображение чисел 1,2,3,4,5,6. Вот чего я хочу. Но когда я пытаюсь удалить 2 записи, это не так, потому что нет 2 существующих в обоих. но я попытался удалить 5-ю запись, которую он удалит. потому что этот 5-й индекс записи sno(index number) не находится в файле базы данных, но есть в этом списке то, что вы сказали, поэтому он будет удален, а номера также обновлены с самого начала. Может быть, я думаю, что объяснил все, что мог.