根据存储过程名创建对应的命令过程

类别:.NET开发 点击:0 评论:0 推荐:

using System;
using System.Data .SqlClient ;
using System.Data ;
using System.Collections ;
using System.EnterpriseServices ;
namespace SevCompant
{
 /// <summary>
 /// DataBaseProcedure 的摘要说明。
 /// 对相关的数据库的所有存储过程进行创建的类,
 /// 最好将其实例作为全局变量使用
 /// </summary>
 public class DataBaseProcedure
 {
  private  Hashtable  procHsh=new Hashtable();
  private  Hashtable  createdProcHsh=new Hashtable();
  private  SqlConnection  cnn=null;
  private  string    retParaName="@ReturnValue";
  public   string    ReturnParaName
  {
   get{return this.retParaName ;}
   set{this.retParaName=value;}
  }
  private  const string  ProcSql="select a.name,b.name ,COLUMNPROPERTY(@ProID,a.name,'PRECISION'),isnull(columnproperty(@proid,a.name,'isoutparam'),0) ,isnull(columnproperty(@proid,a.name,'allownull'),0),isnull(COLUMNPROPERTY(@ProID,a.name,'Scale'),0),a.length from  syscolumns a,systypes b  where id=@ProID and b.xusertype=a.xusertype";
  public DataBaseProcedure(SqlConnection sqlcnn)
  {
   //得到所有该数据库的相关存储过程
   this.cnn=sqlcnn;
   string cmdstr="select name ,id from sysobjects where  type='p' and status>=0";
   SqlCommand cmd=new SqlCommand(cmdstr,this.cnn );
      this.cnn.Open ();
   SqlDataReader dr=cmd.ExecuteReader (CommandBehavior.CloseConnection);
   while(dr.Read ())
   {
    procHsh.Add(dr[0].ToString (),dr[1].ToString ());
   }
   dr.Close ();
  }
  /// <summary>
  ///根据存储过程名创建对应的命令过程
  ///注:默认的参数类型方向仅有:Input,Ouput,ReturnValue 不存在InputOutput
  ///但在创建完成之后可以自行修改
  ///已经设置了以下属性(==均可以自已在创建完成之后自行修改==):
  ///ParameterName   Direction   Size  Precision  Scale   IsNullable  SqlDbType
  ///另外,也添加了一个Direction==ReturnValue ,ParameterName=@ReturnValue的参数
  ///如果想修改该参数他,可以在这之前修改ReturnParaName属性或是在创建完成之后修改(不过这样做,无法通过ReturnParaName
  ///得到该参数的正确命名:ParameterName)
  ///推荐采用前一种方法
  /// </summary>
  /// <param name="procedureName">存储过程名字</param>
  /// <returns>SqlCommand类型</returns>
  public   SqlCommand  CreateCommand(string procedureName)
  {
   //判断命名为:procedure的存储过程是否存在
   if(!procHsh.Contains(procedureName))
    throw new ArgumentException("在数据库不存名为["+procedure+"]的存储过程");
   SqlCommand cmd=null;
   if(!createdProcHsh.Contains(procedureName))
   {
    cmd=new SqlCommand(procedureName);
    cmd.CommandType=CommandType.StoredProcedure ;
    //生成数据库的参数
    string   procIdVal=procHsh[procedureName];
    SqlCommand prCmd=new SqlCommand(DataBaseProcedure.ProcSql ,this.cnn );
    prCmd.Parameters.Add("@ProID",procIdVal);
    this.cnn .Open ();
    DataMap dt=new DataMap();
    SqlDataReader dr=cmd.ExecuteReader(CommandBehavior.CloseConnection);
    while(dr.Read ())
    {
     //0 参数名 1  数据类型  2精度  3 是否输出参数 4 可空  5 小数位数 6字节数 
     SqlParameter par=new SqlParameter();
     par.ParameterName=dr[0].ToString ();
     //select a.name,
     //b.name ,
     // COLUMNPROPERTY(@ProID,a.name,'PRECISION'),
     //isnull(columnproperty(@proid,a.name,'isoutparam'),0) ,
     //isnull(columnproperty(@proid,a.name,'allownull'),0),
     //isnull(COLUMNPROPERTY(@ProID,a.name,'Scale'),0)
     //from  syscolumns a,systypes b  where id=@ProID and b.xusertype=a.xusertype
     par.SqlDbType=dt.DotnetSqlDbType(dr[1].ToString ());
     par.Precision=Convert.ToByte(dr[2].ToString ());
     par.Direction=dr[3].ToString ()=="1"?ParameterDirection.Output :ParameterDirection.Input ;
     bool nulb=dr[4].ToString ()=="1"?true:false;
     par.set_IsNullable(nulb);
     par.Scale=Convert.ToByte(dr[5].ToString ());
     par.Size=Convert.ToInt32(dr[6].ToString ());
     cmd.Parameters.Add(par);
    }

    dr.Close ();
    SqlParameter pret=new SqlParameter();
    pret.ParameterName=this.retParaName ;
    pret.Direction=ParameterDirection.ReturnValue ;
    cmd.Parameters.Add(pret);
    this.createdProcHsh.Add(procedureName,cmd);
   
   }
   else
   {
    cmd=this.createdProcHsh[procedureName] as SqlCommand ;
    
   }
   return cmd;
  }
  
 }
}

本文地址:http://com.8s8s.com/it/it43028.htm