Command.Prepare方法能够提高数据源中重复的参数化命令的性能。Prepare指示数据源为多个调用优化特定的命令。为了加大工作上的效率,必须确定下什么是ADO.NET参数调用。
明确地指定大纲和元数据
在ADO.NET参数中当用户没有指定元数据信息时,有很多对象推导这些信息。例如:
DataAdapter.Fill方法,如果不存在的话,它在记录集中建立表和列。 CommandBuilder,它为单个的SELECT语句生成数据适配器命令属性。 CommandBuilder.DeriveParameters,它组合Command对象的Parameters集合。
但是每次使用这些特性时都会造成效率降低。我们推荐主要在设计时和ad-hoc应用程序中使用这些特性。在可能的情况下,ADO.NET参数明确地指定大纲和元数据,包括在数据集中定义表和列,定义数据适配器的Command属性,定义Command的Parameter信息。
ExecuteScalar和ExecuteNonQuery
如果你希望返回单个值,例如Count(*)、 Sum(Price)、或者Avg(Quantity),你可以使用Command.ExecuteScalar。ExecuteScalar返回第一行第一列的值,返回结果集是数量值。ExecuteScalar通过一步完成不仅简化了代码而且提高了性能,而这些工作在使用DataReader时将需要两个处理步骤。
当使用不返回行的SQL语句时,类似修改数据(例如插入、更新或者删除)或者只返回输出参数或值,使用ExecuteNonQuery。ADO.NET参数通过建立一个空DataReader删除了任何必要的处理。 #t#
ADO.NET参数空值的检测
如果数据库的某张表的一个列允许空值,你不能使用某个与空值相等的参数来测试它。作为代替,需要编写一个WHERE子句来检测是否列和参数都是空值。下面的SQL语句返回LastName列与赋予@LastName的值相同的行,或者LastName 列和ADO.NET参数都为空的行:
- SELECT * FROM Customers
- WHERE ((LastName = @LastName) OR (LastName IS NULL AND @LastName IS NULL))