转义字符 转义字符的意义
\n   回车换行
\t 横向跳到下一制表位置
\v  竖向跳格
\b 退格
\r  回车
\f  走纸换页
\\ 反斜线符"\"
\'  单引号符
\a  鸣铃
\ddd  1~3位八进制数所代表的字符
\xhh 1~2位十六进制数所代表的字符

在文本框中输出换行为 \r\n

posted @ 2008-09-05 16:31 yixinge 阅读(56) | 评论 (0)编辑
       触发程序trigger)是一种特殊型态的预存程序,当您使用INSERT、UPDATE或DELETE命令来修改资料列时,Microsoft SQL Server会自动执行您所定义的触发程序。

       触发程序(trigger) 是一种特殊的预存程序,执行特定的陈述式(UPDATE、INSERT 或 DELETE)就可以啟动触发程序。触发程序与其他预存程序相同,可以是由简单,亦或是复杂的 T-SQL 陈述式组成;至於与其他预存程序不同的地方,则在於当指定的资料被修改,触发程序即自动执行,无法依名称以手动执行。触发程序执行时,称為触动(fire)。触发程序虽建立在现有的资料库资料表中,但它可以存取其他资料库的资料表和物件。触发程序不能建立在临时的资料表或临时的系统资料表上,只能建立在使用者自订资料表或自订的检视表中。执行触发程序所在的资料表或检视表,称為触发程序资料表(trigger table)。

      触发程序有五种类型:UPDATE、INSERT、DELETE、INSTEAD OF 和 AFTER。有了触发程序,只要您对该表格更新、插入或删除时,就会触动对应的 UPDATE、INSERT 或 DELETE 触发程序。INSTEAD OF 和 AFTER 是 SQL 2000 新增的两项触发程序,Instead of的原义是「取代」,INSTEAD OF触发程序会取代插入、更新和删除操作而执行。AFTER 触发程序会在触发动作之后再触动,可视為控制触发程序啟动时间的机制。

      对资料的更新、插入及删除被视為资料修改事件。您可以设计当一项或多项修改事件產生时,即触动触发程序。例如,当执行 UPDATE 或 INSERT 陈述式时即触动触发程序。这种型的触发程序称為 UPDATE/INSERT 触发程序。您也可以建立任何一项修改事件產生时,执行相对的 UPDATE/INSERT/DELETE 触发程序。

 

语法
  CREATE TRIGGER trigger_name
  ON { table | view }
  [ WITH ENCRYPTION ]
  {
  { { FOR | AFTER | INSTEAD OF } { [ INSERT ] [ , ] [ UPDATE ] }
    [ WITH APPEND ]
    [ NOT FOR REPLICATION ]
    AS
    [ { IF UPDATE ( column )
      [ { AND | OR } UPDATE ( column ) ]
        [ ...n ]
    | IF ( COLUMNS_UPDATED ( ) { bitwise_operator } updated_bitmask )
        { comparison_operator } column_bitmask [ ...n ]
    } ]
    sql_statement [ ...n ]
  }
  }

 

 

