C#调用存储过程详解

public static int ExecuteNonQuery(string connStr, string sql, CommandType type, params SqlParameter[] ps)
{
    using (SqlConnection conn = new SqlConnection(connStr))
    {
        using (SqlCommand cmd = new SqlCommand(sql, conn))
        {
            conn.Open();
            if (ps != null)
            {
                cmd.Parameters.AddRange(ps);
            }
            cmd.CommandType = type;
            return cmd.ExecuteNonQuery();
        }

    }
}


/// <summary>
/// 执行存储过程,或SQL语句,返回DataSet
/// </summary>
/// <param name="connStr">数据库连接字符串</param>
/// <param name="cmdText">SQL语句或存储过程名称</param>
/// <param name="ps">参数列表</param>
/// <returns>返回DataSet</returns>
public static DataSet GetDataSet(string connStr, string sql, CommandType type, params SqlParameter[] ps)
{
    DataSet ds = new DataSet();
    try
    {
        using (SqlDataAdapter sda = new SqlDataAdapter(cmdText, connStr))
        {
            if (ps != null)
            {
                sda.SelectCommand.Parameters.AddRange(ps);
            }
            sda.SelectCommand.CommandType = CommandType.StoredProcedure;
            sda.Fill(ds);
        }
        return ds;
    }
    catch (Exception ex)
    {
        ds.Dispose();
        throw (ex);
    }
}
CREATE PROCEDURE [存储过程名称]
 [@输入参数] 数据类型,
 [@输出参数] 数据类型 OUTPUT
AS
BEGIN
[给输出参数赋值]
END

例1:
CREATE PROCEDURE [dbo].[SP_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
例2:
Create PROCEDURE SP_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
//执行存储过程
string sql = @"[dbo].[SP_GetNameById]";
SqlParameter[] pars = {
    new SqlParameter("@studentid", SqlDbType.NVarChar,8),
    new SqlParameter("@studentname", SqlDbType.NVarChar, 50),
    new SqlParameter("@return",  SqlDbType.Int)
};
pars[0].Value = "stuid";// 给输入参数赋值
pars[1].Direction = ParameterDirection.Output; //参数类型为Output
pars[2].Direction = ParameterDirection.ReturnValue; //参数类型为ReturnValue
ExecuteNonQuery("数据库连接字符串", sql, CommandType.StoredProcedure, pars);

1、只返回单一数据集的存储过程

--存储过程SP_Categoriestest1
CREATE PROCEDURE SP_Categoriestest1
 AS
 select *
 from Categories
 GO
DataSet ds = GetDataSet("数据库连接字符串", sql, CommandType.StoredProcedure);

2、 没有输入输出的存储过程

--存储过程SP_Categoriestest2
CREATE PROCEDURE SP_Categoriestest2 
AS
 insert into dbo.Categories
 (CategoryName,[Description],[Picture])
 values ('test1','test1',null)
 GO
ExecuteNonQuery("数据库连接字符串", sql, CommandType.StoredProcedure);

3、有返回值的存储过程

--存储过程SP_Categoriestest3
CREATE PROCEDURE SP_Categoriestest3
 AS
 insert into dbo.Categories
 (CategoryName,[Description],[Picture])
 values ('test1','test1',null)
return @@rowcount
 GO
//执行存储过程
string sql = @"SP_Categoriestest3";
SqlParameter[] pars = {
    new SqlParameter("@return",  SqlDbType.Int,4)
};
pars[0].Direction = ParameterDirection.ReturnValue; //参数类型为ReturnValue
ExecuteNonQuery("数据库连接字符串", sql, CommandType.StoredProcedure, pars);

4、有输入参数和输出参数的存储过程

--存储过程SP_Categoriestest4
CREATE PROCEDURE SP_Categoriestest4
 @id int output,
 @CategoryName nvarchar(15)
 AS
 insert into dbo.Categories
 (CategoryName,[Description],[Picture])
 values (@CategoryName,'test1',null)
set @id = @@IDENTITY
 GO
//执行存储过程
string sql = @"SP_Categoriestest4";
SqlParameter[] pars = {
    new SqlParameter("@id", SqlDbType.Int),
    new SqlParameter("@CategoryName", SqlDbType.NVarChar, 50)
};
pars[0].Direction = ParameterDirection.Output;//参数类型为Output
pars[1].Value = "CategoryName"; // 给输入参数赋值
ExecuteNonQuery("数据库连接字符串", sql, CommandType.StoredProcedure, pars);

5、 同时具有返回值、输入参数、输出参数的存储过程

--存储过程SP_Categoriestest5
CREATE PROCEDURE SP_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
//执行存储过程
string sql = @"SP_Categoriestest5";
SqlParameter[] pars = {
    new SqlParameter("@id", SqlDbType.Int),
    new SqlParameter("@CategoryName", SqlDbType.NVarChar, 50),
    new SqlParameter("rval", SqlDbType.Int,4)
};
pars[0].Direction = ParameterDirection.Output;//参数类型为Output
pars[1].Value = "CategoryName"; // 给输入参数赋值
pars[2].Direction = ParameterDirection.ReturnValue;//参数类型为Output
ExecuteNonQuery("数据库连接字符串", sql, CommandType.StoredProcedure, pars);

6、同时返回参数和记录集的存储过程

--存储过程SP_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
//执行存储过程
string sql = @"SP_Categoriestest5";
SqlParameter[] pars = {
    new SqlParameter("@id", SqlDbType.Int),
    new SqlParameter("@CategoryName", SqlDbType.NVarChar, 50),
    new SqlParameter("rval", SqlDbType.Int,4)
};
pars[0].Direction = ParameterDirection.Output;//参数类型为Output
pars[1].Value = "CategoryName"; // 给输入参数赋值
pars[2].Direction = ParameterDirection.ReturnValue;//参数类型为Output
DataSet ds = GetDataSet("数据库连接字符串", sql, CommandType.StoredProcedure, pars);

7、返回多个记录集的存储过程

--存储过程SP_Categoriestest7
CREATE PROCEDURE SP_Categoriestest7
 AS
 select * from Categories
 select * from Categories
 GO
DataSet ds = GetDataSet("数据库连接字符串", sql, CommandType.StoredProcedure);

 

  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值