我假设这个问题不仅与格式化文本有关,还与多个并发用户上下文中的 id 连续性有关。有2种情况:
您想在保存表单并将其显示给用户之前获取自动生成的 ID。
如果是这种情况,由于用户并发性,这非常棘手。如果 2 个用户将打开一个表单,您将必须为彼此分配下一个自动递增的值(可能来自数据库或其他持久存储)。如果你这样做,他们将有连续的 id。但是,如果第一个用户在第二个用户填写表单时取消了表单,这将破坏该字段的自动递增部分的连续性(第二个用户已经有一个 id 正在跳过之前的那个,它被取消了)。作为这种情况的唯一解决方法,您必须中断 ID 连续性或在保存后将其替换为新值(这没有太大意义)。
保存表单后,您将向用户显示自动生成的 ID 。
这很容易做到,最好的方法(在我看来)是将用户选项A/B/C/D
(通过字符串连接自动生成 id。之后您要做的就是从数据库中返回自动生成的 ID。
[更新]
如果您选择第二种情况,我将发布一个示例,说明您必须做的事情。我假设您使用的是 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
这应该就是全部了。