| 
| 技术资料  > .Net专区 > Asp.Net开发 : 自动填充SqlCommand.Parameters的类(1) |  
自动填充SqlCommand.Parameters的类(1) March 25,2004 |  
//--------------------------------------------------- 
//日期: 2002.1.10 
//作者: raxzhang 
//版权: raxzhang 
//环境: Microsoft Visual Studio.Net 7.0 
//语言: Visual C# 
//类型: 类文件,编译后为.dll文件 
//描述: 这是作为对数据操作的最常用的属性和方法类。 
//       是一个基础类。可以被继承和扩展。 
//注意: 使用这个类的条件是-1.dbo用户。2.存储过程的 
//       参数名与表的字段名相差一个@ 
//--------------------------------------------------- 
using System; 
using System.Collections; 
using System.Data; 
using System.Data.SqlClient;    
 
namespace zyq.DBMapping 
{ 
    /// <summary> 
    /// 对SQL server进行操作 
    /// </summary> 
    public class DataAccessSQL 
    { 
        #region class variables  
        private String connectionString; 
        private int _tablecount=-1; 
        private int _stroeprocedurecount=-1; 
        private SqlConnection conn=null; 
        #endregion  
        #region properties  of class  
        /// <summary> 
        /// 属性:数据库存储过程的个数(stat>0) 
        /// </summary> 
        public int StroeProcedureCount 
        { 
            get 
            { 
                if (this._stroeprocedurecount !=-1) 
                { 
                    return this._stroeprocedurecount; 
                } 
                else 
                { 
                    return this.GetStroeProcedures().Count; 
                } 
            } 
        } 
        /// <summary> 
        /// 属性:数据库用户表的个数 
        /// </summary> 
        public int TablesCount 
        { 
            get 
            { 
                if(this._tablecount !=-1) 
                { 
                    return this._tablecolscount; 
                } 
                else 
                { 
                    return this.GetTables().Count; 
                } 
             } 
 
        } 
        #endregion  
        #region structure of class  
        /// <summary> 
        /// 构造函数 
        /// </summary> 
        /// <param name="ConnectionString">数据库连接字符串,string</param> 
        public DataAccessSQL(string ConnectionString) 
        { 
            this.connectionString=ConnectionString; 
            this.conn =new SqlConnection(this.connectionString); 
        } 
        #endregion  
        #region Methods of class   
        /// <summary> 
        /// 获得数据库的所有表对象 
        /// </summary> 
        /// <returns>System.Data.SqlClient.SqlDataReader</returns> 
        public Hashtable GetTables() 
        { 
            try 
            { 
                Hashtable sptable=new Hashtable(); 
                //验证连接 
                if(conn!=null && conn.State!=ConnectionState.Open) 
                { 
                    conn.Open(); 
                } 
                else 
                { 
                    conn= new SqlConnection(this.connectionString); 
                    conn.Open(); 
                }                                             
                string Query = " select name, Id from sysobjects  where (type='U') and (name <> 'dtproperties') order by name "; 
                //获得指定数据库中的所有用户表的名称和ID 
                SqlCommand comm= new SqlCommand(Query,conn);             
                SqlDataReader reader=comm.ExecuteReader(CommandBehavior.CloseConnection); 
                //录制Hashtable 
                while(reader.Read()) 
                { 
                    sptable.Add(reader.GetInt32(1),reader.GetString(0)); 
                } 
                this._tablecount =sptable.Count; 
                return sptable; 
            } 
            catch(SqlException se) 
            { 
                throw(se); 
            } 
        } 
        /// <summary> 
        /// 获得数据库的存储过程的名称及ID列表 
        /// </summary> 
        /// <returns>HasTable</returns> 
        public Hashtable GetStroeProcedures() 
        {             
            try 
            {     
                //验证连接             
                if(conn!=null && conn.State!=ConnectionState.Closed) 
                { 
                    conn.Open(); 
                } 
                else 
                { 
                    conn= new SqlConnection(this.connectionString); 
                    conn.Open(); 
                } 
                Hashtable sptable=new Hashtable(); 
                string Query = " SELECT name, id FROM sysobjects WHERE (type = 'p') AND (status > 0) "; 
                //获得指定数据库中的所有用户存储过程的名称和ID 
                SqlCommand comm= new SqlCommand(Query,conn); 
             
                SqlDataReader reader=comm.ExecuteReader(CommandBehavior.CloseConnection); 
                //录制Hashtable 
                while(reader.Read()) 
                { 
                    sptable.Add(reader.GetInt32(1),reader.GetString(0)); 
                } 
                this._stroeprocedurecount =sptable.Count; 
                return sptable; 
            } 
            catch(SqlException se) 
            { 
                throw(se); 
            } 
            catch(Exception e) 
            { 
                throw(e); 
            } 
            finally 
            { 
                if(conn.State==ConnectionState.Open ) 
                    conn.Close(); 
            } 
        } 
        /// <summary> 
        ///获得数据库的指定表的列对象定义 
        /// </summary> 
        /// <param name="spname">表名称</param> 
        /// <returns>DataSet</returns> 
        public DataSet getTableColumns(string spname) 
        { 
             
            try 
            { 
                Int32 spid=-1; //指定表的ID号初始 
                //验证连接 
                if(conn!=null && conn.State!=ConnectionState.Closed) 
                { 
                    conn.Open(); 
                } 
                else 
                { 
                    conn= new SqlConnection(this.connectionString); 
                    conn.Open(); 
                } 
                //获取指定表名的ID号 
                SqlCommand comm= new SqlCommand("SELECT id FROM dbo.sysobjects WHERE name = '"+spname,conn); 
                SqlDataReader reader=comm.ExecuteReader(CommandBehavior.CloseConnection); 
                while(reader.Read()) 
                {  
                    spid = reader.GetInt32(0);   
                } 
                reader.Close(); 
                //验证ID 
                if(spid==0 ||spid==-1) 
                    throw new Exception ("StroedProcedure is not existed!"); 
                //获得表的列定义 
                return getTableColumns(spid); 
            } 
            catch(SqlException se) 
            { 
                throw(se); 
            } 
            finally 
            { 
                if(conn.State ==ConnectionState.Open) 
                    conn.Close(); 
            } 
 
        } 
        /// <summary> 
        /// 获得数据库的指定表的列对象定义的列数组 
        /// </summary> 
        /// <param name="spid">表名称</param> 
        /// <returns>DataSet</returns> 
        public DataSet getTableColumns(Int32 spid) 
        {             
            try 
            {                 
                DataSet myDataSet=new DataSet(); 
                //验证连接 
                if(conn!=null && conn.State!=ConnectionState.Closed) 
                { 
                    conn.Open(); 
                } 
                else 
                { 
                    conn= new SqlConnection(this.connectionString); 
                    conn.Open(); 
                } 
                SqlDataAdapter comm= new SqlDataAdapter("SELECT dbo.syscolumns.name, dbo.systypes.name AS Type, dbo.syscolumns.length,dbo.syscolumns.isoutparam, dbo.syscolumns.isnullable FROM dbo.syscolumns INNER JOIN dbo.systypes ON dbo.syscolumns.xtype = dbo.systypes.xtype WHERE dbo.syscolumns.id ='"+spid+"'",conn); 
                //获取指定表的列定义 
                comm.Fill(myDataSet,"dbo.systypes"); 
                comm.Fill(myDataSet,"dbo.systypes"); 
                /*this._tablecolscount=myDataSet.Tables[0].Rows.Count; 
                DataColumn[] dcols=new DataColumn[5]; 
                dcols[0]=myDataSet.Tables["dbo.syscolumns"].Columns["name"]; 
                dcols[1]=myDataSet.Tables["dbo.systypes"].Columns["Type"]; 
                dcols[2]=myDataSet.Tables["dbo.syscolumns"].Columns["length"]; 
                dcols[3]=myDataSet.Tables["dbo.syscolumns"].Columns["isoutparam"]; 
                dcols[3]=myDataSet.Tables["dbo.syscolumns"].Columns["isnullable"];*/ 
                return myDataSet; 
            } 
            catch(SqlException se) 
            { 
                throw(se); 
            } 
            finally 
            { 
                if(conn.State ==ConnectionState.Open) 
                { 
                    conn.Close(); 
                } 
            } 
        } 
        /// <summary> 
        /// 为传入SqlCommand对象建立存储过程的参数数组 
        /// </summary> 
        /// <remarks >参数只付值ParameterName,SqlDbType,IsNullable,Direction</remarks> 
        /// <param name="sqlcommand">SqlCommand</param>         
        /// <returns>SqlCommand</returns> 
        public SqlCommand getStroeProcedureParamsByName(SqlCommand sqlcommand)//, string spname) 
        { 
            try 
            { 
                Int32 spid=-1; //初始化存储过程的ID 
                //验证连接 
                if(conn!=null && conn.State!=ConnectionState.Open) 
                { 
                    conn.Open(); 
                } 
                else 
                { 
                    conn= new SqlConnection(this.connectionString); 
                    conn.Open(); 
                } 
                //获取存储过程的名称 
                string spname=sqlcommand.CommandText; 
                //获取存储过程的ID号 
                SqlCommand comm= new SqlCommand("SELECT id FROM dbo.sysobjects WHERE name = '"+spname+"'",conn); 
                SqlDataReader reader=comm.ExecuteReader(CommandBehavior.CloseConnection); 
                while(reader.Read()) 
                {  
                    spid = reader.GetInt32(0);   
                } 
                //验证ID号 
                if(spid==0 ||spid==-1) 
                    throw new Exception ("StroedProcedure is not existed!"); 
                //创建参数数组 
                return getStroeProcedureParamsByID( sqlcommand ,spid); 
            } 
            catch(SqlException se) 
            { 
                throw(se); 
            } 
            finally 
            { 
                if(conn.State ==ConnectionState.Open) 
                { 
                    conn.Close(); 
                } 
            } 
        } 
        /// <summary> 
        ///为传入SqlCommand对象建立存储过程的参数数组 
        /// </summary> 
        /// <remarks >参数只付值ParameterName,SqlDbType,IsNullable,Direction</remarks> 
        /// <param name="sqlcommand">SqlCommand</param> 
        /// <param name="spid">存储过程ID</param> 
        /// <returns>SqlCommand</returns> 
        public SqlCommand getStroeProcedureParamsByID(SqlCommand sqlcommand, Int32 spid) 
        {                     
            try 
            { 
                //获取存储过程相关表的isnullable定义 
                Hashtable dependtble=this.SPDependonTable(spid); 
                DataSet myDataSet=new DataSet(); 
                //验证连接 
                if(conn!=null && conn.State!=ConnectionState.Open) 
                { 
                    conn.Open(); 
                } 
                else 
                { 
                    conn= new SqlConnection(this.connectionString); 
                    conn.Open(); 
                } 
                //获取指定存储过程的参数内容 
                SqlDataAdapter comm= new SqlDataAdapter("SELECT dbo.syscolumns.name, dbo.systypes.name AS Type, dbo.syscolumns.length,dbo.syscolumns.isoutparam FROM dbo.syscolumns INNER JOIN dbo.systypes ON dbo.syscolumns.xtype = dbo.systypes.xtype WHERE dbo.syscolumns.id ="+spid,conn);//, dbo.syscolumns.isnullable                 
                comm.Fill(myDataSet,"dbo.syscolumns"); 
                comm.Fill(myDataSet,"dbo.systypes");                 
                int paramcount = myDataSet.Tables[0].Rows.Count;                 
                for(int i=0;i<paramcount;i++) 
                { 
                    //参数名称 
                    string pname=myDataSet.Tables["dbo.syscolumns"].Rows["name"].ToString();//.ToString(); 
                    //参数的SqlDBType类型定义 
                    SqlDbType ptp=this.getSqlDbType(myDataSet.Tables["dbo.systypes"].Rows["Type"].ToString()); 
                    //参数的DBType类型定义 
                    //DbType dtp=this.getDbType(myDataSet.Tables["dbo.systypes"].Rows["Type"].ToString()); 
                    //参数的长度定义 
                    int flength=Convert.ToInt32(myDataSet.Tables["dbo.syscolumns"].Rows["length"]); 
                    //创建一个参数 
                    sqlcommand.Parameters.Add(pname,ptp,flength); 
                    //定义参数可否为空值,由相关表的isnullable定义得到                     
                    sqlcommand.Parameters[pname].IsNullable =(Boolean)dependtble[pname]; 
                    //sqlcommand.Parameters[pname].DbType =dtp;     
                    //定义参数的INPUT和OUTPUT                 
                    if((int)(myDataSet.Tables["dbo.syscolumns"].Rows["isoutparam"])==1) 
                    { 
                        sqlcommand.Parameters[pname].Direction =ParameterDirection.Output; 
                    } 
                    else 
                    { 
                        sqlcommand.Parameters[pname].Direction =ParameterDirection.Input; 
                    } 
                } 
                this._spparamcount=paramcount; 
                return sqlcommand; 
            } 
            catch(SqlException se) 
            { 
                throw(se); 
            } 
            finally 
            { 
                if(conn.State ==ConnectionState.Open) 
                { 
                    conn.Close(); 
                } 
                 
            } 
        } |  
 
 |