数据访问层现在都兴用存储过程了
本篇记录了一个功能比较齐全的存储过程的写法,和一个C#实现的比较通用的调用带返回值存储过程的方法。
1、存储过程:
例子中操作的表为 power(p_id,p_name,p_des)
本存储过程中进行了一般的空值,主键重复检测,对多条操作语句使用了事务
CREATE PROCEDURE myp2
@pid int ,@pname nvarchar(15),@pdes nvarchar(50)
AS
declare @return int,@count int
--检测参数是否有空值
if(ltrim(rtrim(@pname))='' or ltrim(rtrim(@pid))='')
begin
select 1--输入的参数有空值
return
end
--检测是否有主键重复
select @count=count(1) from power where p_id=@pid
if(@count>0)
begin
select 2--有重复
return
end
--执行事务
begin tran
insert into power(p_id,p_name,p_des)values(@pid,@pname,@pdes)
if(@@error<>0) goto l_rollback
insert into powerLog(p_id,p_des)values(@pid,@pdes)
if(@@error<>0) goto l_rollback
commit tran
select @return=4 --成功
goto l_ok
l_rollback:
rollback tran
select @return=3 --失败
l_ok:
select @return
GO
2、C#中调用带返回值的存储过程
这是一个比较通用的方法,存储过程的参数可以放在数组里面
/*执行存储过程
* 参数说明:
* StoreProName:存储过程名称
* parameters:存储过程的参数,用OleDbParameter类型的数组表示
* result:执行该存储过程的返回值,返回“成功”则执行成功,返回其他则失败
*/
public void ExcuteStore(string StoreProName,OleDbParameter[] parameters,out string result)
{
OleDbCommand com1 = new OleDbCommand(StoreProName, GetDBcon());
if (com1.Connection.State == ConnectionState.Closed)
com1.Connection.Open();
com1.CommandType = CommandType.StoredProcedure;
//给com添加参数,并赋值
for (int i = 0; i < parameters.Length; i++)
{
com1.Parameters.Add(parameters[i]);
}
string temp = "";
try
{
object obj = com1.ExecuteScalar();
if (obj != null)
temp = obj.ToString();
}
catch (Exception ee)
{
result = "操作失败!" + ee.Message.ToString();
return;
}
finally
{
com1.Connection.Close();
}
result = "成功"; //默认成功
//返回0表示数据操作成功
//返回1表示提交的数据有空值
//返回2表示编号有重复
//返回3表示数据操作错误
switch (temp)
{
case "0":
result = "成功";
//同时写日志
//DB.WirteLog(DB.opNO, DateTime.Now.ToString("yyyyMMddHHmmss"), thisModNO);
break;
case "1":
result = "提交的数据有空值!";
break;
case "2":
result = "编号有重复!";
break;
case "3":
result = "数据操作错误!";
break;
} }
上面方法的使用范例:
OleDbParameter[] param=new OleDbParameter[2];
param[0] = new OleDbParameter("@name", OleDbType.VarChar, 6);
param[1] = new OleDbParameter("@pwd", OleDbType.VarChar, 40);
param[0].Value = TextBox1.Text;
param[1].Value = TextBox2.Text;
string outstring;
ExcuteStore("myprocedure", param, out outstring);
if (outstring == "成功")
binding();
else
Label1.Text = outstring;
我用的是OleDb驱动,连的一种古老的数据库syBase,可能大家对SqlParameter更熟悉一点,方法一样。