当前位置:首页 > 网络编程 > WEB编程 > ASP.net > 自动填充SqlCommand.Parameters的类(1)

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

点击次数:13 次 发布日期:2008-11-26 23:30:19 作者:源代码网
源代码网推荐 //---------------------------------------------------
源代码网推荐 //日期: 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();
源代码网推荐                 }
源代码网推荐                
源代码网推荐             }
源代码网推荐         }

源代码网供稿.
网友评论 (0)
会员中心
网络编程
本站推荐
网络编程之精华