表单中需要一个自动生成的ID字段

时间:2013-03-06 09:50:01

标签: asp.net

当用户点击提交按钮时会发生这一切

我的要求:ID格式应为FF-YY-00001-A(这是表格的字段)

1 FF是快捷方式名称

2.YY是当前日期,我想将其保存在表格中作为年份字段,以便它有助​​于追踪报告,条件:我必须采取一年的最后部分,即假设2013 =&gt ; 13 2014年>> 14

下一个字段是autoincrement字段,为此它应该生成并递增1 我想,这个值可以来自Serial no的表中的自动增量字段。比如sr.no = 1,我们可以取这个字段00001或1 00001(如果可以,应该更好)

我们还必须将此值增加到1 [*我们必须得到比较的先前值,我们可以使用最后一个记录和字段sr.no的帮助

4.A / B / C / D是用户的选项

在此之后

现在我们的ID应该是FF-13-1-A下一个:FF-13-2-B下一个条目:FF-13-3-C

注意:我们必须考虑Dash( - ),即我们的ID格式包括Dash即( - )

提交按钮后:

a)ID字段将更新示例:FF-YY-00001 b)自动增量字段Sr.no获取值示例:如1 c)年份字段将更新示例:如2013

希望你能理解要求

2 个答案:

答案 0 :(得分:1)

也许这会对你有所帮助:

int clientId = 3;
int otherId = 4

var id = String.Format("FF-{0}-{1:D5}-A", otherId, clientID);

您可以通过将FF替换为{arg}来设置字母。您可以通过调用dropdownlist

dropdownlist.SelectedValue获取值

+

Generating an array of letters in the alphabet

答案 1 :(得分:0)

我将假设这个问题不仅仅是关于格式化文本,还涉及多个并发用户的上下文中的id连续性。有两种情况:

  1. 您希望在保存表单之前获取自动生成的ID 并将其显示给用户。

    如果是这种情况,由于用户并发性,它非常棘手。如果2个用户将打开表单,则必须为彼此分配下一个自动递增的值(可能形成数据库或其他持久存储)。如果你这样做,他们会有连续的ID。但是,如果第一个用户在第二个用户填写表单时取消该表单,这将破坏该字段的自动递增部分的连续性(第二个用户已经具有正在跳过该表单的ID,该表已被取消)。作为此方案的唯一解决方法,您必须打破ID连续性或在使用新值保存后替换它(这没有多大意义)。

  2. 保存表单后,您将向用户显示自动生成的ID。

    这很容易做到,而且(在我看来)最好的方法是将用户选项(A/B/C/D),最终也是一年的最后两位数发送到数据库存储过程,它将通过字符串连接处理自动生成的id的创建。之后您需要做的就是从数据库中返回自动生成的ID。

  3. <强> [UPDATE]

    如果您选择第二种情况,我会发布一个示例,说明您必须做的事情。我假设您正在使用MS SQL Server,存储过程也是您的选择。

    首先,我将在此示例中使用一个简单的表单:

    <form id="form1" runat="server">
        <div>
            <asp:DropDownList runat="server" ID="ddl">
                <asp:ListItem Text="A" Value="A"></asp:ListItem>
                <asp:ListItem Text="B" Value="B"></asp:ListItem>
                <asp:ListItem Text="C" Value="C"></asp:ListItem>
                <asp:ListItem Text="D" Value="D"></asp:ListItem>
            </asp:DropDownList>
            <asp:Button runat="server" ID="btn" 
                OnClick="btn_Click" Text="Add form" />
            <asp:Label runat="server" ID="label" />
        </div>
    </form>
    

    添加处理按钮点击的方法:

    protected void btn_Click(object sender, EventArgs e)
    {
        var year = DateTime.Now.Year.ToString();
        var yearDigits = year.Substring(year.Length - 2);
        var generatedId = SaveForm(yearDigits, ddl.SelectedValue);
        label.Text = generatedId;
    }
    

    将您的连接字符串添加到可从SaveForm方法访问的位置:

    const string connectionString = @"yourConnectionString";
    

    添加执行插入的方法并返回自动生成的id:

    private string SaveForm(string yearDigits, string userOption)
    {
        string autoId;
        using (var sqlConnection = new SqlConnection(connectionString))
        {
            try
            {
                sqlConnection.Open();
                using (var sqlCommand = new SqlCommand("AddForm", sqlConnection))
                {
                    sqlCommand.CommandType = CommandType.StoredProcedure;
                    sqlCommand.Parameters.Add("year", SqlDbType.Char, 2)
                        .Value = yearDigits;
                    sqlCommand.Parameters.Add("option", SqlDbType.Char, 1)
                        .Value = userOption;
                    var outputParameter = new SqlParameter();
                    outputParameter.ParameterName = "autoId";
                    outputParameter.Direction = ParameterDirection.Output;
                    outputParameter.SqlDbType = SqlDbType.Char;
                    outputParameter.Size = 14;
                    sqlCommand.Parameters.Add(outputParameter);
                    sqlCommand.ExecuteNonQuery();
                    autoId = outputParameter.Value.ToString();
                }
            }
            catch (Exception)
            {
                // TODO: manage exception
                throw;
            }
        }
        return autoId;
    }
    

    在SQL服务器端,我们将使用一个简单的表:

    CREATE TABLE [dbo].[Forms](
        [Id] [int] IDENTITY(1,1) NOT NULL,
        [GeneratedId] [char](14) NOT NULL,
        CONSTRAINT [PK_Forms] PRIMARY KEY CLUSTERED 
        (
            [Id] ASC
        )
    )
    

    现在,添加将插入宿舍数据的存储过程,并返回自动生成的id:

    CREATE PROCEDURE [dbo].[AddForm]
        @year char(2),
        @option char(1),
        @autoId char(14) output
    AS
    BEGIN
        DECLARE @rows int
        SELECT 
            @rows = (SELECT COUNT(*) FROM [Forms]),
            @autoId = 'FF-'+@year+'-'+Replace(Str(
                CASE
                    WHEN @rows = 0 THEN 1 
                ELSE 
                    IDENT_CURRENT('Forms')+1 
                END
            , 6), ' ' , '0')+'-'+@option
        INSERT Forms (GeneratedId) VALUES (@autoId)
    END
    

    应该是全部。