存储过程提供了数据驱动应用程序中的许多优点。利用存储过程,数据库操作可以封装在单个命令中,为获取最佳性能而进行优化并通过附加的安全性得到增强。虽然可以通过以 SQL 语句的形式传递参数自变量之前的存储过程名称来调用存储过程,但如果使用 ADO.NET Command 对象的 Parameters 集合,则可以显式地定义存储过程参数并访问输出参数和返回值。
若要调用存储过程,请将 Command 对象的 CommandType 设置为 StoredProcedure。CommandType 一旦设置为 StoredProcedure,就可以使用 Parameters 集合来定义参数,如以下示例所示。
注意 OdbcCommand 要求您在调用存储过程时提供完整的 ODBC CALL 语法。
SqlClient
[C#] SqlConnection nwindConn = new SqlConnection("Data Source=localhost;Integrated Security=SSPI;Initial Catalog=northwind"); SqlCommand salesCMD = new SqlCommand("SalesByCategory", nwindConn); salesCMD.CommandType = CommandType.StoredProcedure; SqlParameter myParm = salesCMD.Parameters.Add("@CategoryName", SqlDbType.NVarChar, 15); myParm.Value = "Beverages"; nwindConn.Open(); SqlDataReader myReader = salesCMD.ExecuteReader(); Console.WriteLine("{0}, {1}", myReader.GetName(0), myReader.GetName(1)); while (myReader.Read()) { Console.WriteLine("{0}, ${1}", myReader.GetString(0), myReader.GetDecimal(1)); } myReader.Close(); nwindConn.Close();将参数用于 SqlCommand
在将参数用于 SqlCommand 时,添加到 Parameters 集合的参数的名称必须与存储过程中参数标记的名称相匹配。SQL Server .NET Framework 数据提供程序将存储过程中的参数视为命名参数并搜索匹配的参数标记。
SQL Server .NET Framework 数据提供程序不支持在向 SQL 语句或存储过程传递参数时使用问号 (?) 占位符。在这种情况下,必须使用命名参数,如以下示例所示。
SELECT * FROM Customers WHERE CustomerID = @CustomerID将参数用于 OleDbCommand 或 OdbcCommand
将参数用于 OleDbCommand 或 OdbcCommand 时,向 Parameters 集合中添加参数的顺序必须与存储过程中所定义的参数顺序相匹配。OLE DB .NET Framework 数据提供程序和 ODBC .NET Framework 数据提供程序将存储过程中的参数视为占位符,并且将按顺序使用这些参数值。另外,返回值参数必须是添加到 Parameters 集合中的第一批参数。
OLE DB .NET Framework 数据提供程序和 ODBC .NET Framework 数据提供程序不支持用于将参数传递到 SQL 语句或存储过程的命名参数。在此情况下,必须使用问号 (?) 占位符,如以下示例所示。
SELECT * FROM Customers WHERE CustomerID = ?因此,向 Parameters 集合添加 Parameter 对象的顺序必须直接对应于该参数的问号占位符的位置。
导出参数信息
参数也可以使用 CommandBuilder 类从存储过程导出。SqlCommandBuilder 和 OleDbCommandBuilder 类都提供了静态方法 DeriveParameters,该静态方法将自动使用存储过程中的参数信息填充 Command 对象的 Parameters 集合。请注意,DeriveParameters 将改写 Command 的任何现有参数信息。
导出参数信息时需要经历一个到数据源的附加行程,以获取参数信息。如果参数信息在设计时是已知的,则可以通过显式设置参数来提高应用程序的性能。
以下代码示例显示如何使用 CommandBuilder.DeriveParameters 来填充 Command 对象的 Parameters 集合。
[C#] SqlConnection nwindConn = new SqlConnection("Data Source=localhost;Initial Catalog=Northwind;Integrated Security=SSPI;"); SqlCommand salesCMD = new SqlCommand("Sales By Year", nwindConn); salesCMD.CommandType = CommandType.StoredProcedure; nwindConn.Open(); SqlCommandBuilder.DeriveParameters(salesCMD); nwindConn.Close();