执行动态SQL语句和存储过程是应用程序所需的两种最常见的数据库活动。动态SQL语句是指从客户端应用程序发送到数据库服务器时由数据库服务器读取并执行的SQL语句。在数据库接收这些SQL语句时,首先对它们进行解析以确保语法正确,然后数据库引擎创建一个访问计划——主要确定处理该SQL语句的最佳方法——然后执行该语句。与经常用于执行SQL DML操作(如创建表)或数据访问操作(执行ad hoc查询)的动态SQL语句不同,存储过程通常用于执行预先定义的查询和数据库更新操作。存储过程形成了大多数数据库应用程序的主干。动态SQL语句和存储过程之间的主要区别是,存储过程一般是在执行应用程序之前创建的,并驻留在数据库中。这使得存储过程的性能远远超过了动态SQL语句,因为解析SQL语句和创建数据访问计划的工作早已经被完成。值得注意的是,使用由SqlCommandBuilder类创建的动态SQL语句可以将ADO.NET DataSet中的数据变化传回到数据库中,或者可以使用存储过程将它们写回到数据库。然而,您并不一定要使用DataSet和DataAdapter来更新数据库。在不需要DataSet提供的数据绑定和定位功能的情况下,Command对象可以提供更简单更有效的方法来更新数据库。在接下来的部分,您将会看到如何使用SqlCommand对象来执行ad hoc查询、如何执行SQL DDL语句为目标数据库构建一个表,以及两个使用存储过程的示例。第一个存储过程示例将参数传递到一个存储过程中,第二个示例执行一个提供返回值的存储过程。
表6-3列出了SqlCommand对象和OleDbCommand对象支持的所有不同的SQL命令的执行方法。
表6-3 SqlCommand SQL语句执行方法
方 法 |
说 明 |
ExecuteNonQuery |
该方法用于执行连接数据源上的SQL语句。它用于一些DDL语句、活动查询(如Insert、Update和Delete操作),以及ad hoc查询。该方法返回受影响的行数,但并不输出所返回的参数或结果集 |
ExecuteReader |
该方法用于执行数据源上的SQL Select语句。它返回一个快速只向前的结果集 |
ExecuteScalar |
该方法用于执行一个返回单个标量值的存储过程或SQL语句。它将结果集中的第一列的第一行返回到调用应用程序,并忽略其他所有返回值 |
ExecuteXMLReader |
该方法用于执行返回数据源中某个XML数据流的FOR XML SELECT语句。ExecuteXMLReader命令只与SQL Server 2000及更高版本兼容 |