SQL Server – 使用C# CLR开发用户自定义表值函数

上传人:cn****1 文档编号:513613537 上传时间:2023-03-01 格式:DOCX 页数:15 大小:143.68KB
返回 下载 相关 举报
SQL Server – 使用C# CLR开发用户自定义表值函数_第1页
第1页 / 共15页
SQL Server – 使用C# CLR开发用户自定义表值函数_第2页
第2页 / 共15页
SQL Server – 使用C# CLR开发用户自定义表值函数_第3页
第3页 / 共15页
SQL Server – 使用C# CLR开发用户自定义表值函数_第4页
第4页 / 共15页
SQL Server – 使用C# CLR开发用户自定义表值函数_第5页
第5页 / 共15页
点击查看更多>>
资源描述

《SQL Server – 使用C# CLR开发用户自定义表值函数》由会员分享,可在线阅读,更多相关《SQL Server – 使用C# CLR开发用户自定义表值函数(15页珍藏版)》请在金锄头文库上搜索。

1、SQLServer-使用C#CLR开发用户自定义表值函数MicrosoftSQLServer2005的一项新增功能是其与Microsoft.NETFramework公共语言运行库(CLR)的集成。这使得人们能够将.NETFramework类和函数纳入Transact-SQL语句和查询。CLR集成的机制有多种: CLR用户定义函数(包括表值函数)。 CLR用户定义类型。 CLR存储过程。 CLR触发器。本白皮书说明如何使用CLR表值函数根据包括数据库在内的各种源创建报表数据,从而创建可靠的ReportingServices报表。扩展ReportingServices使用.NETFramework

2、扩展ReportingServices并集成CLR功能的方法有多种,其中包括以下方法: 传递扩展传递报表来响应事件呈现扩展一除ReportingServices支持的之外,还能以其他格式显示报表 安全扩展提供您自己的身份验证和授权机制用于查看和管理报表数据处理扩展一通过开发能够处理来自ReportingServices不支持的数据源的数据 自定义报表项一是自定义的服务器控件,可嵌入报表中,以提供除内置控件以外的其他功能本白皮书阐述如何实现表值函数来处理数据,使之成为使用数据处理扩展的替代方法有关扩展ReportingServices的详细信息,请参阅SQLServer2005联机丛书中的Rep

3、ortingServices扩展。使用表值函数表值函数用于通过编程方式在运行时创建表。它们创建的表可象任何其他数据库表一样用于Transact-SQL查询语句。在SQLServer2000中引入表值函数时,只能使用Transact-SQL创建它们。以下是在Transact-SQL中实现的表值函数的示例。CREATEfunctionEmployeeNames()returnsemployeeNamestable(idint,namenvarchar(20),)asbeginINSERTemployeeNamesvalues(1,Ryan);INSERTemployeeNamesvalues(2,

4、John);INSERTemployeeNamesvalues(3,Bob);returnend然后,就可以从select语句中引用该函数,就象它是表一样:SELECTnamefromEmployeeNames()whereid=1。查询返回以下值:尽管这很有用,但还是受到Transact-SQL语言的限制,因为该语言主要应用于关系数据。如果您尝试离开其适用范围,那么Transact-SQL会变得多少有点不太灵活。在SQLServer2005中,您现在可以使用自己喜欢的.NETFramework语言来创建表值函数,这就可能出现一些令人惊叹的事情。现在,程序员能够将他们所需的任何信息提取到关系数

5、据库表中。例如,以下代码是在MicrosoftVisualC#中实现的SQLServer2005表值函数,它返回根据系统事件日志创建的表:usingSystem;usingSystem.Data.Sql;usingMicrosoft.SqlServer.Server;usingSystem.Collections;usingSystem.Data.SqlTypes;usingSystem.Diagnostics;publicclassTabularEventLogSqlFunction(TableDefinition二logTimedatetime,Message+nvarchar(4000)

6、,Categorynvarchar(4000),Instanceldbigint,Name二ReadEventLog,FillRowMethodName=FillRow)publicstaticIEnumerableInitMethod(Stringlogname)returnnewEventLog(logname,Environment.MachineName).Entries;publicstaticvoidFillRow(Objectobj,outSqlDateTimetimeWritten,outSqlCharsmessage,outSqlCharscategory,outlongin

7、stanceld)EventLogEntryeventLogEntry二(EventLogEntry)obj;timeWritten=newSqlDateTime(eventLogEntry.TimeWritten);message=newSqlChars(eventLogEntry.Message);category=newSqlChars(eventLogEntry.Category);instanceld=eventLogEntry.Instanceld;该表值函数是作为TabularEventLog类的两个静态方法实现的。第一个方法(InitMethod)赋予SqlFunction属性

