using System;
using System.IO;
using System.Data;
using System.Data.SqlClient;
using System.Configuration;
using System.Collections;
using System.Web;

namespace Forum.Component
{
    /**//// <summary>

    ///     存储过程的返回值纪录类
    ///     DataSet : 表示返回的表
    ///     Output  : 存储过程的输出参数
    ///     Value   : 存储过程的返回值
    /// </summary>
    public class SqlResult
    {
        public int Value;
        public Hashtable Output;
        public DataSet dataSet;

        public SqlResult()
        {
            Value = 0;
            Output = new Hashtable();
            dataSet = new DataSet();
        }
    }

    /**//// <summary>

    ///     用于调用数据库中的存储过程,返回一个DataSet、Output、Value的SqlResult类
    /// </summary>
    public class SqlProcedure
    {
        private string sp_name;
        private SqlConnection myConnection;
        private SqlCommand myCommand;
        private SqlParameter myParameter;

        public string ProcedureName
        {
            get{ return this.sp_name; }
            set{ this.sp_name = value; }
        }

        public SqlProcedure() : this("")
        {
        }

        public SqlProcedure(string sp_name)
        {
            this.ProcedureName = sp_name;
        }
        
        public SqlResult Call(params object[] parameters)
        {
            SqlResult result = new SqlResult();

            myConnection  = new SqlConnection(ConfigurationSettings.AppSettings["ConnectionString"]);

            myCommand = new SqlCommand(this.ProcedureName, myConnection);
            myCommand.CommandType = CommandType.StoredProcedure;

            SqlDataAdapter myAdapter = new SqlDataAdapter(myCommand);

            try
            {
                myConnection.Open();

                GetProcedureParameter(parameters);

                myAdapter.Fill(result.dataSet, "Table");

                GetOutputValue(result);
            }
            catch(Exception e)
            {
                throw e;
            }
            finally
            {
                myAdapter.Dispose();
                myCommand.Dispose();
                myConnection.Close();
                myConnection.Dispose();
            }

            return result;
        }

