存储过程的使用
存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中。用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。存储过程是数据库中的一个重要对象,任何一个设计良好的数据库应用程序都应该用到存储过程。
优点:
1)存储过程的能力大大增强了SQL语言的功能和灵活性。存储过程可以用流控制语句编写,有很强的灵活性,可以完成复杂的判断和较复杂的运算。 2)可保证数据的安全性和完整性。
3)通过存储过程可以使没有权限的用户在控制之下间接地存取数据库,从而保证数据的安全。
4)通过存储过程可以使相关的动作在一起发生,从而可以维护数据库的完整性。
5)在运行存储过程前,数据库已对其进行了语法和句法分析,并给出了优化执行方案。这种已经编译好的过程可极大地改善SQL语句的性能。由于执行SQL语句的大部分工作已经完成,所以存储过程能以极快的速度执行。 6)可以降低网络的通信量。
7)使体现企业规则的运算程序放入数据库服务器中,以便集中控制。
8)当企业规则发生变化时在服务器中改变存储过程即可,无须修改任何应用程序。企业规则的特点是要经常变化,如果把体现企业规则的运算程序放入应用程序中,则当企业规则发生变化时,就需要修改应用程序工作量非常之大(修改、发行和安装应用程序)。如果把体现企业规则的运算放入存储过程中,则当企业规则发生变化时,只要修改存储过程就可以了,应用程序无须任何变化。
缺点:
1)调试麻烦,但是用 PL/SQL Developer 调试很方便!弥补这个缺点。
2)移植问题,数据库端代码当然是与数据库相关的。但是如果是做工程型项目,基本不存在移植问题。
3)重新编译问题,因为后端代码是运行前编译的,如果带有引用关系的对象发生改变时,受影响的存储过程、包将需要重新编译(不过也可以设置成运行时刻自动编译)。
4)如果在一个程序系统中大量的使用存储过程,到程序交付使用的时候随着用户需求的增加会导致数据结构的变化,接着就是系统的相关问题了,最后如果用户想维护该系统会很难、而且代价是空前的。维护起来更加麻烦!
使用:
普通数据库操作包含添加、修改、根据ID删除、获取信息列表、根据ID获取相关信息五种操作,只有添加信息和修改信息两个方法需要每执行一次相应操作都要写一个的方法,其它的都可以写成公用方法,换掉存储过程和相应的ID参数及ID值而已。 添加信息:
CREATE Procedure [dbo].[Proc_AddAboutUS] (
@aboutUsType int,
@aboutUsTitle nvarchar(100),
- 1 -
存储过程的使用
) AS
@aboutUsUpDateTime datetime, @aboutUsContent ntext, @aboutUsEditor nvarchar(50)
BEGIN
INSERT
dbo.tb_AboutUS(aboutUsType,aboutUsTitle,aboutUsUpDateTime,aboutUsContent,aboutUsEditor)
VALUES(@aboutUsType,@aboutUsTitle,@aboutUsUpDateTime,@aboutUsContent,@aboutUsEditor) END
public int Add_aboutUSNews(string strSqlAdminSession, int aboutUsType, string aboutUsTitle, string aboutUsContent, string aboutUsEditor, DateTime aboutUsUpDateTime) {
int returnValue = -1;
if (strSqlAdminSession == \"\" || strSqlAdminSession == null) {
return returnValue; } else {
SqlConnection myConn = dbObj.GetConnection();
SqlCommand myCmd = new SqlCommand(\"Proc_AddAboutUS\", myConn); myCmd.CommandType = CommandType.StoredProcedure;
//添加参数
SqlParameter spaboutUsType = new SqlParameter(\"@aboutUsType\", SqlDbType.Int); spaboutUsType.Value = aboutUsType; myCmd.Parameters.Add(spaboutUsType); myConn.Open(); try {
returnValue = myCmd.ExecuteNonQuery(); return returnValue; }
catch (Exception Erro) {
throw Erro; } finally {
myCmd.Dispose();
- 2 -
存储过程的使用
myConn.Close(); } }
}
修改信息: 获取数据集
public DataSet Edit_dsGetInfor(string strProcAdminSession, string Proc_tb_Edit, string strProcedure) {
DataSet returnValue = new DataSet();
returnValue = null;//将返回值的初始值设置为空
if (strProcAdminSession != \"\" && strProcAdminSession != null) {
SqlConnection myConn = dbObj.GetConnection();
SqlCommand myCmd = new SqlCommand(strProcedure, myConn); myCmd.CommandType = CommandType.StoredProcedure;
//执行存储过程 myConn.Open(); try {
myCmd.ExecuteNonQuery();
SqlDataAdapter dap = new SqlDataAdapter(myCmd); DataSet ds = new DataSet(); dap.Fill(ds, Proc_tb_Edit);
myCmd.Dispose(); myConn.Close(); return ds; }
catch (Exception Erro) {
throw Erro; } } else {
return returnValue; }
} 绑定
protected int showaboutUs(int aboutUsID, string serchAdminSession)
- 3 -
存储过程的使用
{
int returnValue = -1;
DataSet ds = myObj.DO_dsGetInforByID(serchAdminSession, aboutUsID, \"tb_str_LS_Table\", \"Proc_Get_AboutUsInfoByID\", \"@aboutUsID\");
this.aboutUSType.Value = ds.Tables[\"tb_str_LS_Table\"].Rows[0][1].ToString();
删除信息:
#region 根据ID值删除某条指定ID的信息,使用存储过程 ///
/// 网站session的值 /// 要删除的信息的ID值
/// 要删除的信息的存储过程名称
/// 存储过程参数名称,为某条信息的ID值参数 ///
public int Delete_intInfor(string stradminSession, int int_DelID, string Proc_tb_Del, string str_ProcID) {
int returnValue = -1;
if (stradminSession == \"\" || stradminSession == null) {
return returnValue; } else {
SqlConnection myConn = dbObj.GetConnection();
SqlCommand myCmd = new SqlCommand(Proc_tb_Del, myConn); myCmd.CommandType = CommandType.StoredProcedure;
SqlParameter sp_DelID = new SqlParameter(str_ProcID, SqlDbType.Int); sp_DelID.Value = int_DelID; myCmd.Parameters.Add(sp_DelID);
myConn.Open(); try {
returnValue = myCmd.ExecuteNonQuery(); return returnValue; }
catch (Exception Erro) {
throw Erro; }
- 4 -
存储过程的使用
finally {
myCmd.Dispose(); myConn.Close(); } } }
#endregion
显示信息列表:
CREATE proc [dbo].[Proc_Get_AboutUsInfo] as
SELECT aboutUsID,aboutUsType,aboutUsTitle FROM [dbo].[tb_AboutUS] order by aboutUsID desc
根据ID显示某条信息:
#region 根据ID获取指定新闻信息,使用存储过程,返回一个DataSet数据集 ///
/// 获取指定信息的数据集 ///
/// 后台登陆用户 /// 指定信息的ID /// 信息临时表 /// 存储过程名称
/// 存储过程参数名称,为某条信息的ID值参数 ///
public DataSet DO_dsGetInforByID(string strSqlAdminSession, int int_DoID, string P_Str_srcTable, string Proc_tb_GetByID, string str_ProcID) {
DataSet returnValue = new DataSet();
returnValue = null;//将返回值的初始值设置为空
if (strSqlAdminSession == \"\" || strSqlAdminSession == null) {
return returnValue; } else {
SqlConnection MyConn = dbObj.GetConnection();
SqlCommand MyCmd = new SqlCommand(Proc_tb_GetByID, MyConn); MyCmd.CommandType = CommandType.StoredProcedure;
//添加参数newsID
SqlParameter spDoID = new SqlParameter(str_ProcID, SqlDbType.Int); spDoID.Value = int_DoID;
- 5 -
存储过程的使用
MyCmd.Parameters.Add(spDoID);
MyConn.Open(); try {
MyCmd.ExecuteNonQuery();
SqlDataAdapter da = new SqlDataAdapter(MyCmd); DataSet ds = new DataSet(); da.Fill(ds, P_Str_srcTable); return ds; }
catch (Exception Erro) {
throw Erro; } finally {
MyCmd.Dispose(); MyConn.Close(); } } }
#endregion
调试:
在VS中调试
在SQL Server中执行存储过程
sql语句执行的时候要先编译,然后执行。存储过程就是编译好了的一些sql语句。用的时候直接就可以用了。
在SQL Server的查询分析器中,输入以下代码: declare @tot_amt int
execute order_tot_amt 1,@tot_amt output select @tot_amt
以上代码是执行order_tot_amt这一存储过程,以计算出定单编号为1的定单销售金额,我们定义@tot_amt为输出参数,用来承接我们所要的结果。
- 6 -
因篇幅问题不能全部显示,请点此查看更多更全内容