自动填充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(); 源代码网推荐 } 源代码网推荐 源代码网推荐 } 源代码网推荐 } 源代码网供稿. |
