asp.net调用存储过程类

asp.net|存储过程

最近在csdn上遇到些朋友在问在asp.net上调用存储过程的方法,在这里将我的经验总结一下并整理发布处理,供大家参考。

基本思路是:先获得存储过程的参数,然后根据参数表收集值,然后再调用存储过程。但要求在页面中的控件id必须与存储过程的参数保持一致。并有几种调用方式。这个也是经验的总结,并未仔细的推敲,包括很多地方没有捕捉error,如果有朋友将起改进,麻烦将副本发给我一个,谢谢。本人mail:huangguolinc@163.com

public class DB:Page
 {
  //数据库连接
  public SqlConnection conn = new SqlConnection(System.Configuration.ConfigurationSettings.AppSettings["Conn"]);
  //创建SqlCommand对象
  private SqlCommand cmd;

  public SqlDataReader returnsdr;
  public string sqlQueryString="";
 
  public string SQS
  {
   set
   {
    sqlQueryString=value;
   }
   get
   {
    return sqlQueryString;
   }
  }
  public SqlDataReader SDR
  {
   set
   {
    returnsdr=value;
   }
   get
   {
    return returnsdr;
   }
  }

  public string[] paras={};
  public string[] values={};
  public string valuetype="ds";
 
  public string ValueType
  {
   set
   {
    valuetype=value;
   }
   get
   {
    return valuetype;
   }
  }
  public string[] Paras
  {
   set
   {
    paras=value;
   }
   get
   {
    return paras;
   }
  }
  public string[] Values
  {
   set
   {
    values=value;
   }
   get
   {
    return values;
   }
  }
 
  public System.Web.UI.HtmlControls.HtmlForm hf;
  public System.Web.UI.HtmlControls.HtmlForm HF{set{hf=value;}get{return hf;}}
  public bool hfEnable=true;
  public bool HFEnable{set {hfEnable=value;}get{return hfEnable;}}
  public int info;
  public int Info{set{info=value;}get{return info;}}
 

  //连接数据库
  public SqlConnection Conn()
  {
   if(conn.State!=ConnectionState.Open)
   {
    conn.Open();
   }
   return conn;
  }

  //获取存储过程的参数
  protected DataSet GetStoreProcedureParams(string StoreProcedureName)
  {
   conn=this.Conn();

   int StoreProcedureId=-1;
   DataSet ds=new DataSet();

   SqlCommand sc=new SqlCommand("SELECT id FROM dbo.sysobjects WHERE name = '"+StoreProcedureName+"'",conn);
   SqlDataReader sdr=sc.ExecuteReader();
   while(sdr.Read())
   {
    StoreProcedureId=sdr.GetInt32(0);
   }
   sdr.Close();

   SqlDataAdapter sda=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 ='"+StoreProcedureId+"'",conn);
   sda.Fill(ds,"dbo.syscolumns");
   //sda.Fill(ds,"dbo.systypes");

   return ds;
  }

  public SqlCommand CallStoreProcedure(string StoreProcedureName)
  {
   //Server.Transfer("../main/1.aspx");
   //连接数据库
   conn=this.Conn();
   //创建并获取存储过程参数列表
   DataSet ds=new DataSet();
   ds=this.GetStoreProcedureParams(StoreProcedureName);
 
   //存储过程参数值
   string TempValue;
   //以数组方式传递的参数对象的个数
   int args=this.Paras.Length;
   //存储过程赋值方式标记
   bool flag=false;
   //创建SqlCommand对象,并置为存储过程方式
   cmd=new SqlCommand(StoreProcedureName,conn);
   cmd.CommandType=CommandType.StoredProcedure;
   //对存储过程参数集进行遍历,如果未获得数组赋值,则遍历窗体控件进行赋值,如果二者都没有,则赋值为空
   foreach(DataTable dt in ds.Tables)
   {
    foreach(DataRow dr in dt.Rows)
    {
     switch(dr["type"].ToString())
     {
      case "varchar":
       cmd.Parameters.Add(new SqlParameter(dr["name"].ToString(),SqlDbType.VarChar));
       break;
      default:
       cmd.Parameters.Add(new SqlParameter(dr["name"].ToString(),SqlDbType.VarChar));
       break;
     }
   
     //初始化新参数值,并置赋值方式状态
     TempValue="";
     flag=false;
   
     //遍历数组
     for(int ItemIndex=0;ItemIndex<args;ItemIndex++)
     {
      if(this.Paras[ItemIndex]==dr["name"].ToString())
      {
       TempValue=this.Values[ItemIndex];
       flag=true;
       break;
      }
     }
   
     if(this.HFEnable)
     {
      if(!flag)
      {
       //创建窗体对象集
       IEnumerator ie=this.HF.Controls.GetEnumerator();
       ie.Reset();
       //遍历窗体控件,检索对应参数的赋值
       while(ie.MoveNext())
       {
        Control ctl=(Control)ie.Current;
        if("@"+ctl.ID==dr["name"].ToString())
        {
      
         switch(ctl.GetType().ToString())
         {
          case "System.Web.UI.WebControls.TextBox":
           TempValue=((TextBox)ctl).Text;
           break;
          case "System.Web.UI.WebControls.DropDownList":
           TempValue=((DropDownList)ctl).SelectedValue;
           break;
          default:
           TempValue="";
           break;
         }
         break;
        }
        if(ctl.GetType().ToString()=="System.Web.UI.WebControls.Panel")
        {
         Control ctlChild=ctl.FindControl(dr["name"].ToString().Substring(1));
         if(ctlChild!=null)
         {
          switch(ctlChild.GetType().ToString())
          {
           case "System.Web.UI.WebControls.TextBox":
            TempValue=((TextBox)ctlChild).Text;
            break;
           case "System.Web.UI.WebControls.DropDownList":
            TempValue=((DropDownList)ctlChild).SelectedValue;
            break;
           default:
            TempValue="";
            break;
          }
          //Server.Transfer("../main/1.aspx");
         }
        }
       }
      }
     }

     cmd.Parameters[dr["name"].ToString()].Value=TempValue;
    }
   }
   return cmd;
  }
  public void nonExecute(string StoreProcedureName)
  {
   SqlCommand cmd = this.CallStoreProcedure(StoreProcedureName);

   cmd.ExecuteNonQuery();
  }
  public DataSet dsExecute(string StoreProcedureName)
  {
   DataSet ds=new DataSet();

   SqlCommand cmd = this.CallStoreProcedure(StoreProcedureName);

   SqlDataAdapter sda = new SqlDataAdapter(cmd);
   sda.Fill(ds,"result");
   return ds;
  }
  public SqlDataReader sdrExecute(string StoreProcedureName)
  {
   SqlCommand cmd = this.CallStoreProcedure(StoreProcedureName);

   SqlDataReader sdr = cmd.ExecuteReader();

   return sdr;
  }
 }

