[转] ADO.NET调用存储过程带输出参数或返回值

CREATE PROCEDURE [dbo].[GetNameById]  
     @studentid varchar(8),  
     @studentname nvarchar(50) OUTPUT  
    AS  
    BEGIN  
     SELECT @studentname=studentname FROM student  
        WHERE studentid=@studentid  
     if @@Error<>0  
      RETURN -1  
     else   
      RETURN 0   
    END  
      
      
    using (SqlConnection conn = new SqlConnection(connStr))  
    {  
        try  
        {  
            SqlCommand cmd = new SqlCommand("GetNameById", conn);  
            cmd.CommandType = CommandType.StoredProcedure;  
            cmd.Parameters.AddWithValue("@studentid", "09888888");  //给输入参数赋值  
            SqlParameter parOutput =cmd.Parameters.Add("@studentname", SqlDbType.NVarChar, 50);  //定义输出参数  
            parOutput.Direction = ParameterDirection.Output;  //参数类型为Output  
            SqlParameter parReturn = new SqlParameter("@return", SqlDbType.Int);  
            parReturn.Direction = ParameterDirection.ReturnValue;   //参数类型为ReturnValue                     
            cmd.Parameters.Add(parReturn);  
            conn.Open();  
            cmd.ExecuteNonQuery();  
            MessageBox.Show(parOutput.Value.ToString());   //显示输出参数的值  
            MessageBox.Show(parReturn.Value.ToString());  //显示返回值  
        }  
        catch (System.Exception ex)  
        {  
            MessageBox.Show(ex.Message);  
        }  
    }  
      
      
    Create PROCEDURE AddOrderTran  
        @country nvarchar(100),  
        @adds nvarchar(100),  
        @ynames nvarchar(100),  
        @pids nvarchar(100),  
        @cellp nvarchar(100),  
        @cphone nvarchar(100),  
        @amounts nvarchar(100),  
        @cartnumber nvarchar(100)  
    as  
        Declare @id int  
        BEGIN TRANSACTION     
            insert into Orders(Order_Country,Order_Adress,Order_UserName,Order_PostID,Cells,Order_Phone,Total_pay,CartNumber,IsPay)   
                values (@country,@adds,@ynames,@pids,@cellp,@cphone,@amounts,@cartnumber,'0')  
            Select @id=@@identity  
            insert into Orders_Item (OrderNumber,ProductsID,Products_Color,Products_Price,Order_Qty,Item_Total)   
                select  @id,Carts_Item.ProductsID,Carts_Item.Products_Color,Carts_Item.Products_Price,Carts_Item.Item_Qty,Carts_Item.Total_Pay   
                from Carts_Item where Carts_Item.CartNumber=@cartnumber     
            delete Carts_Item where CartNumber=@cartnumber  
            IF @@error <> 0  --发生错误  
            BEGIN  
                ROLLBACK TRANSACTION  
                RETURN 0  
            END  
            ELSE  
            BEGIN  
                COMMIT TRANSACTION  
                RETURN @id    --执行成功  
        END  
     
     
     
            #region 执行存储过程  
      
            SqlParameter[] param = new SqlParameter[]     
              {     
                  new SqlParameter("@country",country),    
                  new SqlParameter("@adds",adds),     
                  new SqlParameter("@ynames",ynames),     
                  new SqlParameter("@pids", pids),     
                  new SqlParameter("@cellp",cellp),    
                  new SqlParameter("@cphone", cphone),  
                  new SqlParameter("@amounts",amounts),  
                  new SqlParameter("@cartnumber",cartnumber),  
                  new SqlParameter("@return",SqlDbType.Int)  
              };  
            param[8].Direction = ParameterDirection.ReturnValue;  
            MSCL.SqlHelper.RunProcedure("AddOrderTran", param);  
            object obj = param[8].Value; //接受返回值  
      
      
            //string connStr = System.Configuration.ConfigurationManager.AppSettings["ConStr"].ToString();  
            //using (SqlConnection conn = new SqlConnection(connStr))  
            //{  
            //    conn.Open();  
            //    SqlCommand cmd = new SqlCommand("AddOrderTran", conn);  
            //    cmd.CommandType = CommandType.StoredProcedure;  
      
            //    SqlParameter para1 = new SqlParameter("@country", country);  
            //    para1.Direction = ParameterDirection.Input;  //参数方向 为输入参数  
            //    cmd.Parameters.Add(para1);  
      
            //    SqlParameter para2 = new SqlParameter("@adds", adds);  
            //    para2.Direction = ParameterDirection.Input;  
            //    cmd.Parameters.Add(para2);  
      
            //    SqlParameter para3 = new SqlParameter("@ynames", ynames);  
            //    para3.Direction = ParameterDirection.Input;  
            //    cmd.Parameters.Add(para3);  
      
            //    SqlParameter para4 = new SqlParameter("@pids", pids);  
            //    para4.Direction = ParameterDirection.Input;  
            //    cmd.Parameters.Add(para4);  
      
            //    SqlParameter para5 = new SqlParameter("@cellp", cellp);  
            //    para5.Direction = ParameterDirection.Input;  
            //    cmd.Parameters.Add(para5);  
      
            //    SqlParameter para6 = new SqlParameter("@cphone", cphone);  
            //    para6.Direction = ParameterDirection.Input;  
            //    cmd.Parameters.Add(para6);  
      
            //    SqlParameter para7 = new SqlParameter("@amounts", amounts);  
            //    para7.Direction = ParameterDirection.Input;  
            //    cmd.Parameters.Add(para7);  
      
            //    SqlParameter para8 = new SqlParameter("@cartnumber", cartnumber);  
            //    para8.Direction = ParameterDirection.Input;  
            //    cmd.Parameters.Add(para8);  
      
            //    SqlParameter paraReturn = new SqlParameter("@return", SqlDbType.Int);  
            //    paraReturn.Direction = ParameterDirection.ReturnValue;  //参数方向 为返回参数  
            //    cmd.Parameters.Add(paraReturn);  
      
            //    cmd.ExecuteNonQuery();  
      
            //    object obj = paraReturn;  
            //    if (obj.ToString() == "0")  
            //    {  
            //        //存储过程执行失败  
            //    }  
            //    else  
            //    {  
            //        //成功  
            //    }  
            //}  
            //#endregion  
      
      
      
    本文的数据库用的是sql server自带数据Northwind   
       
    1.只返回单一记录集的存储过程  
      
    SqlConnection sqlconn = new SqlConnection(conn);  
    SqlCommand cmd = new SqlCommand();  
    // 设置sql连接  
    cmd.Connection = sqlconn;  
    // 如果执行语句  
    cmd.CommandText = "Categoriestest1";  
    // 指定执行语句为存储过程  
    cmd.CommandType = CommandType.StoredProcedure;  
      
    SqlDataAdapter dp = new SqlDataAdapter(cmd);  
    DataSet ds = new DataSet();  
    // 填充dataset  
    dp.Fill(ds);  
    // 以下是显示效果  
    GridView1.DataSource = ds;  
    GridView1.DataBind();  
      
       
      
    存储过程Categoriestest1  
    CREATE PROCEDURE Categoriestest1   
     AS  
     select *   
     from  Categories  
     GO  
      
      
      
    2. 没有输入输出的存储过程  
    SqlConnection sqlconn = new SqlConnection(conn);  
    SqlCommand cmd = new SqlCommand();  
      
    cmd.Connection = sqlconn;  
    cmd.CommandText = "Categoriestest2";  
    cmd.CommandType = CommandType.StoredProcedure;  
    sqlconn.Open();  
    // 执行并显示影响行数  
    Label1.Text = cmd.ExecuteNonQuery().ToString();  
    sqlconn.Close();  
      
      
    存储过程Categoriestest2  
      
    CREATE PROCEDURE Categoriestest2  AS  
     insert into dbo.Categories   
     (CategoryName,[Description],[Picture])  
     values ('test1','test1',null)  
     GO  
      
       
      
    3. 有返回值的存储过程  
    SqlConnection sqlconn = new SqlConnection(conn);  
             SqlCommand cmd = new SqlCommand();  
             cmd.Connection = sqlconn;  
             cmd.CommandText = "Categoriestest3";  
             cmd.CommandType = CommandType.StoredProcedure;  
             // 创建参数  
            IDataParameter[] parameters = {  
                     new SqlParameter("rval", SqlDbType.Int,4)  
                 };  
             // 将参数类型设置为 返回值类型  
            parameters[0].Direction = ParameterDirection.ReturnValue;  
             // 添加参数  
            cmd.Parameters.Add(parameters[0]);  
      
             sqlconn.Open();  
             // 执行存储过程并返回影响的行数  
            Label1.Text = cmd.ExecuteNonQuery().ToString();  
             sqlconn.Close();  
             // 显示影响的行数和返回值  
            Label1.Text += "-" + parameters[0].Value.ToString() ;  
      
      
    存储过程Categoriestest3  
      
    CREATE PROCEDURE Categoriestest3  
     AS  
     insert into dbo.Categories   
     (CategoryName,[Description],[Picture])  
     values ('test1','test1',null)  
    return @@rowcount  
     GO  
      
    4. 有输入参数和输出参数的存储过程  
      
     SqlConnection sqlconn = new SqlConnection(conn);  
             SqlCommand cmd = new SqlCommand();  
             cmd.Connection = sqlconn;  
             cmd.CommandText = "Categoriestest4";  
             cmd.CommandType = CommandType.StoredProcedure;  
             // 创建参数  
            IDataParameter[] parameters = {  
                     new SqlParameter("@Id", SqlDbType.Int,4) ,  
                     new SqlParameter("@CategoryName", SqlDbType.NVarChar,15) ,  
                 };  
             // 设置参数类型  
            parameters[0].Direction = ParameterDirection.Output;  // 设置为输出参数  
            parameters[1].Value = "testCategoryName";  
             // 添加参数  
            cmd.Parameters.Add(parameters[0]);  
             cmd.Parameters.Add(parameters[1]);  
      
             sqlconn.Open();  
             // 执行存储过程并返回影响的行数  
            Label1.Text = cmd.ExecuteNonQuery().ToString();  
             sqlconn.Close();  
             // 显示影响的行数和输出参数  
            Label1.Text += "-" + parameters[0].Value.ToString() ;  
      
    存储过程Categoriestest4        
      
    CREATE PROCEDURE Categoriestest4  
     @id int output,  
     @CategoryName nvarchar(15)  
     AS  
     insert into dbo.Categories   
     (CategoryName,[Description],[Picture])  
     values (@CategoryName,'test1',null)  
    set  @id = @@IDENTITY  
     GO  
      
       
      
    5. 同时具有返回值、输入参数、输出参数的存储过程  
      
     SqlConnection sqlconn = new SqlConnection(conn);  
             SqlCommand cmd = new SqlCommand();  
             cmd.Connection = sqlconn;  
             cmd.CommandText = "Categoriestest5";  
             cmd.CommandType = CommandType.StoredProcedure;  
             // 创建参数  
            IDataParameter[] parameters = {  
                     new SqlParameter("@Id", SqlDbType.Int,4) ,  
                     new SqlParameter("@CategoryName", SqlDbType.NVarChar,15) ,  
                     new SqlParameter("rval", SqlDbType.Int,4)  
                 };  
             // 设置参数类型  
            parameters[0].Direction = ParameterDirection.Output;       // 设置为输出参数  
            parameters[1].Value = "testCategoryName";                  // 给输入参数赋值  
            parameters[2].Direction = ParameterDirection.ReturnValue;  // 设置为返回值  
            // 添加参数  
            cmd.Parameters.Add(parameters[0]);  
             cmd.Parameters.Add(parameters[1]);  
             cmd.Parameters.Add(parameters[2]);  
      
             sqlconn.Open();  
             // 执行存储过程并返回影响的行数  
            Label1.Text = cmd.ExecuteNonQuery().ToString();  
             sqlconn.Close();  
             // 显示影响的行数,输出参数和返回值  
            Label1.Text += "-" + parameters[0].Value.ToString() + "-" + parameters[2].Value.ToString();  
      
     存储过程Categoriestest5  
      
    CREATE PROCEDURE Categoriestest5  
     @id int output,  
     @CategoryName nvarchar(15)  
     AS  
     insert into dbo.Categories   
     (CategoryName,[Description],[Picture])  
     values (@CategoryName,'test1',null)  
    set  @id = @@IDENTITY  
    return @@rowcount  
     GO  
      
       
     6. 同时返回参数和记录集的存储过程  
        SqlConnection sqlconn = new SqlConnection(conn);  
        SqlCommand cmd = new SqlCommand();  
        cmd.Connection = sqlconn;  
        cmd.CommandText = "Categoriestest6";  
        cmd.CommandType = CommandType.StoredProcedure;  
             // 创建参数  
            IDataParameter[] parameters = {  
                     new SqlParameter("@Id", SqlDbType.Int,4) ,  
                     new SqlParameter("@CategoryName", SqlDbType.NVarChar,15) ,  
                     new SqlParameter("rval", SqlDbType.Int,4)                   // 返回值  
                };  
             // 设置参数类型  
        parameters[0].Direction = ParameterDirection.Output;        // 设置为输出参数  
        parameters[1].Value = "testCategoryName";                   // 给输入参数赋值  
        parameters[2].Direction = ParameterDirection.ReturnValue;   // 设置为返回值  
        // 添加参数  
        cmd.Parameters.Add(parameters[0]);  
        cmd.Parameters.Add(parameters[1]);  
        cmd.Parameters.Add(parameters[2]);  
      
        SqlDataAdapter dp = new SqlDataAdapter(cmd);  
        DataSet ds = new DataSet();  
        // 填充dataset  
        dp.Fill(ds);  
        // 显示结果集  
        GridView1.DataSource = ds.Tables[0];  
        GridView1.DataBind();  
      
        Label1.Text = "";  
        // 显示输出参数和返回值  
        Label1.Text +=  parameters[0].Value.ToString() + "-" + parameters[2].Value.ToString();  
      
    存储过程Categoriestest6  
      
    CREATE PROCEDURE Categoriestest6  
     @id int output,  
     @CategoryName nvarchar(15)  
     AS  
     insert into dbo.Categories   
     (CategoryName,[Description],[Picture])  
     values (@CategoryName,'test1',null)  
    set  @id = @@IDENTITY  
     select * from Categories  
    return @@rowcount  
     GO  
      
      
    7. 返回多个记录集的存储过程  
      
    SqlConnection sqlconn = new SqlConnection(conn);  
    SqlCommand cmd = new SqlCommand();  
      
    cmd.Connection = sqlconn;  
    cmd.CommandText = "Categoriestest7";  
    cmd.CommandType = CommandType.StoredProcedure;  
      
    SqlDataAdapter dp = new SqlDataAdapter(cmd);  
    DataSet ds = new DataSet();  
    // 填充dataset  
    dp.Fill(ds);  
    // 显示结果集1  
    GridView1.DataSource = ds.Tables[0];  
    GridView1.DataBind();  
    // 显示结果集2  
    GridView2.DataSource = ds.Tables[1];  
    GridView2.DataBind();  
      
       
    存储过程Categoriestest7  
      
    CREATE PROCEDURE Categoriestest7  
     AS  
     select * from Categories  
     select * from Categories  
     GO
原文地址:https://www.cnblogs.com/superfeeling/p/11651217.html