在ASP.NET 2.0中操作数据之七十三:用Managed Code创建
微软SQL Server 2005数据库管理系统通过整合Common Language Runtime (CLR)技术,为开发者提供了更为灵活和强大的数据库对象创建方式。本文将详细介绍如何利用托管代码(managed code)创建存储过程,并这一技术在数据库应用中的潜力和优势。
一、引言
二、托管代码与数据库对象的优势
在SQL Server 2005之前,存储过程和UDFs主要使用T-SQL创建。通过CLR集成,我们可以使用托管代码(如C)来创建这些数据库对象。这样做的好处主要有以下几点:
1. 使用更丰富的语言特性:托管代码(如C)提供了比T-SQL更丰富的编程语言和工具集,使得开发者能够更高效地编写和维护代码。
2. 更好的代码复用:你可以将现有的托管代码逻辑直接用于数据库对象,无需重新编写。
3. 更好的性能:对于一些复杂的逻辑处理,托管代码可能具有更高的性能。
三、创建存储过程和UDFs的步骤
在本教程中,我们将以Northwind数据库为例,演示如何创建存储过程和UDFs。我们需要将Northwind数据库从App_Data文件夹中移出,并注册为一个SQL Server 2005 Express版本数据库的实例。然后,我们可以使用SQL Server Management Studio来管理我们的数据库。
接下来,我们将使用托管代码创建一个存储过程。这个过程可能涉及以下几个步骤:
1. 设计存储过程的逻辑和输入/输出参数。
2. 使用C(或其他托管代码语言)编写存储过程的逻辑。
3. 将编写的代码部署到SQL Server 2005数据库。
4. 在数据库中调用和使用这个存储过程。
通过整合CLR技术,SQL Server 2005为开发者提供了更为灵活和强大的数据库对象创建方式。使用托管代码创建存储过程和UDFs,不仅可以提高开发效率和代码质量,还可以提高数据库应用的性能和可扩展性。也需要注意托管代码可能带来的性能开销和安全性问题。在实际应用中,开发者需要根据具体需求和场景来选择合适的开发方式。
连接数据库实例
一、数据库实例信息
在成功连接后,Object Explorer窗口将展示SQL Server 2005 Express版本数据库实例的详细信息,如数据库、安全信息、管理选项等。这一界面为我们提供了丰富的数据资源和管理工具。
二、连接Northwind数据库
我们需要将DataFiles文件夹里的Northwind数据库作为SQL Server 2005 Express版本的数据库实例。在Databases文件夹内,右键单击选择“Attach”选项,这将打开Attach Databases对话框。点击Add按钮,定位到NORTHWND.MDF文件,然后点击OK。你的界面将如图2所示。
注意:在通过Management Studio连接SQL Server 2005 Express版本数据库实例时,Attach Databases对话框不允许访问用户私人文件目录,如My Documents。请确保将NORTHWND.MDF和NORTHWND_log.LDF文件放置在非用户私人文件目录内。
完成上述操作后,Object Explorer将列出新添加的数据库。你可能会遇到一个命名问题,数据库的名称可能包含一长串字符和数字。为了方便识别和管理,我们可以将其重命名为“Northwind”。只需在该数据库上右键单击,选择“Rename”即可。
三、在Visual Studio中创建新的解决方案和SQL Server Project
为了管理SQL Server 2005中的存储过程或用户定义函数,我们需要在C代码中编写这些程序。完成编写后,我们需要将该代码编译为.dll文件,并将其注册到SQL Server数据库。接下来,我们可以在数据库中创建指向编译文件中对应方法的存储过程或用户定义函数。这些步骤需要手动完成。幸运的是,Visual Studio的专业版和Team Systems版本提供了一个SQL Server Project类型,它可以自动完成这些任务。我们将使用SQL Server Project类型来创建一个管理存储过程和用户定义函数。
注意:如果你使用的是Visual Studio的Visual Web Developer或Standard版本,那么你需要手动完成这些步骤。不过别担心,我们将在Step 13中详细介绍手动完成的细节。我们建议你按照顺序阅读Steps 2到Steps 12,然后再阅读Step 13,因为Steps 2到Steps 12包含了重要的SQL Server配置说明,无论使用哪个版本都适用。
四、在Visual Studio中创建SQL Server Project
接下来,我们打开Visual Studio,从File菜单中选择New Project,打开New Project对话框(如图4所示)。在对话框中,我们选择Database工程类型,然后在Templates列表中选择创建一个新的SQL Server Project。我将其命名为ManagedDatabaseConstructs并将其放置在一个名为Tutorial75的解决方案中。
如图5所示,我们在New Database Reference对话框中成功指向了Northwind数据库,这是我们第一步注册的SQL Server 2005 Express版本数据库实例。这幅图展示了我们如何将SQL Server Project与Northwind数据库紧密连接起来。
为了调试我们即将在此项目中创建的管理存储过程和用户自定义函数,我们需要激活SQL/CLR调试支持。每当我们将一个SQL Server Project与新的数据库相连时(如图5所示),Visual Studio会询问我们是否要激活SQL/CLR调试,如图6所示,我们应当选择“是”。
此刻,这个新的SQL Server Project已经添加到我们的解决方案中。它包含一个Test Scripts文件夹,里面有一个名为Test.sql的文件。这个文件用于调试本工程中添加的管理数据库对象,我们会在第12步详细了解如何进行调试。
接下来,我们需要将现有的web应用程序添加到解决方案中。我们通过选择File菜单中的Add项,然后选择Existing Web Site,并浏览到相应的文件夹后,点击OK。如图7所示,这将更新我们的解决方案,使其包含两个工程:一个是website,另一个是我们之前提到的名为ManagedDatabaseConstructs的SQL Server Project。
我们需要更新Web.config文件中的NORTHWNDConnectionString值。由于我们已经将Northwind数据库从App_Data文件夹移出,并注册为SQL Server 2005 Express版本数据库实例,我们需要相应地更新NORTHWNDConnectionString值。打开Web.config文件,将NORTHWNDConnectionString值更改为类似这样:“Data Source=localhost/SQLExpress;Initial Catalog=Northwind;Integrated Security=True”。
完成的Web.config文件的
需要注意的是,正如上一章所讨论的,当我们从一个客户端程序——例如一个ASP.NET网站——调试一个SQL Server对象时,我们需要关闭连接池。在上面的连接字符串中,我们关闭了连接池(“Pooling=false”)。如果你不打算从ASP.NET网站调试管理存储过程和用户自定义函数,可以开启连接池。
从资源管理器中,右键单击你的“ManagedDatabaseConstructs”工程,选择“添加新项”。这将打开一个名为“添加新项”的对话框,其中列出了可以添加到该工程的多种管理数据库对象的类型,如图8所示。这些对象包括存储过程、用户定义的函数等。现在,我们来创建一个简单的存储过程,用于返回所有标记为“discontinued”状态的产品。我们将这个存储过程文件命名为“GetDiscontinuedProducts.cs”。
(如图8所示,我们添加了一个新的存储过程,名为GetDiscontinuedProducts.cs)
这将会生成一个新的C类文件。文件的开头部分会包含一些必要的命名空间引用和使用的库。在这个文件中,我们将定义一个名为“StoredProcedures”的部分类。在这个部分类中,我们创建一个名为“GetDiscontinuedProducts”的静态方法,该方法具有一个SqlProcedure特性,表明它是一个存储过程。
这个存储过程作为一个静态方法被执行,位于名为StoredProcedures的部分类文件中。GetDiscontinuedProducts方法通过执行一个SQL查询,返回所有在Products表中标记为discontinued的产品信息。为了完成这个任务,我们需要在存储过程中创建一个SqlCommand对象,设置其CommandText为一个SELECT查询语句。然后,我们执行这个命令并返回结果给客户端程序。
让我们在GetDiscontinuedProducts方法中添加以下代码:
```csharp
// 创建命令对象
SqlCommand myCommand = new SqlCommand();
myCommandmandText =
@"选择所有Discontinued列为1的产品的信息。具体字段包括ProductID, ProductName, SupplierID, CategoryID, QuantityPerUnit, UnitPrice, UnitsInStock, UnitsOnOrder, ReorderLevel和Discontinued";
// 执行命令并发送结果
SqlContext.Pipe.ExecuteAndSend(myCommand);
```
所有的管理数据库对象都可以通过SqlContext对象与“调用者”进行交互。SqlContext通过其Pipe属性提供了一个SqlPipe对象,该对象用于在SQL Server数据库和调用程序之间传递信息。ExecuteAndSend方法执行传入的SqlCommand对象并将结果返回给客户端程序。值得注意的是,管理数据库对象最适合用于创建存储过程和用户定义函数,这些函数使用过程逻辑(procedural logic)而不是集合逻辑(set-based logic)。我们的GetDiscontinuedProducts方法虽然是一个很好的示例,但最理想的情况是将它作为一个T-SQL存储过程来执行。将其作为管理存储过程执行是为了展示创建和配置管理存储过程所需的步骤。
步骤4:配置Managed Stored Procedure
在编码完成后,我们需要将存储过程配置到Northwind数据库中。“Deploy”选项的具体步骤将在第13步中详细介绍。通过这个过程,我们可以确保我们的存储过程被正确地部署到数据库服务器上,并可以被应用程序或其他数据库对象使用。通过这种方式,我们可以充分利用管理数据库对象的优势,提高数据库应用的效率和性能。进入资源管理器后,在ManagedDatabaseConstructs工程上执行右键操作,选择“Deploy”选项部署项目时,可能会遇到错误提示:“语法不正确,接近 'EXTERNAL'。您可能需要将当前数据库的兼容性级别设置为一个更高的值以启用此功能。”这时,我们需要了解并操作数据库的兼容性级别。
当尝试将一个编译文件注册到Northwind数据库时,必须确保该数据库的兼容性级别为90。默认状态下,新的SQL Server 2005数据库的兼容性级别就是90。Northwind数据库最初是为Microsoft SQL Server 2000设计的,其默认兼容性级别为80。为了注册编译文件,我们需要将Northwind数据库的兼容性级别更新至90。
如何更新数据库的兼容性级别呢?在Management Studio中,打开一个新的查询窗口,运行以下命令:exec sp_dbcmptlevel 'Northwind', 90。点击工具栏上的执行图标以运行查询,更新数据库的兼容性级别。如图9所示,按照步骤操作,更新Northwind数据库的兼容性级别。
完成数据库兼容性级别的更新后,重新部署SQL Server Project。返回SQL Server Management Studio,在Object Explorer中找到Northwind数据库,右键单击选择“刷新”。接下来,找到Programmability文件夹并展开Assemblies文件夹。如图10所示,Northwind数据库现在已成功注册了由ManagedDatabaseConstructs工程生成的编译文件。
在Stored Procedures文件夹中,你会看到名为GetDiscontinuedProducts的存储过程。这个存储过程是在部署时创建的,它指向ManagedDatabaseConstructs编译文件中的GetDiscontinuedProducts方法。当执行GetDiscontinuedProducts存储过程时,它会调用相应的方法。由于这是一个管理存储过程(managed stored procedure),通过Management Studio无法对其进行编辑(存储过程名旁有一个锁的图标)。
还有一个问题需要解决:该数据库被配置为阻止执行托管代码。为了测试这一点,尝试在查询窗口中执行GetDiscontinuedProducts存储过程。你会收到错误信息:“在.NET框架中执行用户代码被禁用。请启用‘clr enabled'配置选项。”
图12显示,“clr enabled”当前设置为0。这一配置是数据库运行托管代码的重要前提,因此需要我们进行相应的调整。
在数据库配置中,每一个条目(如图12所示)都包含四个值:“minimum”、“maximum”、“config”和“run”。若要更新“clr enabled”的“config”值,需执行特定命令。通过输入“exec sp_configure 'clr enabled', 1”来设置其值。
完成上述设置后,再次运行“exec sp_configure”命令,你会发现“clr enabled”的“config”值已成功更改为1,然而“run”值仍然为0。这时,需要执行“RECONFIGURE”命令,以将“run”值更新为当前的“config”值。在查询窗口输入该命令并执行。随后,再次运行“exec sp_configure”,此时“clr enabled”的“config”和“run”值都应显示为1,表明设置已生效。
紧接着,我们可以调用GetDiscontinuedProducts存储过程。在查询窗口输入并执行命令“exec GetDiscontinuedProducts”。此存储过程会执行相应的托管代码,发出一个SELECT查询,返回所有已停产的产品的信息。这些数据将被返回给调用程序——在本例中,即是SQL Server Management Studio。Management Studio会在结果窗口中展示这些数据。
进入第五步,我们介绍如何创建接收输入参数的托管存储过程。在教程中创建的许多查询和存储过程都使用了参数。例如,在之前的章节中,我们创建了一个名为GetProductsByCategoryID的存储过程,它接收一个输入参数@CategoryID。此存储过程会返回与@CategoryID匹配的产品信息。
要创建接收输入参数的托管存储过程,只需在定义方法时指定这些参数即可。以ManagedDatabaseConstructs工程中的GetProductsWithPriceLessThan存储过程为例,它接收一个表示价格参数,并返回所有单位价格低于该参数值的产品信息。
我们来添加这个过程。右键点击ManagedDatabaseConstructs工程名,选择“添加新存储过程”,并命名文件为GetProductsWithPriceLessThan.cs。这将创建一个新的C类文件。
更新GetProductsWithPriceLessThan方法,使其接收一个名为price的SqlMoney类型的输入参数。方法的代码大致如下:
[Microsoft.SqlServer.Server.SqlProcedure]
public static void GetProductsWithPriceLessThan(SqlMoney price)
{
// 创建命令
SqlCommand myCommand = new SqlCommand();
myCommandmandText = SELECT语句,包含参数@MaxPrice;
myCommand.Parameters.AddWithValue("@MaxPrice", price);
// 执行命令并发送结果
SqlContext.Pipe.ExecuteAndSend(myCommand);
}
这个GetProductsWithPriceLessThan方法的代码与我们之前创建的GetDiscontinuedProducts方法有些相似。主要的不同之处在于GetProductsWithPriceLessThan方法接收一个输入参数(price),并且SqlCommand的查询语句中也包含了一个参数(@MaxPrice)。
完成代码添加后,重新部署SQL Server项目。然后,返回SQL Server Management Studio并刷新Stored Procedures文件夹。你会看到一个新的查询——GetProductsWithPriceLessThan。从查询窗口输入并执行命令“exec GetProductsWithPriceLessThan 25”,将显示所有价格低于25的产品信息(如图14所示)。
我们可以从数据访问层调用这些托管存储过程。在ManagedDatabaseConstructs工程中,我们已经添加了GetDiscontinuedProducts和GetProductsWithPriceLessThan这两个托管存储过程,并将它们注册到Northwind SQL Server数据库。同样,我们也可以通过SQL Server Management Studio来调用它们(如图13和14所示)。这样,我们就完成了从数据访问层调用托管存储过程的过程。为了在我们的ASP.NET应用程序中整合使用那些已管理的存储过程,我们必须将它们添加到数据访问层和业务逻辑层中。现在,我们正在进行一项重要的任务,即在NorthwindWithSprocs类型化数据集中的ProductsTableAdapter添加两个全新方法。在第七步,我们将把这些方法添加到业务逻辑层。
在Visual Studio的集成开发环境中,我们打开了NorthwindWithSprocs类型化数据集,并向其中的ProductsTableAdapter添加了一个名为GetDiscontinuedProducts的方法。这个方法将被用于获取已停止生产的产品信息。
由于我们将Northwind数据库从App_Data文件夹移出,因此需要在Web.config文件中更新相应的连接字符串。在早前的步骤中,我们已经了如何更新Web.config文件中的NORTHWNDConnectionString值。如果您忘记了这一步,那么在尝试向TableAdapter添加新方法时,将会遇到错误提示:“无法添加查询。无法为‘Web.config’中的对象找到连接‘NORTHWNDConnectionString'”。为了解决这个问题,您需要回到Web.config文件并更新NORTHWNDConnectionString的值。完成更新后,您可以再次尝试向TableAdapter添加新方法,这次应该不会出现问题。
在添加新方法的过程中,TableAdapter查询配置向导会询问我们如何访问数据库。由于我们已经创建并注册了GetDiscontinuedProducts存储过程,因此在这里我们应该选择“使用现有存储过程”选项。选择这个选项后,点击“下一步”。
存储过程:GetDiscontinuedProducts与GetProductsWithPriceLessThan
让我们深入数据访问层的两个重要存储过程:GetDiscontinuedProducts和GetProductsWithPriceLessThan。在左侧的导航栏里,你可能会在下拉列表中看到这些存储过程,分别选择它们进行深入。
当我们在图16中选择GetDiscontinuedProducts存储过程时,这个强大的工具将返回一系列记录行。为了处理这些数据,我们选择第一项“Tabular data”,然后点击Next进入下一步操作。如图17所示,这个过程非常直观明了。
接下来,向导要求我们为方法命名。我们选中两个选项并分别命名为FillByDiscontinued和GetDiscontinuedProducts。通过这种方式,我们可以轻松地为数据访问层添加新的方法,并快速完成向导流程,如图18所示。
同样的方法也适用于另一个重要的存储过程GetProductsWithPriceLessThan。在ProductsTableAdapter中,我们添加了FillByPriceLessThan和GetProductsWithPriceLessThan这两个方法。通过这些操作,我们可以更加高效地管理和使用数据。图19展示了为这两个存储过程添加相应方法后的界面。此时的ProductsTableAdapter已经包含了新添加的方法。
完成数据访问层的更新后,我们还需要向业务逻辑层添加相应的方法。为此,我们向ProductsBLLWithSprocs类添加了以下两种方法:
```csharp
[SystemponentModel.DataObjectMethodAttribute(SystemponentModel.DataObjectMethodType.Select, false)]
public NorthwindWithSprocs.ProductsDataTable GetDiscontinuedProducts()
{
return Adapter.GetDiscontinuedProducts();
}
[SystemponentModel.DataObjectMethodAttribute(SystemponentModel.DataObjectMethodType.Select, false)]
public NorthwindWithSprocs.ProductsDataTable GetProductsWithPriceLessThan(decimal priceLessThan)
{
return Adapter.GetProductsWithPriceLessThan(priceLessThan);
}
```这两种方法简单地调用数据访问层中的对应方法,并返回ProductsDataTable实例。这些方法上的DataObjectMethodAttribute标记使得这些方法能够被ObjectDataSource控件的配置数据源向导识别并添加到SELECT标签的下拉列表项中。通过这一步骤,我们完成了业务逻辑层的更新。至此,整个流程已经完成了大半部分。祝编程愉快!接下来让我们了解一下本文的作者。本文作者Scott Mitchell是ASP和ASP.NET领域的专家,拥有六本关于ASP/ASP.NET方面的著作。作为创始人之一,自创立以来一直专注于微软Web技术的研发和应用。他撰写的系列教程涵盖了丰富的内容,对ASP.NET的学习者有很大的帮助。如果您想了解更多关于ASP.NET的知识和技巧,不妨查阅Scott Mitchell的教程系列。希望这些教程能为您的学习之路提供有力的支持!以上内容全部来自作者本人的描述和教程分享,如有出入或遗漏请以官方资料为准。谢谢阅读!
长沙网站设计
- 在ASP.NET 2.0中操作数据之七十三:用Managed Code创建
- 精华液排名前十名推荐
- 浅谈JS中this在各个场景下的指向
- 五环的象征意义是什么 奥运与五环的紧密联系
- 教子恩返acg
- 使用vue框架 Ajax获取数据列表并用BootStrap显示出来
- Javascript中的方法和匿名方法实例详解
- jQuery UI 实例讲解 - 日期选择器(Datepicker)
- PHP和.net中des加解密的实现方法
- Jebrains付费插件Activation code[持续更新]
- 祝福新年快乐的祝福语
- vue-test-utils初使用详解
- MySql 8.0.11-Winxp64(免安装版)配置教程
- vue 数组和对象渲染问题
- 微信小程序 location API接口详解及实例代码
- 地铁跑酷有终点吗