技术开发 频道

SQL Server 2005上的CLR和ADO.NET 2.0

 

【IT168 技术文档】

    开发基于CLR的数据库对象


    通过CLR的集成,可以在SQL Server 2005中建立如下的一些数据类型:

 Scalar-valued user-defined functions (scalar UDFs)
 Table-valued user-defined functions (TVFs)
 User-defined procedures (UDPs)
 User-defined triggers

    上述四个类型算是基本的数据类型,因为它可以直接地映射到类的公共静态方法,除此之外还可以定义更为复杂的用户聚合函数。由于受到访问能力的限制,在SQL Server 2000中用户自定义函数能访问的对象有限,但是SQL Server 2005借助.NET平台甚至于可以把一些计算通过协调远端的Web Service一并完成。

    笔者认为,在SQL Server 2005平台上,开发人员的思维要具有扩展性,不仅要考虑SQL Server 本身支持的内容,还要考虑到Windows平台支持的内容、企业内部SOA其他应用的支持,直至整个Internet环境下的任何可以用资源。

图3:CLR支持后扩展数据对象的资源分布

    相对而言,开发User-Function和User-Defined Procedure都是比较容易,这里笔者就开发CLR 触发器作些说明。正如大家所知,Trigger主要包括两类:“DML 触发器”和“DDL 触发器”。DML触发器主要在DELETE、UPDATE、INSERT的时候触发,DDL 触发器则会在CREATE、ALTER、DROP的时候触发。在使用T-SQL编写触发器的时候可以通过INSERTED和DELETED这两个虚表,结合COLUMN_UPDATED()函数完成DML事件的响应。在集成了CLR之后,用.NET语言写触发器可以访问如下内容:

 继续访问DELETED和INSERTED这两个虚表;
 通过UPDATE操作,判断哪些列受到了修改;
 通过访问数据库对象获得DDL的执行语句;

    除此而外,开发CLR 触发器的时候还可以通过SqlContext.TriggerContext获得当前操作的上下文,明确究竟是DML的INSERT、UPDATE、DELETE,还是DDL的CREATE、DROP、ALTER操作。

    代码示例1:INSERT或DELETE操作的DML触发器写法

SqlConnection connection = new SqlConnection ("context connection = true"); connection.Open(); SqlCommand command = connection.CreateCommand(); command.CommandText = "SELECT * from " + "inserted";

    代码实例2:判断哪些列被UPDATE

reader = command.ExecuteReader(); reader.Read(); for (int columnNumber = 0; columnNumber < triggContext.ColumnCount; columnNumber++) { pipe.Send("Updated column " + reader.GetName(columnNumber) + "? " + triggContext.IsUpdatedColumn(columnNumber).ToString()); } reader.Close();


0
相关文章