完整的例子 ASP.NET中如何调用存储过程- 用ASP.NET与SQL SERVER可是缘份最好了,稍大的程序一般第一先考虑的是SQL SERVER,只是一些很考虑经济的才使用ACCESS等了。用SQL SERVER,为了使数据库的效率更好,一般都会才取存储过程,因存储过程执行速度快,并且可以实现一些高级的查询等功能。比如传入一些数据参数,但执行的SQL过程可能不同等。下面就来个例子,建立一新的角色,要求角色的名字不能重复,以下是一存储过程CREATE PROCEDURE sp_AccountRole_Create@CategoryID int, @RoleName nvarchar(10), @Description nvarchar(50), @RoleID int output AS DECLARE @Count int -- 查找是否有相同名称的记录 SELECT @Count = Count(RoleID) FROM Account_Role WHERE RoleName = @RoleName IF @Count = 0 INSERT INTO Account_Role (CategoryID, RoleName, Description) valueS (@CategoryID, @RoleName, @Description) SET @RoleID = @@IDENTITY RETURN 1 GO执行存储过程的C#过程:SqlConnection DbConnection = new SqlConnection(mConnectionString); SqlCommand command = new SqlCommand( "sp_AccountRole_Create", DbConnection ); DbConnection.Open(connectString); // 废置SqlCommand的属性为存储过程 command.CommandType = CommandType.StoredProcedure;command.Parameters.Add("@CategoryID", SqlDbType.Int, 4); command.Parameters.Add("@RoleName", SqlDbType.NVarChar, 10); command.Parameters.Add("@Description", SqlDbType.NVarChar, 50); command.Parameters.Add("@RoleID", SqlDbType.Int, 4); // 返回值 command.Parameters.Add("Returnvalue", SqlDbType.Int, 4, // Size ParameterDirection.Returnvalue, false, // is nullable 0, // byte precision 0, // byte scale string.Empty, DataRowVersion.Default, null );command.parameters["@CategoryID"].value = permission.CategoryID; command.parameters["@RoleName"].value = permission.PermissionName; command.parameters["@Description"].value = permission.Description; // 可以返回新的ID值 command.parameters["@RoleID"].Direction = ParameterDirection.Output;int rowsAffected = command.ExecuteNonQuery(); int result = command.parameters["Returnvalue"].value; int newID = command.parameters["@RoleID"].value;可以得到三个值,分别是行影响值,存储过程返回值,新的ID值
--创建存储过程 实现存/取钱 if exists(select * from sysobjects where name='proc_takeMoney') drop procedure proc_takeMoney go create procedure proc_takeMoney @cardID varchar(19), -- 卡号 @tMoney money, -- 交易金额 @Ttype varchar(10), -- 存钱/取钱 @pass varchar(12)=NULL -- 密码 as print '交易正在进行,请稍候.....' if(@Ttype = '取款') begin if(@pass=(select pass from cardInfo where cardID=@cardID)) -- 判断密码是否正确 begin if (@tMoney<(select balance from cardInfo where cardID=@cardID)) -- 判断余额是否够取 begin insert into transInfo(transType,cardID,transMoney) values ('支取',@cardID,@tMoney) --交易表增加记录 update cardInfo set balance=balance-@tMoney where cardID=@cardID --更新 print '交易成功,交易金额:'+convert(varchar(10),@tMoney) end else declare @balance money select @balance=balance from cardInfo where cardID=@cardID print '交易失败,余额不足!' print '卡号:'+convert(varchar(10),@cardID)+' 余额:'+convert(varchar(10),@balance) end else print '密码不正确!' return 0 end else -- 存款 -- begin insert into transInfo(transType,cardID,transMoney) values ('存入',@cardID,@tMoney) -- 交易表增加记录 update cardInfo set balance=balance+@tMoney where cardID=@cardID -- 更新账户余额 end--创建存储过程 实现转账 if exists(select * from sysobjects where name='proc_openAccount') drop procedure proc_openAccount go create procedure proc_openAccount @card1 char(19), -- 卡1 @card2 char(19), -- 卡2 @outmoney money, -- 交易金额 @pass varchar(10)=NULL -- 密码 -- 创建事物:防止余额不足时 交易失败 as begin transaction exec proc_takeMoney @card1,@outmoney,'取款',@pass exec proc_takeMoney @card2,@outmoney,'存款'-- 接收返回值 declare @returninfo int exec @returninfo = proc_takeMoney SET @returninfo if (@returninfo>1) rollback tran else begin commit tran print '转账成功!' end 接受返回值的地方有问题,
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 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() ;
ASP.NET中如何调用存储过程-
用ASP.NET与SQL SERVER可是缘份最好了,稍大的程序一般第一先考虑的是SQL SERVER,只是一些很考虑经济的才使用ACCESS等了。用SQL SERVER,为了使数据库的效率更好,一般都会才取存储过程,因存储过程执行速度快,并且可以实现一些高级的查询等功能。比如传入一些数据参数,但执行的SQL过程可能不同等。下面就来个例子,建立一新的角色,要求角色的名字不能重复,以下是一存储过程CREATE PROCEDURE sp_AccountRole_Create@CategoryID int,
@RoleName nvarchar(10),
@Description nvarchar(50),
@RoleID int output
AS
DECLARE @Count int -- 查找是否有相同名称的记录
SELECT @Count = Count(RoleID) FROM Account_Role WHERE
RoleName = @RoleName IF @Count = 0 INSERT INTO Account_Role
(CategoryID, RoleName, Description) valueS
(@CategoryID, @RoleName, @Description) SET @RoleID = @@IDENTITY RETURN 1
GO执行存储过程的C#过程:SqlConnection DbConnection = new SqlConnection(mConnectionString);
SqlCommand command = new SqlCommand( "sp_AccountRole_Create", DbConnection );
DbConnection.Open(connectString);
// 废置SqlCommand的属性为存储过程
command.CommandType = CommandType.StoredProcedure;command.Parameters.Add("@CategoryID", SqlDbType.Int, 4);
command.Parameters.Add("@RoleName", SqlDbType.NVarChar, 10);
command.Parameters.Add("@Description", SqlDbType.NVarChar, 50);
command.Parameters.Add("@RoleID", SqlDbType.Int, 4);
// 返回值
command.Parameters.Add("Returnvalue",
SqlDbType.Int,
4, // Size
ParameterDirection.Returnvalue,
false, // is nullable
0, // byte precision
0, // byte scale
string.Empty,
DataRowVersion.Default,
null );command.parameters["@CategoryID"].value = permission.CategoryID;
command.parameters["@RoleName"].value = permission.PermissionName;
command.parameters["@Description"].value = permission.Description;
// 可以返回新的ID值
command.parameters["@RoleID"].Direction = ParameterDirection.Output;int rowsAffected = command.ExecuteNonQuery();
int result = command.parameters["Returnvalue"].value;
int newID = command.parameters["@RoleID"].value;可以得到三个值,分别是行影响值,存储过程返回值,新的ID值
--创建存储过程 实现存/取钱
if exists(select * from sysobjects where name='proc_takeMoney')
drop procedure proc_takeMoney
go
create procedure proc_takeMoney
@cardID varchar(19), -- 卡号
@tMoney money, -- 交易金额
@Ttype varchar(10), -- 存钱/取钱
@pass varchar(12)=NULL -- 密码
as
print '交易正在进行,请稍候.....'
if(@Ttype = '取款')
begin
if(@pass=(select pass from cardInfo where cardID=@cardID)) -- 判断密码是否正确
begin
if (@tMoney<(select balance from cardInfo where cardID=@cardID)) -- 判断余额是否够取
begin
insert into transInfo(transType,cardID,transMoney) values ('支取',@cardID,@tMoney) --交易表增加记录
update cardInfo set balance=balance-@tMoney where cardID=@cardID --更新
print '交易成功,交易金额:'+convert(varchar(10),@tMoney)
end
else
declare @balance money
select @balance=balance from cardInfo where cardID=@cardID
print '交易失败,余额不足!'
print '卡号:'+convert(varchar(10),@cardID)+' 余额:'+convert(varchar(10),@balance)
end
else
print '密码不正确!'
return 0
end
else -- 存款 --
begin
insert into transInfo(transType,cardID,transMoney) values ('存入',@cardID,@tMoney) -- 交易表增加记录
update cardInfo set balance=balance+@tMoney where cardID=@cardID -- 更新账户余额
end--创建存储过程 实现转账
if exists(select * from sysobjects where name='proc_openAccount')
drop procedure proc_openAccount
go
create procedure proc_openAccount
@card1 char(19), -- 卡1
@card2 char(19), -- 卡2
@outmoney money, -- 交易金额
@pass varchar(10)=NULL -- 密码
-- 创建事物:防止余额不足时 交易失败
as
begin transaction
exec proc_takeMoney @card1,@outmoney,'取款',@pass
exec proc_takeMoney @card2,@outmoney,'存款'-- 接收返回值
declare @returninfo int
exec @returninfo = proc_takeMoney
SET @returninfo if (@returninfo>1)
rollback tran
else
begin
commit tran
print '转账成功!'
end 接受返回值的地方有问题,
@id int output,
@CategoryName nvarchar(15)
AS
insert into dbo.Categories
(CategoryName,[Description],[Picture])
values (@CategoryName,'test1',null)
set @id = @@IDENTITY
GO
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() ;