C#呼叫儲存過程的類
最近在csdn上遇到些朋友在問在asp.net上呼叫儲存過程的方法,在這裡將我的經驗總結一下並整理髮布處理,供大家參考。
基本 思路是:先獲得儲存過程的引數,然後根據引數表收集值,然後再呼叫儲存過程。但要求在頁面中的控制元件id必須與儲存過程的引數保持一致。並有幾種呼叫方式。 這個也是經驗的總結,並未仔細的推敲,包括很多地方沒有捕捉error,如果有朋友將起改進,麻煩將副本發給我一個,謝謝。
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");