C#中调用存储过程笔记(原)

数据访问层现在都兴用存储过程了
本篇记录了一个功能比较齐全的存储过程的写法,和一个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更熟悉一点,方法一样。

posted @ 2007-04-12 16:44  小y  阅读(3428)  评论(1编辑  收藏  举报