我有一个字母数字的id。我如何自动增加(+1)数字?

时间:2013-11-12 01:49:58

标签: c# auto-increment

我有一个字母数字的id。我如何自动增加(+1)数字?

我应该将Survey ID设置为SVY0001到SVY9999。

每次添加新调查时,如何将数字增加1?

目前我的调查ID文本框中有一个正则表达式验证器,SVY是强制性的。

ValidationExpression="^SVY([0-9]{4})$"

请告诉我。

这是我的.cs代码。

protected void btnCreateSurvey_Click(object sender, EventArgs e)
{
    SqlConnection connection = null;
    SqlCommand command = null;

    try
    {
        string connectionString = ConfigurationManager.ConnectionStrings["SurveyFdDBConnString"].ConnectionString;
        connection = new SqlConnection(connectionString);
        connection.Open();

        string sql = "Insert into Survey (SurveyID, SurveyName, CreatedBy, DateCreated, Anonymous) Values " + "(@SurveyID, @SurveyName, @CreatedBy, @DateCreated, @Anonymous)";
        command = new SqlCommand(sql, connection);
        command.Parameters.AddWithValue("@SurveyID", txtBoxSurveyID.Text);
        command.Parameters.AddWithValue("@SurveyName", txtBoxSurveyName.Text);
        command.Parameters.AddWithValue("@CreatedBy", (string)Session["UserID"]);
        command.Parameters.AddWithValue("@DateCreated", DateTime.Now);
        command.Parameters.AddWithValue("@Anonymous", txtBoxAnonymous.Text);

        int rowCount = command.ExecuteNonQuery();

        if (rowCount != 0)
        {
            Session["SurveyID"] = txtBoxSurveyID.Text;
            Response.Write("Survey created successfully.<br/>");
            Response.Redirect("~/Admin/Select.aspx");
        }
    }

    catch (Exception ex)
    {
        Response.Write("Error: " + ex.Message);
    }

    finally
    {
        connection.Close();
        txtBoxSurveyID.Text = string.Empty;
        txtBoxSurveyName.Text = string.Empty;
        txtBoxAnonymous.Text = string.Empty;
    }
}

4 个答案:

答案 0 :(得分:3)

您可以使用组合键作为主键。在一列中包含字母数字代码,在另一列中包含数字。在整数列中,您可以设置为identity,sql为您完成工作。

设置组合键。创建两列,一个整数和一个varchar。在列中选择一个,然后选择第二个,然后在菜单中选择键的按钮,将它们设置为键。

然后转到属性&gt;标识列并从下拉列表中选择整数列。

组合键示例在菜单中选择键后,您会看到两列都带有键

enter image description here

选择列作为标识示例

enter image description here

答案 1 :(得分:2)

如果SVY部分只是一个前缀,我只会存储整数并连接前缀和整数以用于显示目的。如果它已修复,则无需将其包含在密钥中

答案 2 :(得分:1)

1)从sql获取总行数。

2)在btnCreateSurvey_Click内,总行数+ 1

3)Session["SurveyID"] = txtBoxSurveyID.Text + totalRowCount.ToString().PadLeft(4, '0'); //Assuming your textBoxSurvey ID is always "SVY"

答案 3 :(得分:0)

您可以这样做:

class SurveyId
{
  static int counter = 0 ;
  static readonly object Syncroot = new object() ;

  public override string ToString()
  {
    return string.Format( "SVY{0:0000}" , this.Value )
  }

  public int Value { get ; private set ; }

  private SurveyId( int value )
  {
    this.Value = value ;
  }

  public static SurveyId GetNext()
  {
    lock ( Syncroot )
    {
      ++counter ;
    }
    return new SurveyId(counter) ;
  }

}

虽然每次应用域都被回收时,您的调查ID都会从SVY0000重新启动。

在您的数据库中,您可以执行此操作并让数据库管理调查ID

create table dbo.survey
(
  id        int  not null identity(1,1) ,
  survey_id as 'SVY' + right('0000'+convert(varchar,id),4) ,
  name      varchar(255) not null ,
  -- other
  -- attributes
  -- here

  constraint Survey_PK primary key clustered ( id ) ,
  constraint Survey_AK01 unique nonclustered ( survey_id ) ,

)

您的插入语句将变为类似

insert dbo.survey (name) values( 'foobar')
select scope_identity()

您需要使用SQLCommand.ExecuteScalar(),它将返回刚刚插入的id列的值。