调用方法:

DB.Mapping dm=new DB.Mapping();
 dm.HF=frm;
 dm.HFEnable=true;
 string[] paras={"@SalePerformCreater","@SalePerformCreateTime"};
 string[] values={((int)Session["UserID"]).ToString(),lDate.ToString()};
 dm.Paras=paras;
 dm.Values=values;
 
 dm.nonExecute("SalePerformNew");

 

时间: 2024-12-25 10:31:44

asp.net调用存储过程类的相关文章

关于ASP.NET 调用存储过程传参数的问题

问题描述 关于ASP.NET 调用存储过程传参数的问题 /// /// 执行存储过程 /// /// 存储过程名 /// 存储过程参数 /// SqlDataReader public static SqlDataReader RunProcedure(string storedProcName, IDataParameter[] parameters) { SqlConnection connection = OpenSqlConnection(); SqlCommand command =

asp.net调用存储过程往oracle写clob字段?急死了,弄两天了。。

问题描述 asp.net调用存储过程往oracle写clob字段?急死了,弄两天了..在页面上有一个FCK编辑器可以取VALUE值,然后我把他转化成string类型,调用存储过程来往oracle的clob字段插数据,可是value值大的时候,当然没超过1M,提示转换错误,为什么呢?难道这里的clob不能调用存储过程来写?谁有好的办法,马上结帖!!! 解决方案 解决方案二:在网上找的都是直接insert语句,难道不能调用存储过程吗,我的insert语句是在存储过程里,怎么调用存储过程来写clob字

