工具软件   办公软件   操作系统   网络安全   设计在线   程序开发   教程宝典   软件下载   软件论坛
您的位置:软件 > 开发者网络 > 微软开发专栏 > Visual Studio.net专栏 > ASP.net > 正文
在ASP.NET程序中创建唯一序号
[文章信息]
作者:闻怡洋
时间:2004-10-31
出处:VCHELP
责任编辑:方舟
[文章导读]
如果在程序中需要创建全局唯一的序号,那么必须对创建序号的过程进行同步处理,防止多个并发访问时出现相同序号的情况
advertisement
热点推荐
· ImageReady制作“焰火”小动画
· Java加密和数字签名编程快速入门
· 在VB6中用命令行为模式控制GUI动作
· Excel图表向导详解
· 浅析各种计算机病毒应对方法
[正文]

1 2  下一页

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

  利用数据库的方法

  后面的例子都基于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#的ADO.NET来插入记录,并读取已经插入的记录的自增字段。

  表结构:

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);
 if (args.StatementType == StatementType.Insert)
 {
  object rObj = idCMD.ExecuteScalar();
  if(rObj == null) m_iDbIdentity =-1;
  else if( rObj.ToString() !="")
   m_iDbIdentity = Int32.Parse(rObj.ToString());
  else
   m_iDbIdentity =-1;
 }
 idCMD.Dispose();
 //m_iDbIdentity变量中包含的就是当前插入列的自增字段的值
}

  利用程序控制

  方法1:利用ASP.NET中的Application对象

  利用ASP.NET中的全局HttpApplicationState对象。

  C#代码:

Application.Lock();

Application[“xlock”]=”locked’;

try

{ //必须捕捉异常,避免无法解锁对象

//your Code here

}

catch (Exception e)

{

}

Application[“xlock”]=”unlock”;

  方法2:利用操作系统中的同步对象来实现同步

  在dotNet的框架的System.Threading命名空间下定义了多种用于同步的类,例如:Mutex,Semaphore。下面介绍一下利用互斥对象Mutex来实现同步的方法。

  C#代码:

void Test()
{ //需要引入 System.Threading;
//创建名为MyMutex的互斥对象,如果OS已经创建过同名对象则只是重新获得句柄

Mutex m = new Mutex(false, "MyMutex");
//在10秒内等待取得访问权
boolean getMutex=m.WaitOne(10*1000,false);
if(getMutex)
{ //已经取得访问权
 try
 {
  //必须捕捉异常,避免无法解锁对象
  //Your code here
 }
 catch(Exception e)
 {
 }
 m.ReleaseMutex();
}
else
{
 //没有取得访问权
}

}

  在程序中应该尽量使用Mutex这类可以命名的同步对象以达到创建多个同步对象,对多种资源进行同步的目的。如果要实现多个同入可以使用信号量 Semaphore。

  其他方法:利用lock关键字防止线程并发同一段代码执行

  C#代码:

class CTest
{
 int balance;
 void Increase()
 {
  lock (this)
  {
   balance++;
  }
 }
}

  由于ASP.NET程序在IIS中可能配置不同的线程模式,所以在ASP.NET程序尽可能不要使用这种方法同步线程,而在普通的应用程序中是可以使用这种方法。


1 2  下一页

发表评论推荐给朋友我想参加相关培训打印我对此感兴趣订阅电子杂志
相关内容焦点新闻
  • 利用ASP.NET 2.0创建自定义Web控件
  • ASP.NET虚拟主机安全漏洞解决方案
  • 使用ASP.NET 2.0中的GridView控件
  • ASP.NET四种页面导航方式的比较与选择
  • ASP.NET创建Web服务之设计方针
  • 中兴携手阿尔卡特 全球逐鹿CDMA
  • 用友总裁王文京:誓将ERP变成“大众消费”
  • 香港消费者委员会:数码相机最贵未必最好
  • 外电称中兴正评估西门子手机业务 或能并购
  • 国信办督战八大行业灾难备份 将出台国家标准
  • 中国IT企业走进欧盟 搭第六框架计划直通车
  • 美邦银行用户注意 警惕新型“钓鱼”邮件
  • 微软三年时间磨出新IE 具有更强大安全性能
  • Advertisement

    天极无线


    奇妙科幻|美好风光|清风车影|漫画卡通|星座生肖|明星写真|动物世界
    老鼠爱大米
    挥着翅膀的女孩
    女人味
    栀子花开
    白月光
    刚刚好
    江南
    快乐崇拜
    亲爱的你怎么不在我身边
    小薇
    2002年的第一场雪
    有多少爱可以重来
    我的地盘
    七里香
    情人
     
    老鼠爱大米 老板电话
    冲动的惩罚 七里香
    我不是黄蓉 女生撒娇
    盛夏的果实 坚持到底
    孤单北半球 眉飞色舞
    挪威的森林 可爱女人
    最浪漫的事 老板电话

    CSEEK搜索