        private void GetProcedureParameter(params object[] parameters)
        {
            SqlCommand myCommand2 = new SqlCommand();

            myCommand2.Connection = this.myConnection;
            myCommand2.CommandText = "select * from INFORMATION_SCHEMA.PARAMETERS where SPECIFIC_NAME='" +this.ProcedureName+ "' order by ORDINAL_POSITION";

            SqlDataReader reader = null;
            try 
            {
                reader = myCommand2.ExecuteReader();
                    myParameter = new SqlParameter();
                    myParameter.ParameterName = "@Value";
                    myParameter.SqlDbType = SqlDbType.Int;
                    myParameter.Direction = ParameterDirection.ReturnValue;

                    myCommand.Parameters.Add(myParameter);
                int i = 0;
                while(reader.Read())
                {
                    myParameter = new SqlParameter();

                    myParameter.ParameterName = reader["PARAMETER_NAME"].ToString();
                    myParameter.Direction = reader["PARAMETER_MODE"].ToString()=="IN"?ParameterDirection.Input:ParameterDirection.Output;

                    switch(reader["DATA_TYPE"].ToString())
                    {
                        case "bit" :
                            if(myParameter.Direction == ParameterDirection.Input)
                                myParameter.Value = (bool)parameters[i];
                            myParameter.SqlDbType = SqlDbType.Bit;
                            break;

                        case "bigint" :
                            if(myParameter.Direction == ParameterDirection.Input)
                                myParameter.Value = (int)parameters[i];
                            myParameter.SqlDbType = SqlDbType.BigInt;
                            break;

                        case "int" :
                            if(myParameter.Direction == ParameterDirection.Input)
                                    myParameter.Value = (int)parameters[i];
                            myParameter.SqlDbType = SqlDbType.Int;
                            break;
                            
                        case "decimal" :
                            if(myParameter.Direction == ParameterDirection.Input)
                                myParameter.Value = (double)parameters[i];
                            myParameter.SqlDbType = SqlDbType.Decimal;
                            myParameter.Precision = (byte)reader["NUMERIC_PRECISION"];
                            myParameter.Scale = (byte)reader["NUMERIC_SCALE"];
                            break;

                        case "nvarchar" :
                            if(myParameter.Direction == ParameterDirection.Input)
                                myParameter.Value = (string)parameters[i];
                            myParameter.Size = (int)reader["CHARACTER_MAXIMUM_LENGTH"];
                            myParameter.SqlDbType = SqlDbType.NVarChar;
                            break;

                        case "varchar" :
                            if(myParameter.Direction == ParameterDirection.Input)
                                myParameter.Value = (string)parameters[i];
                            myParameter.Size = (int)reader["CHARACTER_MAXIMUM_LENGTH"];
                            myParameter.SqlDbType = SqlDbType.VarChar;
                            break;

                        case "nchar" :
                            if(myParameter.Direction == ParameterDirection.Input)
                                myParameter.Value = (string)parameters[i];
                            myParameter.Size = (int)reader["CHARACTER_MAXIMUM_LENGTH"];
                            myParameter.SqlDbType = SqlDbType.NChar;
                            break;

                        case "char" :
                            if(myParameter.Direction == ParameterDirection.Input)
                                myParameter.Value = (string)parameters[i];
                            myParameter.Size = (int)reader["CHARACTER_MAXIMUM_LENGTH"];
                            myParameter.SqlDbType = SqlDbType.Char;
                            break;

                        case "ntext" :
                            if(myParameter.Direction == ParameterDirection.Input)
                                myParameter.Value = (string)parameters[i];
                            myParameter.SqlDbType = SqlDbType.NText;
                            break;

                        case "text" :
                            if(myParameter.Direction == ParameterDirection.Input)
                                myParameter.Value = (string)parameters[i];
                            myParameter.SqlDbType = SqlDbType.Text;
                            break;

                        case "datetime" :
                            if(myParameter.Direction == ParameterDirection.Input)
                                myParameter.Value = (DateTime)parameters[i];
                            myParameter.SqlDbType = SqlDbType.DateTime;
                            break;
                        case "smalldatetime" :
                            if(myParameter.Direction == ParameterDirection.Input)
                                myParameter.Value = (DateTime)parameters[i];
                            myParameter.SqlDbType = SqlDbType.DateTime;
                            break;
                        case "image" :
                            if(myParameter.Direction == ParameterDirection.Input)
                            {
                                HttpPostedFile PostedFile = (HttpPostedFile)parameters[i];

                                Byte[] FileByteArray = new Byte[PostedFile.ContentLength];
                                Stream StreamObject = PostedFile.InputStream;
                                StreamObject.Read(FileByteArray,0,PostedFile.ContentLength);

                                myParameter.Value = FileByteArray;
                            }

                            myParameter.SqlDbType = SqlDbType.Image;
                            break;

                        case "uniqueidentifier" :
                            //myParameter.Value = (string)parameters[i];
                            myParameter.SqlDbType = SqlDbType.UniqueIdentifier;
                            break;

                        default : break;
                    }
                    i++;

                    myCommand.Parameters.Add(myParameter);
                }
            }
            catch(Exception e)
            {
                throw e;
            
            }
            finally
            {
                if(reader!=null) reader.Close();
                myCommand2.Dispose();
            }
        }


        private void GetOutputValue(SqlResult result)
        {
            result.Value = (int)myCommand.Parameters["@Value"].Value;

            foreach(SqlParameter parameter in myCommand.Parameters)
            {
                if(parameter.Direction == ParameterDirection.Output)
                {
                    result.Output.Add(parameter.ParameterName, parameter.Value);
                }
            }
        }
    }
}

调用方法

using Forum.Component
protected SqlProcedure procedure=new SqlProcedure();
public SqlResult result;

procedure.ProcedureName="sp_name";
result=procedure.Call(1,"1","2");

posted on 2007-07-04 23:22 ffan 阅读(508) 评论(2)  编辑 收藏 引用 所属分类: .NET

评论