asp.net调用存储过程方法新解

asp.net|存储过程 在使用.net的过程中,数据库访问是一个很重要的部分,特别是在b/s系统的构建过程中,数据库操作几乎成为了一个必不可少的操作.调用存储过程实现数据库操作使很多程序员使用的方法,而且大多数的程序员都是能使用存储过程就使用存储过程,很少直接使用sql语句,所以存储过程是很有用而且很重要的. 存储过程简介 简单的说,存储过程是由一些sql语句和控制语句组成的被封装起来的过程,它驻留在数据库中,可以被客户应用程序调用,也可以从另一个过程或触发器调用.它的参数可以被传递和返回.与

在ASP中调用存储过程的几种方法

存储过程 1 这也是最简单的方法,两个输入参数,无返回值:set connection = server.createobject("adodb.connection")connection.open someDSN Connection.Execute "procname varvalue1, varvalue2" '将所有对象清为nothing,释放资源connection.closeset connection = nothing 2 如果要返回 Record

在ASP中调用存储过程的几种方法_存储过程

1 这也是最简单的方法,两个输入参数,无返回值: set connection = server.createobject("adodb.connection") connection.open someDSN  Connection.Execute "procname varvalue1, varvalue2"  '将所有对象清为nothing,释放资源 connection.close set connection = nothing 2 如果要返回 Recor

在Asp中使用存储过程 数值类型值

存储过程 在Asp中使用存储过程 为了提高Asp程序的效率,有时需要在Asp中使用使用Sql Server的存储技术,下面简单作一个介绍. 存储过程的建立 这里只简单介绍如何在Sql Server的企业管理器中如何建立存储过程: (1)打开企业管理器Enterprise manager (2)选择服务器组(SQL Server Group).服务器.数据库(Database)以及相就的数据库,鼠标右击对应数据库下的Stored Procdures项,在弹出的菜单中选择New Stored Pro

ASP调用存储过程访问SQL Server

server|存储过程|访问     ASP与存储过程(Stored Procedures)的文章不少,但是我怀疑作者们是否真正实践过.我在初学时查阅过大量相关资料,发现其中提供的很多方法实际操作起来并不是那么回事.对于简单的应用,这些资料也许是有帮助的,但仅限于此,因为它们根本就是千篇一律,互相抄袭,稍微复杂点的应用,就全都语焉不详了.     现在,我基本上通过调用存储过程访问SQL Server,以下的文字虽不敢保证绝对正确,但都是实践的总结,希望对大家能有帮助.      存储过程就是作

asp调用存储过程

存储过程 1.调用存储过程的一般方法 先假设在sql server中有一存储过程dt_users: CREATE PROCEDURE [dbo].[dt_users] AS select * from users return GO 第一种方法是不利用command对象,直接用recordset对象 set rs=server.createobject("adodb.recordset") sql="exec dt_users" rs.open sql,conn,1

asp调用存储过程_ASP基础

1.调用存储过程的一般方法 先假设在sql server中有一存储过程dt_users: CREATE PROCEDURE [dbo].[dt_users] AS select * from users return GO 第一种方法是不利用command对象,直接用recordset对象 set rs=server.createobject("adodb.recordset") sql="exec dt_users" rs.open sql,conn,1,1 这样