位置:海鸟网 > IT > ASP.NET >

自动填充SqlCommand.Parameters的类(1)

//---------------------------------------------------
//日期: 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();
                }
               
            }
        }