——此文章摘自《C#高级编程(第
版)》定价
元 特价
元 购买
调用返回输出参数的存储过程
前面两个执行存储过程的示例都没有返回值如果存储过程包含输出参数则它们就需要在NET客户程序中定义以便在过程返回时填充其输出参数下面的示例说明了如何在数据库中插入记录把该记录的主键码返回给调用者
记录的插入Region表仅由一个主键码(RegionID)和描述字段(RegionDescription)组成要插入一个记录需要生成该数字主键码再把新行插入到数据库中在这个示例中通过在存储过程中创建一个主键码简化了主键码的生成使用的方法未经过任何加工这就是本章的后面用一节的篇幅介绍键的生成的原因下面使用这个示例就足够了
CREATE PROCEDURE RegionInsert(@RegionDescription NCHAR()@RegionID INTEGER OUTPUT)AS
SET NOCOUNT OFF
SELECT @RegionID = MAX(RegionID)+
FROM Region
INSERT INTO Region(RegionID RegionDescription)
VALUES(@RegionID @RegionDescription)
GO
插入过程创建一个新Region记录在数据库本身生成主键码值时这个值作为输出参数从过程返回(@RegionID)这对于这个简单示例来说就足够了但对于比较复杂的表(特别是有默认值的表)通常不使用输出参数而选择整个插入的行把该行返回给调用者NET类可以处理这两种情况
SqlCommand aCommand = new SqlCommand(RegionInsert conn);
aCommandCommandType = CommandTypeStoredProcedure;
aCommandParametersAdd(new SqlParameter(@RegionDescription SqlDbTypeNChar RegionDescription));
aCommandParametersAdd(new SqlParameter(@RegionID SqlDbTypeInt ParameterDirectionOutput false RegionID DataRowVersionDefault null));
aCommandUpdatedRowSource = UpdateRowSourceOutputParameters;
其中参数的定义比较复杂第二个参数@RegionID定义为包含其参数定向在这个示例中是Output除这个标志之外该示例还在最后一行使用UpdateRowSource枚举表示通过输出参数从这个存储过程返回的数据当从一个DataTable(详见本章后面的内容)中执行存储过程调用时主要使用这个标志
调用这个存储过程类似于前面的示例但在这个实例中需要在执行完过程后读取输出参数
aCommandParameters[@RegionDescription]Value = South West;
aCommandExecuteNonQuery();
int newRegionID = (int) aCommandParameters[@RegionID]Value;
在执行完命令后读取@RegionID参数的值并把它的数据类型转换为整型
如果调用的存储过程返回输出参数和一组记录行该怎么办?在该实例中应定义合适的参数而不是调用ExecuteNonQuery()应调用另一个方法(例如ExecuteReader())遍历所有的返回记录
[] []