序中创建唯一序号

2018-09-06 11:57

阅读:326

  原文标题是写的在,其实很多方法也可以用于其他类型的唯一序号获得的

  以下引用只做资料转存,如有版权问题,自当取消。

  

在ASP.NET程序中创建唯一序号

  

闻怡洋

  

2004/10/22

  

  

如果在程序中需要创建全局唯一的序号,那么必须对创建序号的过程进行同步处理,防止多个并发访问时出现相同序号的情况。下面列出几种方法供大家参考。

  利用数据库的方法

  

后面的例子都基于MS SQL Server,如果使用Oracle可以直接读取Sequence对象,则不需要进行如此复杂的操作。

   方法1:利用表锁定

表结构:

  create table xtab (seq_id int primary key, create_time datetime)

  

存储过程或SQL语句:

  begin tran

  declare @max_seq int

  --读出记录时锁定表

  select @max_seq=max(seq_id) from xtab with (TABLOCKX)

  set @max_seq = isnull(@max_seq,0)

  set @max_seq = @max_seq+1

  print @max_seq

  insert into xtab values(@max_seq,getDate())

  commit

  --变量@max_seq 中存放的就是当前产生的序号

  

   方法2:利用自增字段

如果利用自增变量可以通过方法1中锁定表,然后再插入记录,并读取最大值的方法。不过下面讲的是通过C#的来插入记录,并读取已经插入的记录的自增字段。

  

表结构:

  create table xtab_i (seq_id int IDENTITY(1,1) primary key, create_time datetime)

  

C#代码,利用时间处理函数在数据被更新时同时读取@@IDENTITY变量的值。完整内容参考:OleDbWrap.cs 文件。

  

//参数内容:

  

//szSelectSql = select * from xtab_i where seq_id isnull;

  

//szTabName = xtab_i;

  

  /// <summary>

  /// 通过查询语句 创建DataSet对象,返回的对象用于执行插入操作

  /// </summary>

  /// <param name=szSelectSql>SQL语句</param>

  /// <param name=szTabName>表名称</param>

  /// <returns>用于插入的DataSet对象</returns>

  public DataSet CreateInsertDataSet_bySelect(string szSelectSql,string szTabName)

  {

   m_dbAdapter.SelectCommand = new OleDbCommand(szSelectSql, m_dbConn);

   OleDbCommandBuilder cb = new OleDbCommandBuilder(m_dbAdapter);

   DataSet ds = new DataSet();

   m_dbAdapter.Fill(ds, szTabName);

   m_dbAdapter.RowUpdated += new OleDbRowUpdatedEventHandler(OnRowUpdated_Inserted);

   return ds;

  }

  //----------------私有事件处理

  /// <summary>

  /// 处理数据插入的更新事件

  /// </summary>

  /// <param name=sender></param>

  /// <param name=args></param>

  protected void OnRowUpdated_Inserted(object sender, OleDbRowUpdatedEventArgs args)

  {

   OleDbCommand idCMD = new OleDbCommand(SELECT @@IDENTITY, m_dbConn);

   {

   object rObj = idCMD.ExecuteScalar();

   if(rObj == null)

   m_iDbIdentity =-1;

   else if( rObj.ToString() !=)

   m_iDbIdentity = Int32.Parse(rObj.ToString());

  &


评论


亲,登录后才可以留言!