zoukankan      html  css  js  c++  java
  • TSQL 之 存储过程入门 yz

      当你还在使用拼接 T-SQL 语句让后通过 SqlCommand 执行它,是否感觉过的很麻烦?或许T-SQL语句很简单,也就花费不了多少时间。如果T-SQL语句长达5行以上你是否会感觉厌恶、频繁出错呢?而今天就让我们去学习一个可以大大减少我们在VS中拼写T-SQL语句的方法。就在是学习如何编写和使用存储过程。

      所要具备的条件:

    1.    学习过 ADO.NET
    2.    学习过 T-SQL 基本语句
    3.    使用NORTHWND数据库作为举例

      一、什么是存储过程

        很多权威的说法就是‘允许重复执行某个任何的SQL语句。只要创建某个过程一次,就可以在程序中多次重用它。这一稿了程序的可维护性,允许程序以统一、优化的方式访问数据库。’,当然我不知道大家有多少人可以完全的理解,所以这里我就是用比较简单的方式来说明(只是个人暂时的理解): 就是一种写好的T-SQL语句,但是却封装了这些T-SQL语句,跟函数一样,可以允许我们传入参数,返回参数(如果有记录集还是一样返回)。只是当我们使用的是查询语句时比一般的函数多返回一个记录集,其他的完全跟函数一样。

       优点:

    1.    在 SQL SERVER 中编写,提示更佳
    2.    在 SQL SERVER 中可以立即进行测试
    3.    因为 存储过程 存储在数据库中并经过优化,执行速度更快
    4.    大大节省我们在VS中编写T-SQL语句的时间

      缺点:

    1.    如果要修改,必须进入到数据库中修改
    2.    需要记住每个存储过程的调用名、参数、返回值以及功能

      什么技术都会有缺点和优点,除非你的功能很简单,否则选择使用存储过程优点还是很大的.我们可以单独写个各个存储过程的说明

     二、了解基本操作

    1. 如何声明一个无参数无返回值的存储过程
      View Code
      1 CREATE PROCEDURE sp_Select_All_Employees
      2 AS
      3      SELECT employeeid,firstname,lastname
      4      FROM Employees
      5      ORDER BY lastname , firstname

      各部分说明如下:

      CREATE PROCEDURE sp_Select_All_Employees
      
      
      /*
      
      创建一个名为 sp_Select_All_Employees 的存储过程
      
      */
      AS
          SELECT employeeid , firstname , lastname
          FROM employees
          ORDER BY lastname , firstname
      
      /*
         AS 后面为实现该存储过程的功能语句
      */
    2. 创建一个带有一个参数的存储过程
      View Code
       1 CREATE PROCEDURE sp_Orders_By_EmployeeId
       2        @employeeid int
       3 AS
       4      SELECT orderid , customerid
       5      FROM orders
       6      WHERE employeeid = @employeeid
       7 
       8 
       9 /*
      10     其中 @employeeid 为输入参数,且后面为该参数类型
      11 */
    3. 创建带有一个传入参数、返回值和输出参数的存储过程
      View Code
       1 CREATE PROCEDURE sp_Orders_By_EmployeeId2
       2        @employeeid int,
       3        @ordercount int = 0 output
       4 AS
       5     SELECT orderid,customerid
       6     FROM orders
       7     WHERE employeeid = @employeeid;
       8     SELECT @ordercount = count(*)
       9     FROM orders
      10     WHERE employeeid = @employeeid
      11     return @ordercount

      各部分说明如下:

      1 @ordercount int = 0 output
      2 --表示 @ordercount 变量为 int 类型,默认值为 0 且为输出参数
      3 
      4 return @ordercount
      5 --表示 @ordercount 为返回值
    4. 修改存储过程
      ALTER PROCEDURE --存储程序名称
         --改变的参数
      AS
          --改变后的T-SQL语句
    5. 查看存储过程
      execute sp_helptext --存储过程名称
    6. 重命名存储过程
      EXECUTE sp_rename --需要改的存储过程名称  --改后的存储过程名称
    7. 调用存储过程
      这个调用和一般的调用函数一样,只是需要在存储过程名称前加EXECUTE,其次没有括号
      类似如下:
    EXECUTE sp_Orders_By_EmployeeId2 2 @value


      三、在C#中使用存储过程

        1.调用 sp_Select_All_Employees

     1 SqlConnection con = new SqlConnection('/*数据库连接字符串*/');
     2 try
     3 {
     4       con.Open();
     5       SqlCommand cmd = con.CreateCommand();
     6       cmd.CommandType = CommandType.StoredProcedure;
     7       cmd.CommandText = "sp_Select_All_Employees";
     8       SqlDataReader reader = cmd.ExecuteReader();
     9      /*
    10           输出数据或者下断点看
    11      */
    12 }

        2.调用 sp_Orders_By_EmployeeId2
      

     1 SqlConnection con = new SqlConnection("/*数据库连接字符串*/");
     2 try
     3 {
     4      con.Open();
     5      SqlCommand cmd = con.CreateCommand();
     6      cmd.CommandType = CommandType.StoredProcedure;
     7      cmd.CommandText = "sp_Orders_By_EmployeeId2";
     8      SqlParameter inparm = cmd.Parameters.Add("@employeeid",SqlDbType.Int);
     9      inparm.Direction = ParameterDirection.Input;
    10      inparm.Value = 2;
    11      SqlParameter outparm = cmd.Parameters.Add(
    12      "@ordercount",SqlDbType.Int);
    13      outparm.Direction = ParameterDirection.Output;
    14      SqlParameter retval = cmd.Parameters.Add(
    15      "return_value",SqlDbType.Int);
    16      retval.Direction = ParameterDirection.ReturnValue;
    17      SqlDataReader reader = cmd.ExecuteReader(); 
    18      /*
    19         同上
    20      */
    21 }
  • 相关阅读:
    POJ 1300 Open Door
    POJ 2230 Watchcow
    codevs 1028 花店橱窗布置
    codevs 1021 玛丽卡
    codevs 1519 过路费
    codevs 3287 货车运输
    codevs 3305 水果姐逛水果街二
    codevs 1036 商务旅行
    codevs 4605 LCA
    POJ 1330 Nearest Common Ancestors
  • 原文地址:https://www.cnblogs.com/yaozhenfa/p/2851096.html
Copyright © 2011-2022 走看看