存储过程输出参数、返回值、返回表及C#调用

存储过程中可以定义输出变量,返回值,执行存储过程还能获得结果集。每个存储过程的默认返回值为0。下面紧接着上文 SQL Server中存储过程Stored Procedure创建及C#调用 基础上写的一个新的Stored Procedure存储过程则包含了输出参数、返回值以及select结果。

USE [db]
GO
/****** Object:  StoredProcedure [dbo].[insert_persions]    Script Date: 2/25/2015 11:14:11 AM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
IF OBJECT_ID (‘get_persons‘,‘p‘) IS NOT NULL
    DROP PROCEDURE get_persons;
GO
-- =============================================
-- Author:      <Author,,Name>
-- Create date: <Create Date,,>
-- Description: <Description,,>
-- =============================================
CREATE PROCEDURE get_persons
    -- Add the parameters for the stored procedure here
    @firstname varchar(255),
    @ret int = 0 OUTPUT
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    -- Insert statements for procedure here
    SELECT * FROM Persons
    WHERE FirstName = @firstname;
    SET @ret = @@ROWCOUNT
    RETURN 10
END
GO
DECLARE @retVal int, @status int
EXECUTE @status = get_persons "San",@ret = @retVal OUTPUT
SELECT @retVal as N‘Output val‘,@status as N‘Ruturn val‘

输出参数

输出参数的定义位置和存储过程的一般参数一样,只不过会在后面增加一个OUTPUT关键字。在过程体中然后给参数使用SET指定输出值。

执行包含输出参数得到过程体的SQL语句中,也需要先定义变量,再将变量作为参数传入执行语句中同时加上OUTPUT。如上例子所示:EXECUTE get_persons “San”,@ret = @retVal OUTPUT

返回值

存储过程一般会有默认的返回值为0,但是我们也可以在过程体要结束的位置或者某个分支块结束语句处加上RETURN VALUE语句。

执行过程体的时候,如果需要同时获取得到的返回值,可以先定义变量,再使用“变量=”放在EXECUTE后面从而获得执行结果值。例子就是:EXECUTE @status = get_persons “San”,@ret = @retVal OUTPUT

上述例子中的存储过程语句在SQL Server Management Studio执行完毕后,会每个select语句生成一个Table结果,如下图所示:

C#调用

上面例子中给出了SQL语句应对输出参数、返回值及SELECT表的情况。如果我们需要用C#来执行存储过程同时也希望得到所有的这些结果,可以按如下代码来:

            String conStr = @"Data Source=HOST\SQLEXPRESS;Initial Catalog=DB;Integrated Security=SSPI";
            SqlConnection con = new SqlConnection(conStr);
            try
            {
                con.Open();
                Console.WriteLine("Connect Sucess!");

                SqlCommand com = new SqlCommand();
                com.CommandType = System.Data.CommandType.StoredProcedure;
                com.Connection = con;
                com.CommandText = "get_persons";

                SqlParameter pFirstName = new SqlParameter("@firstname", "San");
                SqlParameter para = new SqlParameter("@ret", SqlDbType.Int);
                para.Direction = ParameterDirection.Output;
                com.Parameters.Add(pFirstName);
                com.Parameters.Add(para);
                com.Parameters.Add("@status", SqlDbType.Int);
                com.Parameters["@status"].Direction = ParameterDirection.ReturnValue;

                SqlDataReader sdr = com.ExecuteReader();
                while (sdr.Read())
                {
                    for (int i = 0; i < sdr.FieldCount; i++)
                        Console.Write(sdr[i].ToString() + " ");
                    Console.WriteLine();
                }
                sdr.Close();

                Console.WriteLine(com.Parameters["@ret"].Value);
                Console.WriteLine(com.Parameters["@status"].Value);
            }
            catch (Exception e)
            {
                Console.WriteLine(e.ToString());
            }
            finally
            {
                con.Close();
            }

从中我们可以看出,对于输出参数和返回值,都是增加与存储过程一样的参数名及类型,同时指定ParameterDirection,分别为OUTPUT和RETURNVALUE。而获取执行结果则可以再命令执行完毕后获取命令参数的值“com.Parameters[“@ret”].Value”。

对于无需获取SELECT结果的情况,我们可以直接用命令ExecuteNonQuery即可。可是如果我们还想得到存储过程执行所得到的表结果呢?这时候一个办法是利用“SqlDataReader sdr = com.ExecuteReader();”执行然后通过sdr.Read()来读取SELECT结果。这里需要注意的是,根据个人实践,sdr读完需要关系后才能够获取到返回参数及返回值。

时间: 2024-10-09 23:14:32

存储过程输出参数、返回值、返回表及C#调用的相关文章

PHP-------ajax返回值 返回JSON 数据

ajax返回值  返回JSON  数据 ajax返回值 有text   JSON ajax返回值  返回JSON  数据 1 <title>无标题文档</title> 2 <script src="../jquery-1.11.2.min.js"> 3 </script> 4 5 <!--ajax返回值 有text JSON--> 6 <!--ajax返回值 返回JSON 数据--> 7 8 9 10 11 <

Oracle存储过程 输出参数赋值异常:“Oracle.DataAccess.Types.OracleString”的类型初始值设定项引发异常。

场景: 写了一个有返回参数的存储过程,在个另开发人员机器上都正常.其它机器报如题错误.让人郁闷的是,所有调用方都是客户端,根本不存在网上众贴所说的版本不一致问题. 分析: 虽然网上的帖子没有根本解决问题,但还是给了些丝路.参数值类型问题.而且,我也把输出参数赋值语句注释后,也可以正常调用(只是结果没返回).尝试了将类型转为Oracle的OracleString,强制转clr的string,都不行. dicParaOut[kvp.Key] = (string)command.Parameters[

C#获取存储过程返回值和输出参数值的方法

//转自网络,先留个底 1.获取Return返回值 //存储过程 //Create PROCEDURE MYSQL // @a int, // @b int //AS // return @a + @b //GO SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["LocalSqlServer"].ToString()); conn.Open(); SqlCommand MyCom

C#获取存储过程的 Return返回值和Output输出参数值

一.不用SQLHelper.cs等帮助类 1.获取Return返回值 程序代码 存储过程Create PROCEDURE MYSQL  @a int,  @b intAS  return @a + @bGOSqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["LocalSqlServer"].ToString());conn.Open();SqlCommand MyCommand =

获取存储过程返回值及代码中获取返回值

获取存储过程返回值及代码中获取返回值 1.OUPUT参数返回值例: 向Order表插入一条记录,返回其标识 CREATE PROCEDURE [dbo].[nb_order_insert](@o_buyerid int ,@o_id bigint OUTPUT)ASBEGINSET NOCOUNT ON;BEGININSERT INTO [Order](o_buyerid )VALUES (@o_buyerid )SET @o_id = @@IDENTITYENDEND 存储过程中获得方法: D

利用SQLServer查询分析器获取存储过程的返回值,检查测试存储过程

1.存储过程没有返回值的情况(即存储过程语句中没有return之类的语句)用方法 int count = ExecuteNonQuery(..)执行存储过程其返回值只有两种情况(1)如果通过查询分析器执行该存储过程,在显示栏中如果有影响的行数,则影响几行count就是几(2)如果通过查询分析器执行该存储过程,在显示栏中如果显示'命令已成功完成.'则count = -1;在显示栏中如果有查询结果,则count = -1总结:A.ExecuteNonQuery()该方法只返回影响的行数,如果没有影响

Entity Framework 6 Recipes 2nd Edition(10-2)译 -&gt; 返回输出参数

10-2. 返回输出参数 问题 想获取存储过程里的一个或多个输出参数的值 解决方案 假设我们有一个像Figure 10-1所示的,出租车辆与租金收入的模型 Figure 10-1.出租车辆与租金收入的模型 我们想知道在指定日期里,收入了几笔租金和金额, 以及车辆的租凭情况. 存储过程Listing 10-7 就是获取这些信息的. Listing 10-7. A Stored Procedure for the Vehicles Rented, the Number of Rentals, and

SQL 存储过程返回值

1.  存储过程没有返回值的情况(即存储过程语句中没有return之类的语句)  用方法 int count = ExecuteNonQuery(..)执行存储过程其返回值只有两种情况  (1)假如通过查询分析器执行该存储过程,在显示栏中假如有影响的行数,则影响几行count就是几  (2)假如通过查询分析器执行该存储过程,在显示栏中假如显示'命令已成功完成.'则count = -1;在显示栏中假如有查询结果,则count = -1 总结:A.ExecuteNonQuery()该方法只返回影响的

SqlServer和MySQL中存储过程out返回值处理C#代码

1.SqlServer中out处理 C#代码 #region"SqlServer中存储过程处理out返回值" //public void getdata() //{ // string str = " server=192.168.xxxx ;user id=xxx;[email protected]#;database=xxxxx_db;min pool size=4;max pool size=4;packet size=3072"; // SqlConnect