序中创建唯一序号
2018-09-06 11:57
原文标题是写的在,其实很多方法也可以用于其他类型的唯一序号获得的
以下引用只做资料转存,如有版权问题,自当取消。
在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());
&