Генерация уникального номера - PullRequest
3 голосов
/ 01 января 2012

Я должен создать логику для генерации уникального номера идентификатора для записей в базе данных.Идентификатор, сгенерированный в базе данных, представляет собой отдельный столбец.

В этот момент, когда пользователь вызывает действие «создать запись», я сохраняю новую запись, получаю ее идентификатор базы данных, генерирую номер записи, используя этот идентификатор, затем помещаю его вформа редактирования.Использование этого способа означает, что все поля сущностей должны иметь значение NULL для сохранения записи в базе данных.

Мне не нравится этот способ.Я знаю, что это должно быть лучше.

Есть ли лучшая практика для генерации уникального номера идентификатора?Что такое возможность генерации неуникальных случайных чисел?

Спасибо

Ответы [ 5 ]

7 голосов
/ 01 января 2012

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

Стандартный подход, который я бы порекомендовал, предназначен для создания.Запись, чтобы просто отобразить пустую форму (идентификатор в этой точке обычно будет 0).Пользователь заполняет форму, и данные передаются в базу данных только тогда, когда пользователь нажимает кнопку Сохранить.Идентификатор должен быть столбцом IDENTITY.

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

Альтернативный подход, если вы действительно должны отобразить идентификатор для пользователя, - это иметь отдельныйтаблица, содержащая строку со столбцом «Следующая запись».Этот столбец может быть увеличен и возвращен как элементарная операция и использован для заполнения идентификатора вашей новой записи.Вы по-прежнему не создаете реальную запись, просто увеличиваете этот «ID следующей записи» в действии «Создать запись».Используя этот подход, вы можете использовать один и тот же подход для нескольких сущностей, имея отдельные строки для каждой в этой таблице «Идентификаторы записи».Имейте в виду, что если пользователь в конечном итоге не сохранит запись в базе данных, идентификатор все равно будет «израсходован».Числа все равно будут уникальными и будут хронологическими, но не обязательно будут смежными.

1 голос
/ 18 июня 2012

Код для таблицы.

CREATE TABLE TblTransactions(
    TId varchar(8),
    TName varchar(50)
)

Код C # позади ...

protected void Page_Load(object sender, EventArgs e)
{
    string id = GenerateId("TblTransactions", "TId", 8, "TRN");
// insert the id along with data in the table
    Response.Write(id);
}

public string GenerateId(string TableName, string ColumnName, int ColumnLength, string Prefix)
{
    SqlConnection con = new SqlConnection("server=.;integrated security=true;database=EBissCard");
    string Query, Id;
    int PrefixLength, PadLength;
    PrefixLength = Convert.ToInt32(Prefix.Length);
    PadLength = ColumnLength - PrefixLength;
    Query = "SELECT '" + Prefix + "' + REPLACE(STR(MAX(CAST(SUBSTRING(" + ColumnName + "," + Convert.ToString(PrefixLength + 1) + "," + PadLength + ") AS INTEGER))+1," + PadLength + "),' ',0) FROM " + TableName;

    SqlCommand com = new SqlCommand(Query, con);
    con.Open();
    if (com.ExecuteScalar().ToString() == "")
    {
        Id = Prefix;
        for (int i = 1; i <= PadLength - 1; i++)
        {
            Id += "0";
        }
        Id += "1";
    }
    else
    {
        Id = Convert.ToString(com.ExecuteScalar());
    }
    con.Close();
    return Id;
}
1 голос
/ 01 января 2012

Я не понимаю, но, если вы используете тип данных uniqueidentifier в своей базе данных, это переводит в Guid в C #, так что вы можете сделать:

public Guid CreateRecord(MyObject model) {

    Guid newId = Guid.NewGuid();

    MyTable tbl = new MyTable();
    tbl.guid = newId;

    // ... other columns

    db.MyTable.AddObject(tbl);
    db.SaveChanges();

    return newId;
}

хотяобычно я использую PrimaryKey в качестве int и добавляю поле uniqueidentifier с именем guid (которое я использую публично вместо column_id), и не забывайте индексировать этот столбец.

0 голосов
/ 01 января 2012

Идея генерировать уникальный номер для записи, чтобы использовать время (в миллисекундах) (так как точки отсчета времени, скажем, 01/01/2010).

Однако, если одновременно обновляются 2 записи, это может вызвать проблему. Чтобы решить эту проблему, если каждому пользователю может быть назначен номер (при создании идентификатора пользователя), комбинация (конкатенация) этого «номера пользователя» и времени в миллисекундах даст вам необходимый уникальный номер.

0 голосов
/ 01 января 2012

Попробуйте Случайный класс из самой сети.

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