参数
  trigger_name
  
  是触发器的名称。触发器名称必须符合标识符规则,并且在数据库中必须唯一。可以选择是否指定触发器所有者名称。
  
  Table | view
  
  是在其上执行触发器的表或视图,有时称为触发器表或触发器视图。可以选择是否指定表或视图的所有者名称。
  
  WITH ENCRYPTION
  
  加密 syscomments 表中包含 CREATE TRIGGER 语句文本的条目。使用 WITH ENCRYPTION 可防止将触发器作为 SQL Server 复制的一部分发布。
  
  AFTER
  
  指定触发器只有在触发 SQL 语句中指定的所有操作都已成功执行后才激发。所有的引用级联操作和约束检查也必须成功完成后,才能执行此触发器。
  
  如果仅指定 FOR 关键字,则 AFTER 是默认设置。
  
  不能在视图上定义 AFTER 触发器。
  
  INSTEAD OF
  
  指定执行触发器而不是执行触发 SQL 语句,从而替代触发语句的操作。
  
  在表或视图上,每个 INSERT、UPDATE 或 DELETE 语句最多可以定义一个 INSTEAD OF 触发器。然而,可以在每个具有 INSTEAD OF 触发器的视图上定义视图。
  
  INSTEAD OF 触发器不能在 WITH CHECK OPTION 的可更新视图上定义。如果向指定了 WITH CHECK OPTION 选项的可更新视图添加 INSTEAD OF 触发器,SQL Server 将产生一个错误。用户必须用 ALTER VIEW 删除该选项后才能定义 INSTEAD OF 触发器。
  
  { [DELETE] [,] [INSERT] [,] [UPDATE] }
  
  是指定在表或视图上执行哪些数据修改语句时将激活触发器的关键字。必须至少指定一个选项。在触发器定义中允许使用以任意顺序组合的这些关键字。如果指定的选项多于一个,需用逗号分隔这些选项。
  
  对于 INSTEAD OF 触发器,不允许在具有 ON DELETE 级联操作引用关系的表上使用 DELETE 选项。同样,也不允许在具有 ON UPDATE 级联操作引用关系的表上使用 UPDATE 选项。
  
  WITH APPEND
  
  指定应该添加现有类型的其它触发器。只有当兼容级别是 65 或更低时,才需要使用该可选子句。如果兼容级别是 70 或更高,则不必使用 WITH APPEND 子句添加现有类型的其它触发器(这是兼容级别设置为 70 或更高的 CREATE TRIGGER 的默认行为)。
  
  WITH APPEND 不能与 INSTEAD OF 触发器一起使用,或者,如果显式声明 AFTER 触发器,也不能使用该子句。只有当出于向后兼容而指定 FOR 时(没有 INSTEAD OF 或 AFTER),才能使用 WITH APPEND。以后的版本将不支持 WITH APPEND 和 FOR(将被解释为 AFTER)。
  
  NOT FOR REPLICATION
  
  表示当复制进程更改触发器所涉及的表时,不应执行该触发器。
  
  AS
  
  是触发器要执行的操作。
  
  sql_statement
  
  是触发器的条件和操作。触发器条件指定其它准则,以确定 DELETE、INSERT 或 UPDATE 语句是否导致执行触发器操作。


  
  当尝试 DELETE、INSERT 或 UPDATE 操作时,Transact-SQL语句中指定的触发器操作将生效。
  
  触发器可以包含任意数量和种类的 Transact-SQL 语句。触发器旨在根据数据修改语句检查或更改数据;它不应将数据返回给用户。触发器中的 Transact-SQL 语句常常包含控制流语言。CREATE TRIGGER 语句中使用几个特殊的表:
  
  deleted 和 inserted 是逻辑(概念)表。这些表在结构上类似于定义触发器的表(也就是在其中尝试用户操作的表);这些表用于保存用户操作可能更改的行的旧值或新值。例如,若要检索 deleted 表中的所有值,请使用:
  SELECT *
  FROM deleted
  
  如果兼容级别等于 70,那么在 DELETE、INSERT 或 UPDATE 触发器中,SQL Server 将不允许引用 inserted 和 deleted 表中的 text、ntext 或 image 列。不能访问 inserted 和 deleted 表中的 text、ntext 和 image 值。若要在 INSERT 或 UPDATE 触发器中检索新值,请将 inserted 表与原始更新表联接。当兼容级别是 65 或更低时,对 inserted 或 deleted 表中允许空值的text、ntext 或 image 列,将返回空值;如果这些列不可为空,则返回零长度字符串。
  当兼容级别是 80 或更高时,SQL Server 允许在表或视图上通过 INSTEAD OF 触发器更新 text、ntext 或 image 列。

  
  是表示触发器中可以包含多条 Transact-SQL 语句的占位符。对于 IF UPDATE (column) 语句,可以通过重复 UPDATE (column) 子句包含多列。
  
  IF UPDATE (column)
  
  测试在指定的列上进行的 INSERT 或 UPDATE 操作,不能用于 DELETE 操作。可以指定多列。因为在 ON 子句中指定了表名,所以在 IF UPDATE 子句中的列名前不要包含表名。若要测试在多个列上进行的 INSERT 或 UPDATE 操作,请在第一个操作后指定单独的 UPDATE(column) 子句。在 INSERT 操作中 IF UPDATE 将返回 TRUE 值,因为这些列插入了显式值或隐性 (NULL) 值。
  
  
  
  说明 IF UPDATE (column) 子句的功能等同于 IF、IF...ELSE 或 WHILE 语句,并且可以使用 BEGIN...END 语句块。有关更多信息,请参见控制流语言。
  
  
  可以在触发器主体中的任意位置使用 UPDATE (column)。
  
  column
  
  是要测试 INSERT 或 UPDATE 操作的列名。该列可以是 SQL Server 支持的任何数据类型。但是,计算列不能用于该环境中。有关更多信息,请参见数据类型。
  
  IF (COLUMNS_UPDATED())
  
  测试是否插入或更新了提及的列,仅用于 INSERT 或 UPDATE 触发器中。COLUMNS_UPDATED 返回 varbinary 位模式,表示插入或更新了表中的哪些列。
  
  COLUMNS_UPDATED 函数以从左到右的顺序返回位,最左边的为最不重要的位。最左边的位表示表中的第一列;向右的下一位表示第二列,依此类推。如果在表上创建的触发器包含 8 列以上,则 COLUMNS_UPDATED 返回多个字节,最左边的为最不重要的字节。在 INSERT 操作中 COLUMNS_UPDATED 将对所有列返回 TRUE 值,因为这些列插入了显式值或隐性 (NULL) 值。
  
  可以在触发器主体中的任意位置使用 COLUMNS_UPDATED。
  
  bitwise_operator
  
  是用于比较运算的位运算符。
  
  updated_bitmask
  
  是整型位掩码,表示实际更新或插入的列。例如,表 t1 包含列 C1、C2、C3、C4 和 C5。假定表 t1 上有 UPDATE 触发器,若要检查列 C2、C3 和 C4 是否都有更新,指定值 14;若要检查是否只有列 C2 有更新,指定值 2。
  
  comparison_operator
  
  是比较运算符。使用等号 (=) 检查 updated_bitmask 中指定的所有列是否都实际进行了更新。使用大于号 (>) 检查 updated_bitmask 中指定的任一列或某些列是否已更新。
  
  column_bitmask
  
  是要检查的列的整型位掩码,用来检查是否已更新或插入了这些列。
  
  注释
  触发器常常用于强制业务规则和数据完整性。SQL Server 通过表创建语句(ALTER TABLE 和 CREATE TABLE)提供声明引用完整性 (DRI);但是 DRI 不提供数据库间的引用完整性。若要强制引用完整性(有关表的主键和外键之间关系的规则),请使用主键和外键约束(ALTER TABLE 和 CREATE TABLE 的 PRIMARY KEY 和 FOREIGN KEY 关键字)。如果触发器表存在约束,则在 INSTEAD OF 触发器执行之后和 AFTER 触发器执行之前检查这些约束。如果违反了约束,则回滚 INSTEAD OF 触发器操作且不执行(激发)AFTER 触发器。
  
  可用 sp_settriggerorder 指定表上第一个和最后一个执行的 AFTER 触发器。在表上只能为每个 INSERT、UPDATE 和 DELETE 操作指定一个第一个执行和一个最后一个执行的 AFTER 触发器。如果同一表上还有其它 AFTER 触发器,则这些触发器将以随机顺序执行。
  
  如果 ALTER TRIGGER 语句更改了第一个或最后一个触发器,则将除去已修改触发器上设置的第一个或最后一个特性,而且必须用 sp_settriggerorder 重置排序值。
  
  只有当触发 SQL 语句(包括所有与更新或删除的对象关联的引用级联操作和约束检查)成功执行后,AFTER 触发器才会执行。AFTER 触发器检查触发语句的运行效果,以及所有由触发语句引起的 UPDATE 和 DELETE 引用级联操作的效果。


  
  触发器限制
  CREATE TRIGGER 必须是批处理中的第一条语句,并且只能应用到一个表中。
  
  触发器只能在当前的数据库中创建,不过触发器可以引用当前数


 

