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);