06 2011 档案
摘要:一、创建一个简单的触发器触发器是一种特殊的存储过程,类似于事件函数,SQL Server™ 允许为 INSERT、UPDATE、DELETE 创建触发器,即当在表中插入、更新、删除记录时,触发一个或一系列 T-SQL语句。触发器可以在查询分析器里创建,也可以在表名上点右键->“所有任务”->“管理触发器”来创建,不过都是要写 T-SQL 语句的,只是在查询分析器里要先确定当前操作的数据库。创建触发器用 CREATE TRIGGERCREATE TRIGGER 触发器名称ON 表名FOR INSERT、UPDATE 或 DELETEAS T-SQL 语句注意:触发器名称是不加引号的。
阅读全文
摘要:空值处理coalesce( expression [ ,...n ] )返回其参数中第一个非空表达式。Select coalesce(null,null,'1','2') //结果为 1coalesce(expression1,...n) 与此 case函数等效:CASE WHEN (expression1 IS NOT NULL) THEN expression1 ... WHEN (expressionN IS NOT NULL) THEN expressionN ELSE NULLEND注意:当第一个表达式为字符串且不能转化为整数时,若在后面的表达式中有整
阅读全文
摘要:类型转换cast ( expression as data_type [ (length ) ])convert ( data_type [ ( length ) ] , expression [ , style ] )如果未指定 length,则默认为 30 个字符。select cast(GetDate() as nvarchar) //结果为:06 17 2011 1:38PMselect convert(nvarchar ,GetDate(),110) //结果为: 06-17-2011style:数据格式的样式,用于将...
阅读全文
摘要:返回当前系统日期和时间Getdate()select Getdate() //结果为:2011-06-17 09:01:00.293返回表示指定日期的“日”、“月”、“年” 部分的正数Day()、Month()、Year()select day('1989-3-2')select day('1989/3/2')select day('3/2/1989') //结果为:2返回给指定日期加上一个时间间隔后的新 datetime 值Dateadd(datepart , number, date)...
阅读全文
摘要:以下所有例子均Studnet表为例:计算字符串长度len()用来计算字符串的长度select sname ,len(sname) from student字符串转换为大、小写lower() 用来将一个字符串转换为小写,upper() 用来将一个字符串转换为大写select lower('I AM A STUDENT !')select upper('i am a student !')截去字符串左、右侧空格 ltrim() 用来将一个字符串左侧的空格去掉 ,rtrim()用来将一个字符串右侧的空格去掉declare @str varchar(100)set @s
阅读全文
摘要:什么是存储过程呢?存储过程就是作为可执行对象存放在数据库中的一个或多个SQL命令。 通俗来讲:存储过程其实就是能完成一定操作的一组SQL语句。那为什么要用存储过程呢?1.存储过程只在创造时进行编译,以后每次执行存储过程都不需再重新编译,而一般SQL语句每执行一次就编译一次,所以使用存储过程可提高数据库执行速度。2.当对数据库进行复杂操作时,可将此复杂操作用存储过程封装起来与数据库提供的事务处理结合一起使用。3.存储过程可以重复使用,可减少数据库开发人员的工作量。4.安全性高,可设定只有某些用户才具有对指定存储过程的使用权那存储过程怎么用呢?以下通过表Student 来了解存储过程,因为是要了解
阅读全文
摘要:众所周知,使用Exec来进行存储过程,其实Exec不但可以执行存储过程,还可以执行sql语句。例如:假设有一张表sc,我们查询它的所有信息,这里使用存储过程,为了说明以上问题。create proc test1_procasdeclare @str varchar(100)beginset @str='select * from sc'exec @strend当我们用 exec test1_proc 执行这个存储过程时,会发生错误提示“找不到存储过程 'select * from sc'。”这是为什么呢?因为系统把 @str所代表的字符串select * fro
阅读全文
摘要:BackgroundWorker 类基本概念注意:此类在 .NET Framework 2.0 版中是新增的。BackgroundWorker 类允许您在单独的专用线程上运行操作。耗时的操作(如下载和数据库事务)在长时间运行时可能会导致用户界面 (UI) 似乎处于停止响应状态。如果您需要能进行响应的用户界面,而且面临与这类操作相关的长时间延迟,则可以使用 BackgroundWorker 类方便地解决问题。使用方法:可以通过编程方式创建 BackgroundWorker,也可以将它从“工具箱”的“组件”选项卡中拖到窗体上。如果在 Windows 窗体设计器中创建 BackgroundWorke
阅读全文
摘要:互斥: 在操作系统中,许多线程常常需要共享资源,而这些资源往往要求一次只能为一个线程服务(排他性),这种排他性地使用共享资源称为线程间的互斥。线程互斥实质上也是同步,可以看做一种特殊的线程同步。Mutex类:线程的互斥常用Mutex类实现,利用它可以对资源进行独占性访问。与Monitor类相似,只有获取Mutex对象的所属权的线程才能进入临界区,未获得Mutex对象所属权的线程只能在临界区外等待。使用Mutex类要比使用Monitor类消耗更多的系统资源,但它可以跨越应用程序边界,在多个应用程序之间进行同步。Mutex类的部分方法:WaitOne():请求互斥体的所属权,只有请求道所属权后线程
阅读全文
摘要:Monitor类提供同步对对象的访问的机制。lock语句就是由编译器解析为使用Monitor类。例如:lock(obj) {.........}解析为Monitor.Enter ()方法,该方法会一直等待,直到线程获得对象的锁定为止。那么如何解除锁定呢?Monitor类提供了Exit()方法解除锁定。 Monitor类具有以下功能: 它根据需要与某个对象相关联。它是未绑定的,也就是说可以直接从任何上下文调用它。不能创建 Monitor 类的实例。Monitor类的方法: Enter,TryEnter:获取对象锁。此操作同样会标记临界区的开头。其他任何线程都不能进入临界区,除非它使用其他锁定对
阅读全文
摘要:什么是lock语句?lock语句是设置锁定和解除锁定的一种简单方式。为什么使用lock语句?在使用多线程的过程中,会出现很多难以发现的问题,比如竞态条件与死锁,为了避免这些同步问题,所以使用lock语句,当然这并不是解决同步问题的唯一方法。lock语句的作用: lock 关键字可确保当一个线程位于代码的临界区时,另一个线程不会进入该临界区。 如果其他线程尝试进入锁定的代码,则它将一直等待(即被阻止),直到该对象被释放。lock语句的用法:lock 关键字将语句块标记为临界区,方法是获取给定对象的互斥锁,执行语句,然后释放该锁。 此语句的形式如下:Object thisLock = new Ob
阅读全文
摘要:死锁多线程中,常见的一种问题除了竞态条件外就是死锁。那什么是死锁呢?死锁就是:是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。那么为什么会产生死锁呢?1.因为系统资源不足。2.进程运行推进的顺序不合适。3.资源分配不当。学过操作系统的朋友都知道:产生死锁的条件有四个:1.互斥条件:所谓互斥就是进程在某一时间内独占资源。2.请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。3.不剥夺条件:进程已获得资源,在末使用完之前,不能强行剥夺。4.循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。死锁演示:为了演
阅读全文
摘要:竞态条件概述:如果两个或两个以上的线程同时访问相同的对象,或者访问不同步的共享状态.就会出现竞态条件。举例:如果多个线程同时访问类StateThread中的方法,最后结果会如何呢?定义一个类StateThread,它包含一个int字段mState和一个方法ChangeIntValue。在ChangeIntValue方法中,验证mState变量是否包含10,如果是,就增其值。在给5增值后mState变量的值应该是11,但是事实并不一定如此。例如,如果一个线程刚好运行到if(mState==10),就被其它线程抢先,调度器去运行另一个线程。 第二个线程进入If体,将mState值增加,即此时mSt
阅读全文