在C#中生成序列号

我正在使用C#在ASP.Net上工作我希望生成一个序列ID,应该是这样的:

ELG0001 , ELG0002, ... 

ELG是PREFIX,0001应该是顺序的

我正在使用sql server 2005

此ID将生成并添加到我的数据库中。 我怎样才能做到这一点?

你能帮我编码吗?

这是一个简单的SQL Server ID生成器:

 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个元素。 您必须修改代码以支持更大的序列ID。

请注意,在过程NewSequenceID中不需要事务,因为SCOPE_IDENTITY()函数仅返回当前SQL会话中的值。 如果另一个线程执行近同步插入,则SCOPE_IDENTITY()返回的值不会受到影响。

你几乎不可能 – 你需要最终在持久数据存储(如SQL Server)上生成数字,以保证唯一性,即使在运行ASP.NET appdomain的多个副本的情况下(可能会定期发生)。

那么,数据库方面:

  • 您需要一个表用于所有序列和最后指定的值(如“ELG”“1” – 数字可以存储为数字)
  • 在事务中:读取最后一个数字,更新到下一个更高的数字,提交并在格式化后将数字返回到高代码级别。

使用此代码我们可以简单地完成

 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的帮助只需添加方法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 = ""; } } 

这样的事怎么样?

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

我们正在使用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] 

如果数据库是oracle,则可以将序列作为可从SQL查询本身访问的对象。 MSSQL没有此function。