codetodead Ответов: 1

Есть ли примеры кодов для удаления данных базы данных и обновления целочисленного значения AUTO_INCREMENT в C#? Пожалуйста, кто-нибудь, помогите :'(


using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data.SqlClient;

namespace LAB9
{
    public partial class Delete : System.Web.UI.Page
    {
        SqlCommand cmd;
        SqlConnection conn;

        protected void Page_Load(object sender, EventArgs e)
        {

        }

        protected void Button1_Click(object sender, EventArgs e)
        {
            conn = new SqlConnection(@"Data Source=DESKTOP-2IECU3E\SQLEXPRESS;Initial Catalog=LAB9;Integrated Security=True");
            conn.Open();

            cmd = new SqlCommand("DELETE FROM Registration WHERE (id = '" + TextBox1.Text + "')", conn);
            cmd.ExecuteNonQuery();
            //cmd = new SqlCommand("SET @num := 0", conn);

            //cmd = new SqlCommand("UPDATE Registration SET id = @num := (@num + 1)", conn);
            //cmd.ExecuteNonQuery();
            //cmd = new SqlCommand("ALTER TABLE Registration AUTO_INCREMENT = 1", conn);
            //cmd.ExecuteNonQuery();
            Label1.Text = "Data successfully deleted!";
            TextBox1.Text = "";
            conn.Close();
        }
    }
}


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

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

Старые данные-это id: 1 > 2 > 3
после удаления данных 3 и вставки новых данных,
То, что я ожидал id: 1 > 2 > 3
В конце id: 1 > 2 > 4

Пожалуйста, научи меня любому сэмпаю

Shambhoo kumar

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

codetodead

Ты говоришь что-то в этом роде? https://www.codeproject.com/Questions/505381/AutoplusIncrementplusnumberplusinplustextboxplusus

Shambhoo kumar

Существуют различные способы реализации вашей логики. я посылаю какую-то ссылку, объясняющую, почему автоматическое приращение ужасно.

https://www.clever-cloud.com/blog/engineering/2015/05/20/why-auto-increment-is-a-terrible-idea/



CHill60

Я совершенно не согласен с вашим предложением написать свою собственную логику для замены автоинкремента! Это, вероятно, вызовет серьезные проблемы в многопользовательских средах. Если ОП имеет MSSQL 12.0 или выше, то последовательности-это правильный путь вперед SQL Server: последовательности (автономер)[^]
Дискуссия о полях идентичности имеет сторонников с обеих сторон. Есть вещи, которых следует избегать-см. Аарон Бертран : вредные привычки, чтобы пнуть: положить столбец идентичности на каждый стол[^Честно говоря, я думаю, что ссылка, которую вы выбрали, чтобы показать, почему "автоматическое приращение ужасно", представляет собой слабый аргумент. В этом блоге есть лучшая информация о том, почему накладные расходы UUID в качестве первичного ключа могут стоить того Первичные ключи: идентификаторы и идентификаторы GUID[^]

Shambhoo kumar

я согласен, но вместо того, чтобы использовать автоматическое приращение, мы можем реализовать guid.

1 Ответов

Рейтинг:
8

David_Wimbley

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

Однако, чтобы просто ответить на этот вопрос, вам нужно посмотреть на DBCC CHECKIDENT. Поскольку вы используете операторы SQL, это должно соответствовать вашим требованиям.

DBCC CHECKIDENT (Transact-SQL) | Microsoft Docs[^]

Поэтому в вашем примере вы бы использовали его, сказав cmd = new SqlCommand("DBCC CHECKIDENT('Registration', RESEED, 0)", conn); где 0 - это последний вставленный идентификатор, который вы хотите вставить. Возможно, вы сможете просто оставить его на 0 и автоматически увеличить его с того места, где он остановился, но я немного заржавел в этой команде.


codetodead

Большое спасибо! Я попробовал использовать приведенные коды, но потом произошло еще одно, появился дубликат id: 1 > 2 > 3 > 1. Затем я попытался сделать его уникальным ключом, но это тоже не сработало...