代码改变世界

处理参数

2008-09-11 16:28  晓彦  阅读(1608)  评论(0)    收藏  举报

绝 大多数存储过程接受用于输入存储过程或在输出时设置的值的参数。就像使用 ADO.NET 一样,数据访问应用程序块允许开发人员指定参数所有的属性。这些属性可以包括方向、数据类型和长度。此方法叫做显式参数处理。然而,为了方便,可以仅指定 用于输入参数的值。在这种情况下,应用程序块将查找并提供参数的属性。此方法叫参数发现。

显式参数处理

Database 类包含了不同的用于传递参数到存储过程的方法。此类还包含了用于设置和测试这些参数的值的方法。这些方法如下:

  • AddParameter。此方法传递一个参数(输入或输出)到存储过程。
  • AddInParameter。此方法传递输入参数到一个存储过程。
  • AddOutParameter。此方法添加了一个输出参数到存储过程。
  • GetParameterValue。此方法查找指定的参数的值。
  • SetParameterValue。此方法在使用同样的连接和命令,但有不同的参数值时进行多个插入时设置指定参数的值。


下列代码示范了如何使用 AddInParameterAddOutParameter 指定参数。

C#

Database db = DatabaseFactory.CreateDatabase();

string sqlCommand = "GetProductDetails";

DbCommand dbCommand = db.GetStoredProcCommand(sqlCommand);

 

db.AddInParameter(dbCommand, "ProductID", DbType.Int32, 5);

db.AddOutParameter(dbCommand, "ProductName", DbType.String, 50);

db.AddOutParameter(dbCommand, "UnitPrice", DbType.Currency, 8);

 

Visual Basic

Dim db As Database = DatabaseFactory.CreateDatabase()

Dim sqlCommand As String = "GetProductDetails"

Dim dbCommand As DbCommand = db.GetStoredProcCommand(sqlCommand)

 

db.AddInParameter(dbCommand, "ProductID", DbType.Int32, 5)

db.AddOutParameter(dbCommand, "ProductName", DbType.String, 50)

db.AddOutParameter(dbCommand, "UnitPrice", DbType.Currency, 8)

 

注意:前面的代码不包括专用于数据库类型的参数名称令牌。因此,代码保留了跨多个不同数据库提供程序的通用性。当此代码运行于 SqlClient 数据提供程序时(并因此使用 SqlDatabase 类),下列代码将与前面的代码有着同样的行为。然而,此代码不能移植到其他的数据类型。

 

C#

Database db = DatabaseFactory.CreateDatabase();

string sqlCommand = "GetProductDetails";

DbCommand dbCommand = db.GetStoredProcCommand(sqlCommand);

 

db.AddInParameter(dbCommand, "@ProductID", DbType.Int32, 5);

db.AddOutParameter(dbCommand, "@ProductName", DbType.String, 50);

db.AddOutParameter(dbCommand, "@UnitPrice", DbType.Currency, 8);

 

Visual Basic

Dim sqlCommand As String = "GetProductDetails"

Dim dbCommand As DbCommand = db.GetStoredProcCommand(sqlCommand)

 

db.AddInParameter(dbCommand, "@ProductID", DbType.Int32, 5)

db.AddOutParameter(dbCommand, "@ProductName", DbType.String, 50)

db.AddOutParameter(dbCommand, "@UnitPrice", DbType.Currency, 8)




使用列值做为参数输入

UpdateDataSet
方法要求三个不同的命令:一个用于插入值,一个用于修改值,另一个用于删除值。通常,这些命令用于存储过程而不是 SQL 字符串。它们在调用后保持由存储过程使用的参数。代替指定用于存储过程参数的值,来自 DataSet 的值被用作输入。在这种情况下,AddInParameter 的适当重载是接受源列做为参数的方法之一。

下列代码展示了如何使用列值做为参数输入。

C#

Database db = DatabaseFactory.CreateDatabase();

 

DbCommand insertCommand = db.GetStoredProcCommand("AddProduct");

db.AddInParameter(insertCommand, "ProductName", DbType.String, "ProductName", DataRowVersion.Current);

db.AddInParameter(insertCommand, "CategoryID", DbType.Int32, "CategoryID", DataRowVersion.Current);

db.AddInParameter(insertCommand, "UnitPrice", DbType.Currency, "UnitPrice", DataRowVersion.Current);

 

Visual Basic

Dim db As Database = DatabaseFactory.CreateDatabase()

Dim insertCommand As DbCommand = db.GetStoredProcCommand("AddProduct")

db.AddInParameter(insertCommand, "ProductName", DbType.String, "ProductName", DataRowVersion.Current)

db.AddInParameter(insertCommand, "CategoryID", DbType.Int32, "CategoryID", DataRowVersion.Current)

db.AddInParameter(insertCommand, "UnitPrice", DbType.Currency, "UnitPrice", DataRowVersion.Current)


参数发现

使用数据访问应用程序块,开发人员可以指定用于参数的值,而不需要关于这些参数的任何其他信息。在使用参数发现时,将要指定所有参数,并设置所有输出参数为 NULL

下列代码示范了如何仅通过指定参数值而无其他属性来使用 GetStoredProcCommand

C#

Database db = DatabaseFactory.CreateDatabase();

string sqlCommand = "UpdateProduct";

DbCommand dbCommand = db.GetStoredProcCommand(sqlCommand, 11, "Queso Cabrales", 4, 25);

 

Visual Basic

Dim db As Database = DatabaseFactory.CreateDatabase()

Dim sqlCommand As string = "UpdateProduct"

Dim dbCommand As DbCommand = db.GetStoredProcCommand(sqlCommand, 11, "Queso Cabrales", 4, 25)


关于每个参数的信息(例如,它的数据类型)依赖是底层 ADO.NET 方法调用所需要的。为了提供这些信息,数据访问应用程序块使用 ADO.NET 中的 DeriveParameters 方法来查找参数信息。

因为 DeriveParameters 调用需要到后端数据库的一次往返,应用程序块还提供了参数信息缓存。在第一次调用需要参数发现的特定存储过程后,关于每个参数的信息都保存到了参数缓存中。这意味着对同样的存储过程的后继调用将不需要往返。

在使用参数发现时,最好的方法是指定所有的输出参数为 NULL 。不需要为 Oracle 存储过程提供游标参数,OracleDatabase 提供了它们。此对象假设游标参数是存储过程参数列表中的第一个参数。