黑马程序员技术交流社区

标题: 存储过程的好处 [打印本页]

作者: iamheima    时间: 2012-9-15 13:30
标题: 存储过程的好处
存储过程是使用SQL语言和流程控制语句编写的模块,存储过程经编译和优化存储在数据库服务器端的数据库中,使用时调用即可,存储过程有许多优点:已编译性使得它的运行速度更快、简化了程序逻辑、间接的安全控制功能等。
1.     存储过程的创建
  1. CREATE PROCEDURE Procedure_Name
  2. --参数列表
  3. AS
  4. BEGIN
  5. --执行语句
  6. END
  7. GO
复制代码
2.非存储过程的数据操作(以插入为例)
  1. private void btnInsert_Click(object sender, EventArgs e)
  2.         {
  3.             string strConn = ConfigurationManager.ConnectionStrings["myConnString"].ConnectionString;

  4.             SqlConnection conn = new SqlConnection(strConn);
  5.             
  6.             SqlCommand cmd = conn.CreateCommand();
  7.             cmd.CommandText = "INSERT INTO dbo.T_Admins(UserName,Password) VALUES(@username,@password)";
  8.             cmd.Parameters.AddRange(new SqlParameter[]{
  9.                 new SqlParameter("username",txtUserName.Text.Trim()),
  10.                 new SqlParameter("password",txtPassword.Text.Trim())
  11.             });

  12.             conn.Open();
  13.             int line = cmd.ExecuteNonQuery();
  14.             if (line == 1)
  15.             {
  16.                 MessageBox.Show("插入成功!");
  17.             }
  18.         }
复制代码
注:只是为了作为演示,并未考虑链接的关闭、资源的释放和异常处理。
3.存储过程的数据操作
创建存储过程:
  1. CREATE PROCEDURE msp_InsertIntoAdmins
  2. (
  3.         @username nvarchar(50),
  4.         @password nvarchar(50)
  5. )
  6. AS
  7. BEGIN
  8.         INSERT INTO dbo.T_Admins(UserName,[Password]) VALUES(@username,@password)
  9. END
  10. GO
复制代码
应用程序:
  1. private void btnInsert_Click(object sender, EventArgs e)
  2.         {
  3.             string strConn = ConfigurationManager.ConnectionStrings["myConnString"].ConnectionString;

  4.             SqlConnection conn = new SqlConnection(strConn);
  5.             
  6.             SqlCommand cmd = conn.CreateCommand();
  7.             cmd.CommandText = "msp_InsertIntoAdmins";
  8.             cmd.CommandType = CommandType.StoredProcedure;
  9.             cmd.Parameters.AddRange(new SqlParameter[]{
  10.                 new SqlParameter("username",txtUserName.Text.Trim()),
  11.                 new SqlParameter("password",txtPassword.Text.Trim())
  12.             });

  13.             conn.Open();
  14.             int line = cmd.ExecuteNonQuery();
  15.             if (line == 1)
  16.             {
  17.                 MessageBox.Show("插入成功!");
  18.             }
  19.         }
复制代码
可以看到使用存储过程的程序只有两处不同:
  1. cmd.CommandText = "msp_InsertIntoAdmins";
  2. cmd.CommandType = CommandType.StoredProcedure;
复制代码
Command对象的CommandText属性不再是SQL语句而是存储过程的名字,CommandType属性改为了StoredProcedure(默认为Text)
这里唯一可见的好处是,我们不用再将复杂的SQL语句写在程序代码中了,但是这并没有完全体现存储过程的使用在应用程序的编写中带来的好处,这需要一个复杂点的例子。
假如现在我们有三张表:图书信息表、借阅记录表和还书记录表,现在要删除图书信息表中的某条记录,我们知道有外键约束的条件下要想删除图书信息,必须先将该图书在借阅信息表和还书信息表中的数据进行删除,那我们就不得不在程序中执行三次Command命令,可以想象那是多么繁琐的事情!
而如果用到了存储过程,只需要将删除逻辑写在数据库服务器端中,使用时直接调用存储过程就可以了。
以上是小弟对存储过程的一点认识,有错误的地方希望大家指正。




作者: 许庭洲    时间: 2012-9-16 13:47
好资料,值得学习ing!




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2