C#存储过程

8/3/2015来源:C#应用人气:1633

C#存储过程

using System;using System.Data;using System.Data.SqlClient;

这是命名空间,不用多讲解了吧。

public class DAL //定义一个类{ string cnstr="data source=.;initial catalog=company;persist security info=False;user id=sa;pwd=sa;";

//定义连接数据库的连接字符串 PRivate SqlCommand cm=new SqlCommand(); //建立Command对象

//定义一个全局的Command 对象。

public SqlCommand getCommand //返回Command对象 { get {return cm;} }

public DAL() //构造函数 { cm.Connection=new SqlConnection(cnstr); }

下面是添加存储过程参数的部分

//--------------------------------------------------------- //添加参数 //---------------------------------------------------------

如果要执行新的存储过程,需要先清除以前添加的存储过程的参数

//清除参数 public void ClearParameter() {cm.Parameters.Clear();}

这是一个通用的添加参数的函数。

//全部的参数 public void addNewParameter(string ParameterName,string ParameterValue,SqlDbType sqlType,int size,string Direction) { cm.Parameters.Add(ParameterName,sqlType,size); //添加存储过程的参数 cm.Parameters[ParameterName].Value=ParameterValue; //负值 cm.Parameters[ParameterName].Direction=getDirection(Direction);//设置方向 }

//方向为输入的 public void addNewParameter(string ParameterName,string ParameterValue,SqlDbType sqlType,int size) { cm.Parameters.Add(ParameterName,sqlType,size); //添加存储过程的参数 cm.Parameters[ParameterName].Value=ParameterValue; //负值 //cm.Parameters[ParameterName].Direction=getDirection(Direction);//设置方向 }

下面是把常用的几个数据类型提出来,方便操作。

这是专门添加int数据类型的参数

//添加int型的参数 public void addNewParameter(string ParameterName,int ParameterValue) { cm.Parameters.Add(ParameterName,SqlDbType.Int,4); //添加存储过程的参数 cm.Parameters[ParameterName].Value=ParameterValue; //负值 //设置方向取默认值——输入 }

这是专门添加nvarChar数据类型的参数

//添加nvarChar型的参数 public void addNewParameter(string ParameterName,string ParameterValue,int size) { cm.Parameters.Add(ParameterName,SqlDbType.NVarChar,size); //添加存储过程的参数 cm.Parameters[ParameterName].Value=ParameterValue; //负值 //设置方向取默认值——输入的 }

这是专门添加Bit数据类型的参数

//添加bit型的参数 public void addNewParameter(string ParameterName,bool ParameterValue) { cm.Parameters.Add(ParameterName,SqlDbType.Bit); //添加存储过程的参数 cm.Parameters[ParameterName].Value=ParameterValue; //负值 //设置方向取默认值——输入的 }

如果你还有其他的数据类型也是经常使用的,可以再加相应的函数。

参数加完了,下面就可以运行存储过程了

//------------------------------------------------------------- // 运行、返回记录集 //-------------------------------------------------------------

通过传入的存储过程的名称来执行存储过程,把返回的记录集放到DataSet里面,如果是多个记录集的话,分别放在Table[0]、Table[1]、Table[2]……

//运行存储过程返回DataSet public DataSet runSPDataSet(string StoredProcedureName) { //cm.Connection=new SqlConnection(cnstr); cm.CommandText=StoredProcedureName; cm.CommandType=CommandType.StoredProcedure; try { SqlDataAdapter da=new SqlDataAdapter(cm); DataSet DS=new DataSet(); da.Fill(DS); return DS; } catch(Exception ex) { throw ex; } finally { cm.Connection.Close(); } }

通过传入的存储过程的名称来执行存储过程,把返回的第一个记录集里的第一条记录放在Object 数组里。多用在显示详细信息里,因为这种情况大多都是只用一条记录的。如果是空的话返回strValue[0]="null" 。

//运行存储过程返回第一条记录的数组public Object[] runSPItems(string StoredProcedureName){Object[] strValue=new Object[1];cm.CommandText=StoredProcedureName;cm.CommandType=CommandType.StoredProcedure;try{cm.Connection.Open();SqlDataReader r = cm.ExecuteReader(CommandBehavior.CloseConnection);if (r.Read()){strValue=new Object[r.FieldCount];r.GetValues(strValue);}else{strValue[0]="null";}r.Close();}catch(Exception ex){throw ex;}finally{cm.Connection.Close();}return strValue;}

如果你想用 DataReader 的话,可以用这个函数返回Command对象,然后用Command.ExecuteReader,最后再用Command.Connection.Close(),关闭连接。应该还有更好的方法吧,总之我是很少用DataReader 的。

//加入存储过程需要的参数,返回commandpublic SqlCommand getSPCommand(string StoredProcedureName){//cm.Connection=new SqlConnection(cnstr);cm.CommandText=StoredProcedureName;cm.CommandType=CommandType.StoredProcedure;return cm;}

如果只是添加记录不需要返回记录集的话,可以用下面的函数。

//运行存储过程 不返回记录集,用于添加记录,或者是通过存储过程的参数返回数据。public string runSP(string ParameterName){//cm.Connection=new SqlConnection(cnstr);cm.CommandType=CommandType.StoredProcedure;cm.CommandText=ParameterName;try{cm.Connection.Open();cm.ExecuteNonQuery();cm.Connection.Close();return "true";}catch(Exception ex){throw ex;}finally{cm.Connection.Close();}

}

存储过程也执行完毕了,那如果有output类型的参数,要取回参数值怎么办呢,那就写个函数来实现吧。

//按序号返回参数值,一般在执行完存储过程后使用 public string getParameter(int ParameterIndex) { return cm.Parameters[ParameterIndex].Value.ToString(); }

//按名称返回参数值 public string getParameter(string ParameterName) { return cm.Parameters[ParameterName].Value.ToString(); }