Thomas Kiær Ответов: 3

Проблема C# SQL ID, как проверить используемый идентификатор


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

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

// GET: Kundes/CreateOffentlig()
public ActionResult CreateOffentlig()
{
  ViewBag.KundeID = new SelectList(db.KundeOffentlig, "KundeID", "InstitutionsNavn");
  ViewBag.KundeID = new SelectList(db.KundePrivat, "KundeID", "PrivatMail");
  ViewBag.KundeID = new SelectList(db.KundeStorKunde, "KundeID", "FirmaNavn");
  Kunde kunde = new Kunde();
  kunde.KundeGr = 2;
  kunde.KundeID = db.Kunde.Max(p => p.KundeID) + 1;

  return View(kunde);
}

// POST: Kundes/Create
// To protect from overposting attacks, please enable the specific properties you want to bind to, for 
// more details see https://go.microsoft.com/fwlink/?LinkId=317598.
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult CreateOffentlig([Bind(Include = "KundeID,KundeGr,ForNavn,EfterNavn,Adresse1,Adresse2,PostNr,Mobil,InstitutionsNavn,CVRNummer,InstitutionsLeder,Mail")] Kunde kunde, KundeOffentlig kundeOffentlig)
{
  if (ModelState.IsValid) //Fejlhåndtering i forbindelse med id er brugt
  {
    try
    {
      kunde.KundeID = db.Kunde.Max(p => p.KundeID) + 1;
      kundeOffentlig.KundeID = kunde.KundeID;
      db.Kunde.Add(kunde);
      db.KundeOffentlig.Add(kundeOffentlig);
      db.SaveChanges();

      return RedirectToAction("Index");
    }
    catch (Exception)
    {
      ModelState.AddModelError("", "KundeID Already used ");

      return View(kunde);
    }
  }
}

F-ES Sitecore

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

Kornfeld Eliyahu Peter

https://docs.microsoft.com/en-us/sql/t-sql/statements/create-table-transact-sql-identity-property?view=sql-server-2017

3 Ответов

Рейтинг:
1

CHill60

В то время как Решение 1 будет работать для предотвращения дубликатов, см. комментарий от S-ES Sitecore. Не создавайте идентификаторы с помощью "следующего номера" - что делать, если два пользователя попытаются обновить таблицу одновременно - вы получите дубликаты идентификаторов.

Вы могли бы использовать удостоверение личности - см. Комментарий Корнфельда Элиягу Питера IDENTITY (Property) (Transact-SQL) - SQL Server | Microsoft Docs[^]

Или вы можете использовать последовательность - Последовательность, обновляемый Альтернатива для столбца идентификаторов | Ханс Михельс – блог и многое другое[^]


TheRealSteveJudge

- Да, ты прав. Личность должна быть использована. 5*

Рейтинг:
0

TheRealSteveJudge

При создании таблицы убедитесь, что у вас есть первичный ключ.
Объяснение см. здесь Ограничение первичного ключа SQL[^]
Если вы не хотите воссоздавать свою таблицу, пожалуйста, следуйте этому разделу

SQL PRIMARY KEY on ALTER TABLE

При создании таблицы вы должны использовать Identity
напр.
create table Example
(
   ID int IDENTITY(1,1) PRIMARY KEY,
   ...
)

как описано в SQL автоматическое увеличение поля[^]


Рейтинг:
0

Thomas Kiær

Это сработало для меня :-)



if (ModelState.IsValid) //Fejlhåndtering i forbindelse med id er brugt
            {
                try
                {
                    
                    kundePrivat.KundeID = kunde.KundeID;
                    db.Kunde.Add(kunde);
                    db.KundePrivat.Add(kundePrivat);
                    db.SaveChanges();
                    return RedirectToAction("Index");
                }
                catch (Exception)
                {
                    int kundeID = db.Kunde.Max(p => p.KundeID) + 1;
                    ModelState.AddModelError("", "KundeID er allerede brugt. Nyt ID foreslået ;-)");
                    ModelState.SetModelValue("KundeID",
                        new ValueProviderResult(
                            kundeID,
                            kundeID.ToString(),
                            System.Globalization.CultureInfo.InvariantCulture
                        )
                    );
                    return View(kunde);

                }


CHill60

Не вините нас, когда вы получаете дубликаты идентификаторов в многопользовательской среде! Вы студент, у которого было 4 опытных программиста - "эксперты" - говорят вам, чтобы вы не увеличивали "последнее число" в базе данных. Это неправильный путь к этому.

Dave Kreskowiak

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

Опять же, никогда не создавайте свои собственные значения идентификаторов.