asp.net調用預存程序類

來源:互聯網
上載者:User
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");

 



相關文章

E-Commerce Solutions

Leverage the same tools powering the Alibaba Ecosystem

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。