Estoy trabajando en ASP.Net el uso de C# quiero generar un identificador de secuencia que debe ser como este:

ELG0001 , ELG0002, ...

ELG es el PREFIJO y 0001 deben estar en secuencia

Estoy utilizando sql server 2005

Este ID se genera y se añade a la base de datos. ¿Cómo puedo hacer esto?

me pueden ayudar con la codificación?

  • Serán elementos se pueden eliminar? De lo contrario, sólo aumentan en cada elemento.
InformationsquelleAutor user383664 | 2010-07-25

5 Comentarios

  1. 2

    Aquí es un simple IDENTIFICACIÓN de un Generador de 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

    La IDSeed tabla se siguen acumulando las filas. Esto probablemente no es un problema, pero si es un problema, usted puede purgar la mesa con una secuencia de comandos en una base regular. La única parte de la izquierda es para llamar al procedimiento desde código C# y recuperar el valor de la @TestID parámetro.

    Este ejemplo está basado en su pregunta: la secuencia no se espera que supere 9999 elementos. Usted tendría que modificar el código para soportar grandes secuencia de Identificadores.

    Tenga en cuenta que una transacción no es necesario en el procedimiento de NewSequenceID debido a que la función SCOPE_IDENTITY() sólo devuelve los valores de la corriente de sesión SQL. Si otro hilo realiza una casi simultánea de inserción, el valor devuelto desde SCOPE_IDENTITY() no se verán afectados.

  2. 2

    utilizando este código lo podemos hacer simplemente

    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;
    }

    thanxx por la ayuda
    sólo añadir que el método de CJ()
    como yo he hecho aquí

    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 = "";
    }
    }
  3. 1

    Bastante mucho no – que necesita para generar los números y de un almacén de datos persistente (como SQL Server) en última instancia, para garantizar la unicidad, incluso en el caso de que varias copias de su ASP.NET dominio de aplicación se ejecuta (lo cual puede suceder con regularidad).

    Así, la base de datos secundarios:

    • Necesita una tabla para todos los squences y el último valor asignado (Como «ELG» «1» – el número puede ser almacenado numérico)
    • EN una transacción: leer el último número de la actualización a la siguiente más alto, se comprometen y el número de devolución de alto nivel de código después de formatear.
    • Tienes razón que la de ir a la base de datos es lo correcto, pero discrepo con el método. Una nueva tabla es innecesario cuando él ya dijo que este es un db. Una identidad y de la columna calculada en la tabla existente sería mejor. También, en otros casos no es difícil escribir código C# que genera único secuencial de los identificadores de si puede garantizar unos simples restricciones.
    • Puede y no puede ser. De hecho tengo un ID secuencial generador de aquí codificado que utiliza una tabla, puede hacer el formato etc. – cada fila es un secuencial de IDENTIFICACIÓN de la instalación con el último número, paso a paso, las instrucciones de formateo.
  4. 0

    ¿Algo como esto?

    public enum SequenceIds
    {
    ELG0001 = 1,
    ELG0002
    }
    public void Something()
    {
    var x = SequenceIds.ELG0002;
    }
  5. 0

    Estamos utilizando mssql 2005 y nos estábamos enfrentando el mismo problema de tener un número único con un prefijo o un postfix.

    Se utilizó un procedimiento almacenado y una tabla para generar un número de secuencia para nosotros

    Siguiente es el código para el procedimiento almacenado

    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;

    El siguiente es el código de la tabla

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

    Si la base de datos habría sido de oracle, se obtiene secuencias como los objetos accesibles a partir de consultas SQL en sí. MSSQL no tiene esta funcionalidad.

Dejar respuesta

Please enter your comment!
Please enter your name here