re: [.NET][C#][转载]调用存储过程的类 2007-10-25 22:46

有个问题
如果存储过程有返回值 如何取到?
yuwy.sh@163.com给个消息.

re: [.NET][C#][转载]调用存储过程的类 2007-11-28 17:25

@tset

返回值在result 里

比如
public SqlResult result;

procedure.ProcedureName="sp_name";
result=procedure.Call(1,"1","2");
int abc = (int)result.Output["aaa"];

转载于:https://www.cnblogs.com/jh0262/archive/2008/09/18/2946798.html

C#调用存储过程的类相关推荐

  1. DM8 jdbc调用存储过程传参list<实体类>

    DM8 jdbc调用存储过程传参list<实体类> 一.前提 jdbc的连接串参数prepareOptimize,表示是否对预编译SQL做优化,取值true/false,默认false不开 ...

  2. c efcore.mysql_EF Core在mysql中调用存储过程

    EF Core在mysql中调用存储过程,博主找了很多,然而大多都是EF Core+SqlServer的或者EF Core+Oracle的,并没有正对Mysql的Pomelo驱动的,所以查找了一些资料 ...

  3. jdbc批量调用oracle存储过程,oracle学习笔记(二十三)——JDBC调用存储过程以及批量操作...

    jdbc调用存储过程 使用并获得out模式的参数返回值 //存储过程为sum_sal(deptno department.deptno%type,sum in out number) Callable ...

  4. MyBatis中调用存储过程和函数

    一.调用存储过程 1.首先在数据库中定义存储过程,定义的存储过程的代码如下: //定义存储过程create or replace procedure pag_add(p1 varchar2,p2 va ...

  5. 使用 CallableStatement 接口调用存储过程

    CallableStatement 接口的引入 CallableStatement 主要是调用数据库中的存储过程,CallableStatement 也是 Statement 接口的子接口.在使用 C ...

  6. java 存储过程 数组_Java调用存储过程返回数组

    Java调用存储过程: 结合SQL操作与存储过程 create procedure set_death_age(poet VARCHAR2, poet_age NUMBER) poet_id NUMB ...

  7. 通过hibernate去调用存储过程

    为了在 Hibernate 中使用存储过程,你必须遵循一些规则.不遵循这些规则的存储过程将不可用.如果你仍然想使用他们,你必须通过 session.connection() 来执行他们.这些规则针对于 ...

  8. mysql的映射文件调用函数_MyBatis中调用存储过程和函数

    一.调用存储过程 1.首先在数据库中定义存储过程,定义的存储过程的代码如下: //定义存储过程 create or replace procedure pag_add(p1 varchar2,p2 v ...

  9. hibernate4调用mysql存储过程_hibernate调用存储过程

    一. 建表与初始化数据 在mysql的test数据库中建立一张新表:tbl_user,建表语句如下: DROP TABLE IF EXISTS `user`; CREATE TABLE `tbl_us ...

最新文章

  1. 多模态生物识别有什么优势
  2. tcp reno 介绍
  3. 带卷积核的神经网络的迭代次数与收敛标准的关系
  4. TensorRT(4)-Profiling and 16-bit Inference
  5. 监听Hierachy、Project等视图结构变化的事件
  6. 求斐波那契数列第n位的几种实现方式及性能对比
  7. 数据结构 二叉树的存储结构_线程二叉树| 数据结构
  8. Mac上神奇的内置搜索引擎——Spotlight(聚焦搜索)
  9. mysql 主从 仅备份从库_MySQL主从复制 - 从数据库备份数据库
  10. 有标号的DAG计数 II
  11. IOS开发的一些好的建议和小技术
  12. javascript实例:路由的跳转
  13. read一个收到RST的socket会返回0?
  14. 计算机毕业论文任务书模板,平面设计毕业论文任务书范文
  15. oracle库导出命令,Oracle数据库导出、导入命令
  16. video 标签 autoplay 实现自动播放
  17. 并行流parallelStream
  18. openFOAM的基础类型汇总
  19. 未备份cf卡数据删除了怎么办?有这3个恢复方法
  20. 数据库导出EXCEL后0丢失

热门文章

  1. VMware ESXi克隆导出虚拟机下载时网络错误(或创建时FileNotFound)解决
  2. 华硕笔记本电池坏了有什么办法修?
  3. 【Bigdecimal】
  4. c语言套题答案 中国铁道出版社,《C语言程序设计验指导与习题集》练习题的参考答案(中国铁道出版社).doc...
  5. 佛山“禅城区智能卡云”入选国家示范项目
  6. 计量经济学复习笔记(一):一元线性回归(上)
  7. 2.3css特性、权重、盒子模型、ps基本操作
  8. 赖美云的认证照_本以为赖美云穿洛丽塔已经够美了,看到汉服照才知道什么是惊艳...
  9. 探索生活神奇:海尔智家小件品牌战略暨新品发布引爆AWE
  10. 钉钉上网课直播出错软件调用冲突简单调试