8、,用于将它指定为该表值函数的入口点。此方法必须返回IEnumerable或IEnumerator对象。该对象包含将用于填充返回表的数据。执行该函数时,SQLServer将循环访问IEnumerator对象中的每个对象,并使用它来填充数据行。为此,它要将该对象传递到该类中的第二个方法FillRow。此方法会将该对象转换成返回表中的某一行。此方法在SqlFunction属性的FillRowMethodName参数中指定。其他元数据在SqlFunction属性的参数中定义。在前一示例中,列名和类型以及返回表的名称都是在此属性中定义的。将此函数部署到某SQLServer实例后,就可以运行以下查询来查看

9、应用程序日志中的最后10项。SELECTTOP10T.logTime,T.Message,T.InstanceIdFROMdbo.ReadEventLog(NApplication)asT结果如图1所示:logTmeMessageInstanceId1j7DD17-D17717-lfinnnjThsdRisnriptinnfn-FvpitIDXVinSniimpht.vrlinn220012-12217:2fl.DDDSuccesfullyloadednesouncelibray.101420012-12217:2fl.DDDServiceconnectionregstrationinform

10、ationwass.1D15420012-12217:2fl.DDDServicelogginghasbeensuccessfullyinitialized.1016520012-412217.20.DDDStiviut:mtsLiiubIichbt:t:iiuuuuhJullyiiiiLidlitiiJ.1D1Bfi70017-01Ssn/iriRsystemvArinhlRShpRnsiir:r:RRFfiilly1例72-)12217:2fl.DDDServicesuccessfLilycreatedpolicyfile.1021g20012-12217:21.TheWindowSecu

11、rityCenterServicehasstarted.&20012-1221721,DDDSuccesfulautousdateretrievalofthirc-partyrao.1073S7290S1D2W&12412217.21.DDDEjui匕iuuuiieiedwlliltiiliLidiziilypuliu;?file.Suiv.1DD4图1.查询结果将表值函数用作数据处理扩展的替代方法ReportingServices数据处理扩展功能可用于通过实现一组ADO.NET接口来对数据源建模。这在概念上类似于如何才能将表值函数用于ReportingServices。表值函数明显优于数据处

12、理扩展。优点:首先,表值函数比数据处理扩展要容易实现的多。只需创建两种方法即可实现表值函数。而数据处理扩展则必须实现许多接口。同样,部署模型也更简单明了。MicrosoftVisualStudio2005可自动将.NETFramework表值函数部署到SQLServer,之后,该函数即立即变得可从ReportingServices中使用。为了部署某数据处理扩展,必须将程序集复制到客户端和报表服务器,并在这两处编辑XML配置文件。表值函数的另一个重要优点在于它可以是与之连接的数据库中某一联接的组成部分。这意味着SQLServer中的关系数据在被放入报表之前,可以与该函数中定义的自定义数据混合在一

13、起并筛选出来。这对于数据处理扩展则是不可能的,因为ReportingServices不支持数据源之间的联接查询。缺点:数据处理扩展较之表值函数要强大和灵活得多。表值函数只能对单个数据库表建模,而数据处理扩展可以对整个数据库的等效项建模。同样,数据处理扩展可以充当完全自定义的数据源,而且它可以有自己的查询语言和连接语法。对于不同类型的数据,使用SQL作为查询语言并非总是理想的选择。例如,ReportingServices包括XML数据的数据处理扩展,它使用类似于Xpath的查询语言。当开发人员希望完全控制数据访问代码路径时,数据扩展很有用。将表值函数与SQLServerReportingServ

14、ices一起使用您必须先完成三件事,然后才能将表值函数用于ReportingServices。首先,必须配置SQLServer,使之允许CLR集成。其次,必须在VisualStudio中开发表值函数。最后,必须将该函数部署到某SQLServer实例中。要让SQLServer允许CLR集成,必须使用SQLServer外围应用配置器工具或运行查询来设置一个标志。配置SQLServer,使之允许CLR集成:1. 单击“开始”按钮,依次指向“所有程序”、MicrosoftSQLServer2005和“配置工具”,然后单击“外围应用配置器”。2. 在SQLServer2005外围应用配置器工具中,单击“

15、功能的外围应用配置器”。3选择您的服务器实例,展开“数据库引擎”选项,然后单击“CLR集成”。4.选择“启用CLR集成”。此外,您可以在SQLServer中运行以下查询(此查询需要ALTERSETTINGS权限):开发表值函数:若要开发表值函数,请在VisualStudio中创建一个新的SQLServer项目。若要创建SQLServer项目,请打开“新建项目”对话框,展开VisualC#,然后选择“数据库”。此时,系统会提示您输入数据库连接信息。有关详细信息,请参阅SQLServer2005联机丛书中的如何:创建SQLServer项目。在您建立了数据库连接后,就可以编写表值函数了在项目中创建一个空白.cs文件,文件名为EventLog.cs,然后将示例函数从前一部分复制并粘贴到该文件中。部署表值函数:若要部署,您必须向SQLServer实例注册该函数和包含它的程序集。这一操作可通过Transact-SQL命令完成。以下脚本会注册tvfEventLogs程序集和ReadEventLog函数:CREATEASSEMBLYtvfEventLogFROMD:ass

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 商业/管理/HR > 商业计划书

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号