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 的。
//加入存储过程需要的参数,返回command
public 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();
}