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; } } }

|