Как лучше всего избежать дублирования данных - PullRequest
0 голосов
/ 07 августа 2020

У меня есть этот код ниже generate series number после сохранения пользователя. Но моя проблема в том, что если пользователь системы сохраняет одновременно (many user), у него есть возможность иметь повторяющийся номер серии.

  public string GenerateSeriesNumber(string code, Entities db, string Ctrl)
    {
        string year = DateTime.Now.Year.ToString().Substring(2);

        string prev_ctrls = "";
        var tbl = db.SeriesTable.Where(a => a.SeriesNo.Contains(Ctrl)).OrderByDescending(a => a.SeriesNo);
        foreach (var item in tbl.ToList())
        {
            string[] current_srs = item.SeriesNo.Split('-');
            if (prev_srs == "")
                prev_srs = item.SeriesNo;

            int aaa = Convert.ToInt32(prev_srs.Split('-')[3]);
            int bbb = Convert.ToInt32(current_srs[3]);
            if (aaa < bbb)
                prev_srs = item.SeriesNo;

        }
        string Series_No = "";

        if (tbl != null)
        {
            string[] LastSeries_No = prev_srs.Split('-');
            if (LastSeries_No.Length == 4)
            {
                LastSeries_No[3] = Int32.Parse(LastSeries_No[3]) + 1 + "";
                for (int i = LastSeries_No[3].Length; i < 7; i++)
                {
                    LastSeries_No[3] = "0" + LastSeries_No[3];
                }
                LastSeries_No[1] = code.ToUpper();
                Series_No = String.Join("-", LastSeries_No);
                return Series_No;
            }
        }
       
        return Series_No;
    }

Я пытался выполнить это в моем SQL (I am using SQL Server 2017) но один из них обнаружил ошибку и не сохранил

ALTER TABLE dbo.SeriesTable
ADD CONSTRAINT UC_LT UNIQUE (SeriesNo);

1 Ответ

0 голосов
/ 12 августа 2020

Чтобы избежать дублирования данных, вы можете использовать разные методы:

  • Столбцы идентификаторов (не лучший вариант для серийных ключей)
  • NEWID () - см. здесь
  • Последовательность

В вашем случае я бы использовал NEWID () или просто порядковый номер и добавлял тире ('-') между цифрами.

ps. Если есть другие требования, которые вынуждают вас каким-то образом делать порядковый номер инкрементным или значимым, вы должны были включить их в вопрос.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...