posted @ 2008-08-28 16:06 yixinge 阅读(15) | 评论 (0)编辑

 

一、POST和GET的区别:
Form中的get和post方法,在数据传输过程中分别对应了HTTP协议中的GET和POST方法。二者主要区别如下:
1、Get是用来从服务器上获得数据,而Post是用来向服务器上传递数据
2、Get将表单中数据的按照variable=value的形式,添加到action所指向的URL后面,并且两者使用“?”连接,而各个变量之间使用“&”连接;Post是将表单中的数据放在form的数据体中,按照变量和值相对应的方式,传递到action所指向URL。
3、Get是不安全的,因为在传输过程,数据被放在请求的URL中,而如今现有的很多服务器、代理服务器或者用户代理都会将请求URL记录到日志文件中,然后放在某个地方,这样就可能会有一些隐私的信息被第三方看到。另外,用户也可以在浏览器上直接看到提交的数据,一些系统内部消息将会一同显示在用户面前。Post的所有操作对用户来说都是不可见的。
4、Get传输的数据量小,这主要是因为受URL长度限制;而Post可以传输大量的数据,所以在上传文件只能使用Post(当然还有一个原因,将在后面的提到)。
5、Get限制Form表单的数据集的值必须为ASCII字符;而Post支持整个ISO10646字符集。
6、Get是Form的默认方法。

