Генерация порядкового номера в C # - PullRequest
2 голосов
/ 25 июля 2010

Я работаю над ASP.Net с использованием C #. Я хочу создать идентификатор последовательности, который должен выглядеть следующим образом:

ELG0001 , ELG0002, ...

ELG - ПРЕФИКС, а 0001 должен быть в последовательности

Я использую SQL Server 2005

Этот идентификатор будет создан и добавлен в мою базу данных. Как я могу это сделать?

Можете ли вы помочь мне с кодированием?

Ответы [ 5 ]

2 голосов
/ 25 июля 2010

используя этот код, мы можем сделать это просто

public string CJ()
    {
        string Id = GenerateId("cust", "cust_id", 6, "ELG", true);
        return Id;
    }
    public string GenerateId(string TableName, string ColumnName, int ColumnLength, string Prefix, bool Padding)
    {
        string Query, con, Id;
        con = "Data Source=CJ\\SQLEXPRESS;Initial Catalog=seq;Persist Security Info=True;User ID=sa;Password=123";
        SqlConnection cn = new SqlConnection(con);
        int preLength,padLength;
        preLength = Convert.ToInt32(Prefix.Length);
        padLength = ColumnLength - preLength;
        if (Padding == true )
        {
             Query = "SELECT '" + Prefix + "' + REPLACE(STR(MAX(CAST(SUBSTRING(" + ColumnName + "," + Convert.ToString(preLength + 1) + "," + padLength + ") AS INTEGER))+1," + padLength + "),' ',0) FROM " + TableName;

        }
        else
        {
            Query = "SELECT '" + Prefix + "' + CAST(MAX(CAST(SUBSTRING(" + ColumnName + "," + Convert.ToString(preLength + 1) + "," + padLength + ") AS INTEGER))+1 AS VARCHAR) FROM " + TableName;
        }
        SqlCommand com = new SqlCommand(Query, cn);
        cn.Open();
        if (com.ExecuteScalar().ToString() == "")
        {
            Id = Prefix;
            if (Padding == true)
            {
                for (int i = 1; i  padLength - 1; i++)
                {
                    Id += "0";
                }
            }
            Id += "1";
        }
        else
        {
            Id = Convert.ToString(com.ExecuteScalar());
        }
        cn.Close();
        return Id;
}

спасибо за помощь, просто добавьте метод CJ (), как я сделал здесь

protected void Button1_Click(object sender, EventArgs e)
    {
        string con;
        con = "Data Source=CJ\\SQLEXPRESS;Initial Catalog=seq;Persist Security Info=True;User ID=sa;Password=123";
        using (SqlConnection cn = new SqlConnection(con))
        {
            cn.Open();
            using(SqlTransaction trans = cn.BeginTransaction())
            using (SqlCommand cmd = cn.CreateCommand())
            {
                cmd.Transaction = trans;
                cmd.CommandText = "INSERT INTO cust([cust_id],[cust_name],[cust_add]) VALUES(@cust_id,@cust_name,@cust_add)";
                cmd.Parameters.Add("@cust_id",CJ());
                cmd.Parameters.Add("@cust_name",TextBox1.Text);
                cmd.Parameters.Add("@cust_add",TextBox2.Text);
                cmd.ExecuteNonQuery();
                trans.COmmit();
            }
            cn.Close();
            Response.Write("alert('DATA SAVED')");
            TextBox1.Text = "";
            TextBox2.Text = "";
        }

   }
2 голосов
/ 25 июля 2010

Вот простой генератор идентификаторов для SQL Server:

CREATE TABLE IDSeed
(
    ID int IDENTITY(10001,1)
)
GO

CREATE PROCEDURE NewSequenceID
(
    @NewID char(7) out
)
AS
BEGIN
    INSERT INTO IDSeed DEFAULT VALUES

    SELECT @NewID = 'ELG' + RIGHT(CAST(SCOPE_IDENTITY() AS nvarchar(5)), 4)
END
GO

/*
 * Test the NewSequenceID proc
 */
DECLARE @TestID char(7)

EXEC NewSequenceID @TestID out

SELECT @TestID

Таблица IDSeed будет продолжать накапливать строки. Вероятно, это не проблема, но если это проблема, вы можете регулярно очищать таблицу с помощью скрипта. Единственная оставшаяся часть - это вызов процедуры из кода C # и получение значения параметра @TestID.

Этот пример основан на вашем вопросе: последовательность не должна превышать 9999 элементов. Вам придется изменить код для поддержки больших идентификаторов последовательности.

Обратите внимание, что транзакция не требуется в процедуре NewSequenceID, поскольку функция SCOPE_IDENTITY () возвращает значения только из текущего сеанса SQL. Если другой поток выполняет почти одновременную вставку, это не повлияет на значение, возвращенное функцией SCOPE_IDENTITY ().

1 голос
/ 25 июля 2010

Вы в значительной степени не можете - вам нужно в конечном итоге генерировать числа в постоянном хранилище данных (например, SQL Server) и из него, чтобы гарантировать уникальность, даже если запущено несколько копий домена приложения ASP.NET (что может регулярно).

Итак, сторона базы данных:

  • Вам нужна таблица для всех последовательностей и последнего присвоенного значения (например, «ELG», «1» - число может быть сохранено в числовом виде)
  • В транзакции: прочитать последнее число, обновить до следующего более высокого числа, зафиксировать и вернуть номер до высокого уровня кода после форматирования.
0 голосов
/ 25 июля 2010

Мы используем mssql 2005, и мы столкнулись с той же проблемой - иметь уникальный номер с префиксом или постфиксом.

Мы использовали хранимую процедуру и таблицу для генерации порядкового номера для нас

Ниже приведен код для хранимой процедуры

CREATE PROCEDURE [get_next_receipt_no]
(
  @pSequenceValue INT OUTPUT
)
AS
BEGIN;
  BEGIN TRAN;
    INSERT INTO seq_receipt_no DEFAULT VALUES;
    SET @pSequenceValue = SCOPE_IDENTITY();
    DELETE FROM seq_receipt_no WHERE SEQ_ID <> @pSequenceValue;
  COMMIT TRAN;
END;

Ниже приведен код для таблицы

CREATE TABLE [seq_receipt_no](
    [SEQ_ID] [int] IDENTITY(1,1) NOT NULL
) ON [PRIMARY]

Если база данных была бы оракулом, вы получаете последовательности в виде объектов, доступных из SQL-запросов. MSSQL не имеет этой функциональности.

0 голосов
/ 25 июля 2010

Как насчет этого?

public enum SequenceIds
{
    ELG0001 = 1,
    ELG0002
}

public void Something()
{
    var x = SequenceIds.ELG0002;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...