zoukankan      html  css  js  c++  java
  • 如何调用存储过程,有返回值的,有参数的,存储过程中调用存储过程。(MS SQL Server)

    存储过程return与output区别
    共同点:都返回值(但return只能返回int类型)   
    不同点:
    1.output是定义变量是不是可以返回值   
    2.output没有return从查询或过程中无条件退出的工功   
    3.return返回值在函数和过程定义时不需要用output来定义

    我想用存储过程,是一个查询的存储过程. 把查询的记录返回.net里我接收这个返回的记录集. 怎么弄呀?
    ------------------------------
    (1)执行一个没有参数的存储过程的代码如下:
    SqlConnection conn=new SqlConnection(“connectionString”);
    SqlDataAdapter da = new SqlDataAdapter();
    da.selectCommand = new SqlCommand();
    da.selectCommand.Connection = conn;
    da.selectCommand.CommandText = "NameOfProcedure";
    da.selectCommand.CommandType = CommandType.StoredProcedure;

    (2)执行一个有参数的存储过程的代码如下
    SqlConnection conn=new SqlConnection(“connectionString”);
    SqlDataAdapter da = new SqlDataAdapter();
    da.selectCommand = new SqlCommand();
    da.selectCommand.Connection = conn;
    da.selectCommand.CommandText = "NameOfProcedure";
    da.selectCommand.CommandType = CommandType.StoredProcedure;
    param = new SqlParameter("@ParameterName", SqlDbType.DateTime);
    param.Direction = ParameterDirection.Input;
    param.Value = Convert.ToDateTime(inputdate);
    da.selectCommand.Parameters.Add(param);

    若需要添加输出参数:
    param = new SqlParameter("@ParameterName", SqlDbType.DateTime);
    param.Direction = ParameterDirection.Output; '输出参数
    param.Value = Convert.ToDateTime(inputdate);
    da.selectCommand.Parameters.Add(param);

    若要获得参储过程的返回值:
    param = new SqlParameter("@ParameterName", SqlDbType.DateTime);
    param.Direction = ParameterDirection.ReturnValue; '返回值:
    param.Value = Convert.ToDateTime(inputdate);
    da.selectCommand.Parameters.Add(param);

    =================

    在asp.net中调用存储过程代码:
            int i = 2;
            string ConnStr = "server=.;database=doc;uid=sa;pwd=admin;";
            SqlConnection conn = new SqlConnection(ConnStr);
            SqlCommand comm = new SqlCommand("proc_stu", conn);        //建立一个命令
            comm.CommandType = CommandType.StoredProcedure;          //说明执行的是一个存储过程

            comm.Parameters.Add(new SqlParameter("@sname", SqlDbType.Char, 20));    //定义一个存储过程变量
            comm.Parameters["@sname"].Value = "admin";          //给存储过程变量赋值

            comm.Parameters.Add(new SqlParameter("@pwd", SqlDbType.Char, 20));    //定义一个存储过程变量
            comm.Parameters["@pwd"].Value = "admin";

            comm.Connection.Open();                //打开连接

            try
            {
               i= (int)comm.ExecuteScalar();               // ExecuteScalar:返回第一行第一列值       
            }
            catch (SqlException er)
            {
                Response.Write(er.ToString());             //向上一级抛异常
            }
            finally
            {
                comm.Connection.Close();
                conn.Close();
            }
            Response.Write(i.ToString());

    例2:

    存储过程既可以在查询分析器中编写,也可以在企业管理器中编写。最重要是学会其语法。SQL Sever 联机帮助中有详细的说明。下面的存储过程实现用户验证的功能,如果不成功,返回0,成功则返回1.

    CREATE PROCEDURE VALIDATE @USERNAME CHAR(20),@PASSWORD CHAR(20),@LEGAL BIT OUTPUT
    AS

    IF EXISTS(SELECT * FROM REN WHERE SNAME = @USERNAME AND PWD = @PASSWORD)
    SELECT @LEGAL = 1
    ELSE
    SELECT @LEGAL = 0

    在程序中调用该存储过程,并根据@LEGAL参数的值判断用户是否合法。

    .net 中显示返回值主要代码
    comm.Parameters.Add("@LEGAL", 0);
    comm.Parameters["@LEGAL"].Direction = ParameterDirection.Output;
    comm.ExecuteNonQuery();    //ExecuteNonQuery:返回影响的行数
    i = (int)comm.Parameters["@LEGAL"].Value;  
    Response.Write(i.ToString());

    ===============================

      两种不同的存储过程调用方法

      为了突出新方法的优点,首先介绍一下在.NET中调用存储过程的“官方”方法。另外,本文的所有示例程序均工作于SqlServer数据库上,其它情况类似,以后不再一一说明。本文所有例子均采用C#语言。

      要在应用程序中访问数据库,一般性的步骤是:首先声明一个数据库连接SqlConnection,然后声明一个数据库命令SqlCommand,用来执行SQL语句和存储过程。有了这两个对象后,就可以根据自己的需要采用不同的执行方式达到目的。需要补充的是,不要忘记在页面上添加如下的引用语句:using System.Data.SqlClient。

      就执行存储过程来说,如果执行的是第一类存储过程,那么就要用一个DataAdapter将结果填充到一个DataSet中,然后就可以使用数据网格控件将结果呈现在页面上了;如果执行的是第二和第三种存储过程,则不需要此过程,只需要根据特定的返回判定操作是否成功完成即可。

    (1)执行一个没有参数的存储过程的代码如下:
    SqlConnection conn=new SqlConnection(“connectionString”);
    SqlDataAdapter da = new SqlDataAdapter();
    da.SelectCommand = new SqlCommand();
    da.SelectCommand.Connection = conn;
    da.SelectCommand.CommandText = "NameOfProcedure";
    da.SelectCommand.CommandType = CommandType.StoredProcedure;
    然后只要选择适当的方式执行此处过程,用于不同的目的即可。

    (2)执行一个有参数的存储过程的代码如下(我们可以将调用存储过程的函数声明为ExeProcedure(string inputdate)):
    SqlConnection conn=new SqlConnection(“connectionString”);
    SqlDataAdapter da = new SqlDataAdapter();
    da.SelectCommand = new SqlCommand();
    da.SelectCommand.Connection = conn;
    da.SelectCommand.CommandText = "NameOfProcedure";
    da.SelectCommand.CommandType = CommandType.StoredProcedure;
    (以上代码相同,以下为要添加的代码)
    param = new SqlParameter("@ParameterName", SqlDbType.DateTime);
    param.Direction = ParameterDirection.Input;
    param.Value = Convert.ToDateTime(inputdate);
    da.SelectCommand.Parameters.Add(param);
    这样就添加了一个输入参数。若需要添加输出参数:

    param = new SqlParameter("@ParameterName", SqlDbType.DateTime);
    param.Direction = ParameterDirection.Output;
    param.Value = Convert.ToDateTime(inputdate);
    da.SelectCommand.Parameters.Add(param);
    若要获得参储过程的返回值:

    param = new SqlParameter("@ParameterName", SqlDbType.DateTime);
    param.Direction = ParameterDirection.ReturnValue;
    param.Value = Convert.ToDateTime(inputdate);
    da.SelectCommand.Parameters.Add(param);

      从上面的代码我们可以看出,当存储过程比较多或者存储过程的参数比较多时,这种方法会大大影响开发的速度;另外一方面,如果项目比较大,那么这些用于数据库逻辑的函数在以后的维护中也是一个很大的负担。那么,有没有一种改进的方法可以解决这个问题呢?想到在执行没有参数的存储过程时只需要传入一个存储过程的名字就可以调用相应的存储过程,而且在SqlServer数据库中我们可以直接在查询分析器中敲入“存储过程名(参数列表)”样的字符串就可以执行存储过程,那么,是否可以把这种思想应用到应用程序中呢?

      于是在编译器中键入相应代码。这些代码是在调用不带参数的存储过程的代码的基础上改的。具体代码如下:

    SqlConnection conn=new SqlConnection(“connectionString”);
    SqlDataAdapter da = new SqlDataAdapter();
    da.SelectCommand = new SqlCommand();
    da.SelectCommand.Connection = conn;
    da.SelectCommand.CommandText = "NameOfProcedure(’para1’,’para2’,para3)";
    da.SelectCommand.CommandType = CommandType.StoredProcedure;
      为了使代码更具有代表性,要调用的存储过程的第一个和第二个参数都为字符串类型,第三个参数为整型。执行以后发现,完全可以达到预期的效果!

      两种调用方法的比较
      
      通过比较我们可以看到,第二种方法具有一个很明显的优点,那就是可以提高开发速度,节省开发时间,而且代码容易维护,在一定程度上也减少了系统大小。但是,由于对存储过程参数的处理比较笼统,如果要获取输出参数或者得到存储过程的返回值,这种方法就不能满足需要了。虽然如此,但是,这种方法毕竟可以让开发人员少些很大一部分的代码。如果不需要获取输出参数和返回值,那么几乎可以做到“一劳永逸”。因此在实际的程序开发中,这种方法还是具有一定的实用价值的。

    =================

    Public Shared Function kwkj_user_serverInRole_addrole(ByVal username As String, ByVal rolename As String, ByVal serveronid As Integer, ByVal yearnum As Integer) As Integer
            Using connection As New SqlConnection(ConfigurationManager.ConnectionStrings("LocalSqlServer").ConnectionString)
                Using command As New SqlCommand("kwkj_user_ServerInRole_addrole1", connection)
                    command.CommandType = CommandType.StoredProcedure
                    Dim p As SqlParameter = command.Parameters.Add("@Return_Value", SqlDbType.Int)        '标准参数的写法
                    p.Direction = ParameterDirection.ReturnValue' 定义参数的传输类型是returnvalue
                    command.Parameters.Add(New SqlParameter("@username", username))
                    command.Parameters.Add(New SqlParameter("@rolename", rolename))
                    command.Parameters.Add(New SqlParameter("@serveronid", serveronid))
                    command.Parameters.Add(New SqlParameter("@yearnum", yearnum))
                    Dim list As Integer
                    Try
                        connection.Open()
                        command.ExecuteNonQuery()
                        list = CInt(p.Value) '取得存储过程的返回值
                    Catch ex As Exception
                    Finally
                        connection.Close()
                    End Try
                    Return list   '返回值

                End Using
            End Using
        End Function
    ========================
    返回存储过程OUTPUT参复和RETURN返回值的原代码

    ---------------------------------
    ALTER PROCEDURE sp_2
    @p int output,
    @p1 int,
    @p2 int
    as
    set @p = @p1+@p2
    return 99
    ---------------------------------

    http://www.86oo.com/提供各类教程

    Function returnP()

        Dim cmd As New ADODB.Command
        Set cmd.ActiveConnection = CurrentProject.Connection

        mailto:%20@return_value"这个参数在输入参数的最前面,名称是固定的
    cmd.Parameters.Append cmd.CreateParameter("@return_value", adInteger, adParamReturnValue)

    '输入和输出的参数顺序同存储过程的参数顺序
        cmd.Parameters.Append cmd.CreateParameter("@p", adInteger, adParamOutput)   
        cmd.Parameters.Append cmd.CreateParameter("@p1", adInteger, adParamInput,,1)
        cmd.Parameters.Append cmd.CreateParameter("@p2", adInteger, adParamInput,,2)
        cmd.CommandText = "sp_2"
        cmd.CommandType = adCmdStoredProc
        cmd.Execute
        Dim i As Integer
        For i = 0 To cmd.Parameters.Count - 1
            Debug.Print cmd.Parameters(i).Name & "=" & cmd.Parameters(i).Value
        Next i

    Set cmd.ActiveConnection = Nothing
    Set cmd = Nothing
    End Function

    '----------测试---------

    ? returnP()
    @return_value=99
    @p=3
    @p2=2
    @p1=1
    ============================

    如何在存储过程中调用存储过程?大家给个例子?
    ======
    create   proc   kk  
    as  
    begin  
    exec   jj     --jj为存储过程名  
    end    
    =======
    create   table   test(id   int,name   varchar(10))  
    insert   into   test   select   1,'AAAA'  
    insert   into   test   select   2,'BBBB'  
    go      
    create   procedure   sp_test1(@count   int   output)  
    as  
              select   @count=count(*)   from   test  
    go      
    create   procedure   sp_test2  
    as  
    begin  
              declare   @count   int  
              exec   sp_test1   @count   output    
              select   @count  
    end  
    go   
    exec   sp_test2  
    go   
    --输出结果  
    /*  
    2  
    */  
       
    drop   procedure   sp_test2,sp_test1  
    drop   table   test  
    go
    ---------------------
    1,存储过程

    create proc dbo.SPd_test
    as
    begin
    return 2;
    end

    2,得到return 的值

    DECLARE @RC int
    EXEC @RC = [eppoo].[dbo].[SPd_test]
    DECLARE @PrnLine nvarchar(4000)
    PRINT ''''存储过程: eppoo.dbo.SPd_test''''
    SELECT @PrnLine = '''' 返回代码 = '''' + CONVERT(nvarchar, @RC)
    PRINT @PrnLine
    ------------

  • 相关阅读:
    深入理解JS中的变量及变量作用域
    浏览器加载、解析、渲染的过程
    gerrit和git
    宽高等比缩放
    常见的网站性能优化手段
    JS实现数组去重(重复的元素只保留一个)
    重构与回流
    APP开放接口API安全性——Token令牌Sign签名的设计与实现
    索引原理-btree索引与hash索引的区别
    从四个维度谈谈如何做好团队管理
  • 原文地址:https://www.cnblogs.com/yhb199/p/1233148.html
Copyright © 2011-2022 走看看