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