处理参数
2008-09-11 16:28 晓彦 阅读(1608) 评论(0) 收藏 举报绝 大多数存储过程接受用于输入存储过程或在输出时设置的值的参数。就像使用 ADO.NET 一样,数据访问应用程序块允许开发人员指定参数所有的属性。这些属性可以包括方向、数据类型和长度。此方法叫做显式参数处理。然而,为了方便,可以仅指定 用于输入参数的值。在这种情况下,应用程序块将查找并提供参数的属性。此方法叫参数发现。
显式参数处理
Database 类包含了不同的用于传递参数到存储过程的方法。此类还包含了用于设置和测试这些参数的值的方法。这些方法如下:
- AddParameter。此方法传递一个参数(输入或输出)到存储过程。
- AddInParameter。此方法传递输入参数到一个存储过程。
- AddOutParameter。此方法添加了一个输出参数到存储过程。
- GetParameterValue。此方法查找指定的参数的值。
- SetParameterValue。此方法在使用同样的连接和命令,但有不同的参数值时进行多个插入时设置指定参数的值。
下列代码示范了如何使用 AddInParameter 和 AddOutParameter 指定参数。
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 提供了它们。此对象假设游标参数是存储过程参数列表中的第一个参数。
浙公网安备 33010602011771号