使用命令
ado.net提供了几种命令执行的不同方法以及优化命令执行的不同选项。下面包括一些技巧,它们是关于选择最佳命令执行以及如何提高执行命令的性能。
使用oledbcommand的最佳实践
不同.net框架数据提供程序之间的命令执行被尽可能标准化了。但是,数据提供程序之间仍然存在差异。下面给出一些技巧,可微调用于ole db的.net框架数据提供程序的命令执行。
1) 按照odbc call语法使用commandtype.text调用存储过程。使用commandtype.storedprocedure只是秘密地生成odbc call语法。
2) 一定要设置oledbparameter的类型、大小(如果适用)、以及精度和范围(如果参数类型是numeric或decimal)。注意,如果不显式提供参数信息,oledbcommand会为每个执行命令重新创建ole db参数访问器。
使用sqlcommand的最佳实践
使用sqlcommand执行存储过程的快速提示:如果调用存储过程,将sqlcommand的commandtype属性指定为storedprocedure的commandtype。这样通过将该命令显式标识为存储过程,就不需要在执行之前分析命令。
使用prepare方法
对于重复作用于数据源的参数化命令,command.prepare方法能提高性能。prepare指示数据源为多次调用优化指定的命令。要想有效利用prepare,需要彻底理解数据源是如何响应prepare调用的。对于一些数据源(例如sql server 2000),命令是隐式优化的,不必调用prepare。对于其他(例如sql server 7.0)数据源,prepare会比较有效。
显式指定架构和元数据
只要用户没有指定元数据信息,ado.net的许多对象就会推断元数据信息。下面是一些示例:
1) dataadapter.fill方法,如果dataset中没有表和列,dataadapter.fill方法会在dataset中创建表和列。
2) commandbuilder,它会为单表select命令生成dataadapter命令属性。
3) commandbuilder.deriveparameters,它会填充command对象的parameters集合。
但是,每次用到这些特性,都会有性能损失。建议将这些特性主要用于设计时和即席应用程序中。在可能的情况下,显式指定架构和元数据。其中包括在dataset中定义表和列、定义dataadapter的command属性、以及为command定义parameter信息。
executescalar和executenonquery
如果想返回像count(*)、sum(price)或avg(quantity)的结果那样的单值,可以使用command.executescalar。executescalar返回第一行第一列的值,将结果集作为标量值返回。因为单独一步就能完成,所以executescalar不仅简化了代码,还提高了性能;要是使用datareader就需要两步才能完成(即,executereader+取值)。
使用不返回行的sql语句时,例如修改数据(例如insert、update或delete)或仅返回输出参数或返回值,请使用executenonquery。这避免了用于创建空datareader的任何不必要处理。
测试null
如果表(在数据库中)中的列允许为空,就不能测试参数值是否“等于”空。相反,需要写一个where子句,测试列和参数是否都为空。下面的sql语句返回一些行,它们的lastname列等于赋给@lastname参数的值,或者lastname列和@lastname参数都为空。
select * from customers
where ((lastname = @lastname) or (lastname is null and @lastname is null))
将null作为参数值传递
对数据库的命令中,当将空值作为参数值发送时,不能使用null(visual basic .net中为nothing)。而需要使用dbnull.value。例如:
'visual basic
dim param as sqlparameter = new sqlparameter("@name", sqldbtype.nvarchar, 20)
param.value = dbnull.value
//c#
sqlparameter param = new sqlparameter("@name", sqldbtype.nvarchar, 20);
param.value = dbnull.value;
执行事务
ado.net的事务模型已经更改。在ado中,当调用starttransaction时,调用之后的任何更新操作都被视为是事务的一部分。但是,在ado.net中,当调用connection .begintransaction时,会返回一个transaction对象,需要将它与command的transaction属性联系起来。这种设计可以在一个单一连接上执行多个根事务。如果未将command.transaction属性设置为一个针对相关的connection而启动的transaction,那么command就会失败并引发异常。
即将发布的.net框架将使您可以在现有的分布式事务中手动登记。这对于对象池方案来说很理想;在该方案中,一个池对象打开一次连接,但是在多个独立的事务中都涉及到该对象。.net框架1.0发行版中这一功能并不可用。
Java Asp PHP .Net XML C/C++ CGI VB Jsp J2ee J2se J2me EJB Servlet Tomcat Resin Struts Weblogic Eclipse ANT GUI JMS Web servise IDEA Webphere Hibernate Spring Jboss Applet Swing Socket Javamail Perl Ajax P2P 安全 模式 框架 测试 开源 游戏
Windows XP Windows 2000 Windows 2003 Windows Me Windows 9.x Linux UNIX 注册表 操作系统 服务器 应用服务器