zoukankan      html  css  js  c++  java
  • C#中调用存储过程笔记(原) (转

     

    Posted on 2007-04-12 16:44 小y 阅读(1584) 评论(0)  编辑 收藏 所属分类: sql数据库

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

  • 相关阅读:
    社区检测算法--Infomap
    correlation matrices 相关矩阵
    多分类评估指标
    juniper修改用户密码
    zabbix4.4监控mysql状态
    高并发linux内核参数优化
    用脚本监控windows tcp的连接数
    使用typeperf监控系统资源
    rsync同步时报错
    windows jenkins编译报错处理
  • 原文地址:https://www.cnblogs.com/etata/p/1180151.html
Copyright © 2011-2022 走看看