二、Cookie就是服务器暂存放在你计算机上的一笔资料,好让服务器用来辨认你的计算机。
当你在浏览网站的时候,Web服务器会先送一小段资料放在你的计算机上,Cookie 会帮你把在网页上所输入的文字或是一些选择,都记录下来。当下次你再光临同一个网站,Web服务器会先看看有没有它上次留下的Cookie资料,有的话,就会依据Cookie里的内容来判断使用者,送出特定的网页内容给你。
 
三、 POST和GET是表单提交的两种方式,都是将客户端的表单提交给服务器进行处理。GET方法是把数据参数队列(query string)加到一个URL上,值和表单是一一对应的。比如说firstname=xiaoming&lastname=wang,在队列里表单元素名和对应的值作为一组数据,各组数据之间用一个&符号分开,空格用+号替换,特殊的符号转换成十六进制的代码。用Get方式提交数据时,能在浏览器的地址栏中看到这些数据,这样数据就有可能被记录下来,或更改。通常GET方法还限制字符的大小。因此,不建议用Get方法传输大流量的或重要数据。POST方法可以没有时间限制的传递数据到服务器,用户在浏览器端是看不到这一过程的,所以POST方法比较适合用于发送一个保密的(比如信用卡号)或者比较大量的数据到服务器。
  ASP作为服务器端的脚本,可以通过Request.QueryString来获取GET方式提交上来的数据。在客户端的地址栏中,可以看到这些数据。POST方式提交的数据要通过Request.Form()来获取。如果某个Request集合中的数据需要经常使用,就要将它赋给一个变量,而不是老是用Request.Querystring()或Request.Form()来取值。在ASP中还需要注意的是,POST方式提交多于100K的数据时要特殊照顾。
  另外,如果你能确定,客户端提交上来的数据一定存在,否则不要使用Request集合来获取数据,因为它会依次去Request对象的五个集合(ClientCertificate: 所有客户证书的信息的集合;Cookie的集合;Form集合:填写在HTML的表单中所有的数据的集合;QueryString:查询字符串的所有值的集合;ServerVaribles集合。)中检索数据,其性能可想而知。
posted @ 2008-08-27 10:20 yixinge 阅读(61) | 评论 (0)编辑

ref 关键字使参数按引用传递。其效果是,当控制权传递回调用方法时,在方法中对参数所做的任何更改都将反映在该变量中。若要使用 ref 参数,则方法定义和调用方法都必须显式使用 ref 关键字。例如:

class RefExample
{
    static void Method(ref int i)
    {
        i = 44;
    }
    static void Main()
    {
        int val = 0;
        Method(ref val);
        // val is now 44
    }
}

传递到 ref 参数的参数必须最先初始化。这与 out 不同,out 的参数在传递之前不需要显式初始化。(请参见 out。)

尽管 refout 在运行时的处理方式不同,但它们在编译时的处理方式是相同的。因此,如果一个方法采用 ref 参数,而另一个方法采用 out 参数,则无法重载这两个方法。例如,从编译的角度来看,以下代码中的两个方法是完全相同的,因此将不会编译以下代码:

class CS0663_Example
{
    // compiler error CS0663: "cannot define overloaded
    // methods that differ only on ref and out"
    public void SampleMethod(ref int i) {  }
    public void SampleMethod(out int i) {  }
}

但是,如果一个方法采用 refout 参数,而另一个方法不采用这两类参数,则可以进行重载,如下所示:

class RefOutOverloadExample
{
    public void SampleMethod(int i) {  }
    public void SampleMethod(ref int i) {  }
}
posted @ 2008-05-29 16:23 yixinge 阅读(22) | 评论 (0)编辑

using System;
using System.Collections.Generic;
using System.Text;

namespace ConsoleApplication1
{
   public class Program
    {
        static void Main(string[] args)
        {
            divisor a = new divisor();
            multiple b = new multiple();
            Console.WriteLine("{0}",a.d(4,14));
            Console.WriteLine("{0}", b.m(4,14));
           
        }
    }
   class divisor
    {
        public int d(int m, int n)
        {
            if (m % n == 0) return n;
            else return d(n, m % n);
        }
    }
   class multiple
    {
       public int m(int a,int b)
        {
            int t = 0;
            divisor c = new divisor();
            t=c.d(a,b);
            return (a * b / t);
        }           

    }
}

posted @ 2008-05-12 16:38 yixinge 阅读(289) | 评论 (0)编辑