参数化存储过程的ADO.NET使用

    处理SQL Server数据库存储过程输入和输出参数的ADO.NET类是DbCommand。DbCommand是负责在数据库上执行命令的,所以它也负责处理它们的参数。(DbCommand是一个公共类,它总是引用一个“真正”的命令对象,如SQLCommand。)
    1、使用输入参数
    在给一个命令对象添加一个输入参数时,同时需要指定参数名称、数据类型和值。DbCommand对象把这些参数存放在一个名为Parameters的集合中,它属于DbParameter对象。
    每个DbParameter实例表示一个参数。使用CreateParameter方法为这个命令创建了一个DbParameter对象。并设置了它的属性,最后把这个参数添加到命令的参数集合中。
    示例代码如下:
//创建一个新的参数
DbParameter param = comm.CreateParameter();//创建一个新的参数
param.ParameterName 
= "@name";//参数名称
param.Value = value;//
param.DbType = DbType.Int32;//数据类型
comm.Parameters.Add(param);//把这个参数添加到命令的参数集合
   命令的CreateParameter方法,总是返回一个特定于所使用的数据提供程序的参数对象,因此,如果是SQL Server数据库,则DbParameter实际上是指向SqlParameter实例。
   2、使用输出参数
    存储过程的输出参数在存储过程中被赋值,等存储过程执行完成后,调用该过程的函数就可以读取该值,想返回非整型数据,或想用返回值来表示执行成功的标志(或其它用途)时,输出参数都很有用。
    示例代码如下:
//创建一个新的参数
DbParameter param = comm.CreateParameter();
param.ParameterName 
="@OutputName";//参数名称
param.Direction = ParameterDirection.Output;//输出参数
param.DbType = DbType.Int32;//参数类型
comm.Parameters.Add(param);//把这个参数添加到命令集的参数集合
    这与输入参数的代码几乎一样,除了应为参数提供一人值,并将Direction属性的值设置为ParameterDirection.Output之外。这将告诉命令@OutputName是一个输出参数。
    3、存储过程参数不是强类型
    在添加存储过程参数时,应使用与存储过程中一样的名称、类型和大小。但并不用总是这么做,因为SQL SERVER是非常灵活的并能自动做类型转换。例如,可以用VarChar或NvarChar类型来添加@ID,只要这个值中包含一个数字就行。在业务层中,建议为参数指定正确的数据类型,DbParameter对象总是会检查你所赋的值,看它是否可转换成特定的数据类型,如果不行,就会产生一个异常。这样,就可以在业务层中控制,伪造的值将无法送到数据库,从而避免数据库被破坏。
    在业务层的C#方法总是以字符串类型从表示层中获取它们的参数。为这种架构选择这种方法,是为了保护表示层不被数据类型所困扰。如:不用关心ID的类型(123或ABC)。这是业务层的任务,即解释数据和检查它的正确性。
    4、从输出参数中获取结果
    在执行完带有输出参数的存储过程后,或许想从这些参数中读取返回值。这可以在执行完该存储过程并关闭数据库连接后,从DbParameter对象中读取参数值。
    在业务层中,有用来获取输出参数值的代码如下: 
int outPutName = Int32.Parse(comm.Parameter["@OutputName"].ToString());
    ToString()用于返回值转换成一个字符串,然后再解析或转换为整数。


posted @ 2007-09-05 14:39  金戈铁马  阅读(2036)  评论(0编辑  收藏  举报