.NET对存储过程的调用抽象封装
最近一边参与公司的项目开发,一边还肩负着基础库的创建和维护。真真切切的体会到写框架的不容易,写出好的,方便使用的框架更不容易,需要考虑的东西太多,需要掌握的东西太多。不过不要紧我们正在前进的道路上。同志们一起加油!
经过与DBA的沟通,他认为对存储过程的封装是有必要的,以他十几年的经验看,存储过程后期的移植是必不可少的。现在的项目是用SQLSERVER2008开发的,后期可能会移植到ORACLE上去,那么对存储过程的编写DBA考虑很周全。但是对于程序员来说,经验稍微丰富点的可能会通过某种工厂将具体对象脱耦,或者使用依赖倒置的原则来解决更换数据源问题。但是考虑到统一的使用方法,这里还是真的有必要进行封装的。那么如何封装?
- Dictionary<string, object> parameter = new Dictionary<string, object>();
- parameter.Add("PurchaseID", Purchase.TempSerialNo);//单据流水号
- parameter.Add("WarehouseId", Purchase.InWarehouseID);//仓库ID
- parameter.Add("UserID", Purchase.UserID);//操作ID
- parameter.Add("UserName", Purchase.UserName);//操作人名称
- parameter.Add("PurchaseDate", DBNull.Value);//采购日期
- parameter.Add("BuyUserID", DBNull.Value);//采购人编号
- parameter.Add("BuyUserName", DBNull.Value);//采购人名称
- parameter.Add("BuyDate", DBNull.Value);//采购日期
- parameter.Add("Memo", Purchase.Memo);//备注说明
- IDataParameter[] parameterDic = IDataParameterFactory.CreateDbDataParameter(parameter);
- List<IDataParameter> listparameter = IDataParameterHelper.IDataParameterArrayToList(parameterDic);
- listparameter.Add(WL.DAL.DAL_TB_WLPurchase.GetErrIDParametere());
- using (Fast.Orm.IDataSourceOperation operation = Fast.Orm.IDataSourceOperationFactory.Create())
- {
- operation.ExecuteNonQuery(CommandType.StoredProcedure, "prc_WLPurchaseTmpAdd", listparameter.ToArray());
- if (listparameter[listparameter.Count - 1].Value.ToString() == "0")
- return true;
- return false;
- }
一般性的封装基本都这样或者在IDataParameterFactory.CreateDbDataParameter(Entity)中加入根据实体的属性动态的创建IDataParameter[]对象,如果你的创建始终是使用反射的话那么将是不可取的。有兴趣的朋友可以参见本人的另一篇文章“利用抽象、多态实现无反射的绿色环保ORM框架”对实体的使用如果不能摆脱反射,那么在以后的基础库扩展中将面临着很多性能问题,这里需三思。
- /// <summary>
- /// 存储过程实体(参数信息类)基类
- /// </summary>
- public abstract class BaseStoredprocedureObject : DictionaryBase
- {
- /// <summary>
- /// 受保护的字段-存储过程名称
- /// </summary>
- protected string procedurename = string.Empty;
- /// <summary>
- /// 受保护的字段-命令参数集合
- /// </summary>
- protected List<IDataParameter> parameterlist = new List<IDataParameter>();
- /// <summary>
- /// 获取命令参数集合
- /// </summary>
- public List<IDataParameter> ParameterList
- {
- get { return parameterlist; }
- }
- /// <summary>
- /// 添加IDataParameter对象到基类parameterlist对象
- /// </summary>
- public abstract void AddParameterToBaseParameterObject();
- /// <summary>
- /// 获取存储过程名称
- /// </summary>
- public string ProcedureName
- {
- get { return procedurename; }
- }
- /// <summary>
- /// 获取对应参数名称的值
- /// </summary>
- /// <param name="keyname">参数名称</param>
- /// <returns>object:参数值</returns>
- public object this[string keyname]
- {
- get { return this.Dictionary[keyname]; }
- internal set { this.Dictionary[keyname] = value; }
- }
- /// <summary>
- /// 获取所有参数信息
- /// </summary>
- public IDictionary GetProcedureEntity
- {
- get { return this.Dictionary; }
- }
- /// <summary>
- /// 存储过程返回的数据集
- /// </summary>
- public DataTable Source
- {
- get;
- internal set;
- }
- }
- using System;
- using System.Collections.Generic;
- using System.Text;
- using System.Data;
- using Fast.Orm;
- namespace Fast.WL.Parmeter
- {
- [Serializable()]
- public class Init_prc_WLOrderTmpAdd : BaseStoredprocedureObject
- {
- public Init_prc_WLOrderTmpAdd()
- {
- this.procedurename = "prc_WLOrderTmpAdd";
- this.Dictionary.Add("OrderID", null);
- this.Dictionary.Add("StationID", null);
- this.Dictionary.Add("UserID", null);
- this.Dictionary.Add("UserName", null);
- this.Dictionary.Add("OrderDate", null);
- this.Dictionary.Add("DeliveryAddress", null);
- this.Dictionary.Add("OrderType", null);
- this.Dictionary.Add("APNumber", null);
- this.Dictionary.Add("Memo", null);
- this.Dictionary.Add("ErrID", DBNull.Value);
- }
- public override void AddParameterToBaseParameterObject()
- {
- base.parameterlist.Add(IDataParameterFactory.CreateDbDataParameter(
- "OrderID", base.Dictionary["OrderID"],
- ParameterDirection.Input, DbType.String, 14));
- base.parameterlist.Add(IDataParameterFactory.CreateDbDataParameter(
- "StationID", base.Dictionary["StationID"],
- ParameterDirection.Input, DbType.String, 36));
- base.parameterlist.Add(IDataParameterFactory.CreateDbDataParameter(
- "UserID", base.Dictionary["UserID"],
- ParameterDirection.Input, DbType.String, 36));
- base.parameterlist.Add(IDataParameterFactory.CreateDbDataParameter(
- "UserName", base.Dictionary["UserName"],
- ParameterDirection.Input, DbType.String, 10));
- base.parameterlist.Add(IDataParameterFactory.CreateDbDataParameter(
- "OrderDate", base.Dictionary["OrderDate"],
- ParameterDirection.Input, DbType.DateTime, 8));
- base.parameterlist.Add(IDataParameterFactory.CreateDbDataParameter(
- "DeliveryAddress", base.Dictionary["DeliveryAddress"],
- ParameterDirection.Input, DbType.String, 50));
- base.parameterlist.Add(IDataParameterFactory.CreateDbDataParameter(
- "OrderType", base.Dictionary["OrderType"],
- ParameterDirection.Input, DbType.Int16, 2));
- base.parameterlist.Add(IDataParameterFactory.CreateDbDataParameter(
- "APNumber", base.Dictionary["APNumber"],
- ParameterDirection.Input, DbType.String, 20));
- base.parameterlist.Add(IDataParameterFactory.CreateDbDataParameter(
- "Memo", base.Dictionary["Memo"],
- ParameterDirection.Input, DbType.String, 220));
- base.parameterlist.Add(IDataParameterFactory.CreateDbDataParameter(
- "ErrID", base.Dictionary["ErrID"],
- ParameterDirection.Output, DbType.Int32, 4));
- }
- }
- public class prc_WLOrderTmpAdd : Init_prc_WLOrderTmpAdd
- {
- public object OrderID
- {
- get { return this.Dictionary["OrderID"] as object; }
- set { this.Dictionary["OrderID"] = value; }
- }
- public object StationID
- {
- get { return this.Dictionary["StationID"] as object; }
- set { this.Dictionary["StationID"] = value; }
- }
- public object UserID
- {
- get { return this.Dictionary["UserID"] as object; }
- set { this.Dictionary["UserID"] = value; }
- }
- public object UserName
- {
- get { return this.Dictionary["UserName"] as object; }
- set { this.Dictionary["UserName"] = value; }
- }
- public object OrderDate
- {
- get { return this.Dictionary["OrderDate"] as object; }
- set { this.Dictionary["OrderDate"] = value; }
- }
- public object DeliveryAddress
- {
- get { return this.Dictionary["DeliveryAddress"] as object; }
- set { this.Dictionary["DeliveryAddress"] = value; }
- }
- public object OrderType
- {
- get { return this.Dictionary["OrderType"] as object; }
- set { this.Dictionary["OrderType"] = value; }
- }
- public object APNumber
- {
- get { return this.Dictionary["APNumber"] as object; }
- set { this.Dictionary["APNumber"] = value; }
- }
- public object Memo
- {
- get { return this.Dictionary["Memo"] as object; }
- set { this.Dictionary["Memo"] = value; }
- }
- public object ErrID
- {
- get { return this.Dictionary["ErrID"] as object; }
- set { this.Dictionary["ErrID"] = value; }
- }
- }
- }
在Init_prc_WLOrderTmpAdd构造函数中我们设置所有的参数名称和默认的值,这里可以会是DbNull.Value。[王清培版权所有,转载请给出署名]
- prc_WLOrderTmpAdd ordertmp = new prc_WLOrderTmpAdd();
- ordertmp.OrderID = order.OrderID;//订单流水号
- ordertmp.StationID = order.StationID;//站点ID
- ordertmp.UserID = order.UserID;
- ordertmp.UserName = order.UserName;
- ordertmp.OrderDate = DBNull.Value;
- ordertmp.DeliveryAddress = order.DeliveryAddress;
- ordertmp.OrderType = order.OrderType;
- ordertmp.APNumber = string.IsNullOrEmpty(order.APNumber) ? DBNull.Value : (object)order.APNumber;
- ordertmp.Memo = DBNull.Value;//备注
- Fast.Orm.ProcedureHelper.ProcedureOperation<prc_WLOrderTmpAdd>(ordertmp);
- return int.Parse(ordertmp.ErrID.ToString()) == 0 ? true : false;
这样保证我们写的代码都围绕着数据实体来进行数据库的操作。
有了专业的代码生成器之后,一切就变的简单多了,我们按照自己的要求设计开发代码生成器来配合基础框架的使用,那么我们的开发效率将大大提高了。
转载于:https://blog.51cto.com/wangqingpei557/898830
.NET对存储过程的调用抽象封装相关推荐
- 写存储过程与调用存储过程
--创建存储过程的语法 if exists(select * from sysobjects where name='sp_selectStudent') drop procedure sp_sel ...
- oracle java调用存储过程_Java调用Oracle存储过程
一:无返回值的存储过程 存储过程为: CREATE OR REPLACE PROCEDURE TESTA(PARA1 IN VARCHAR2,PARA2 IN VARCHAR2) AS BEGIN I ...
- mysql数据库存储过程及调用方法
mysql数据库存储过程及调用方法 mysql5.0以后就支持存储过程了,目前mysql的6.0Alpha版也已经推出.6.0不仅支持大型数据库如oracle等的绝大部分功 能,如存储过程.视图.触发 ...
- 争议?MySQL存储过程与函数,封装,体,完整详细可收藏
文章目录 1. 存储过程概述 2. 创建存储过程 3. 调用存储过程 4. 存储函数的使用 5. 存储过程和函数的查看.修改.删除 6. 关于存储过程使用的争议 MySQL从5.0版本开始支持存储过程 ...
- C mysql带参数存储过程_C# 调用Mysql 带参数存储过程
使用C#调用Mysql 带参数的存储过程: 1.创建带参数的存储过程:USP_Temp_Test 2.两个参数:IN 参数为 P_XML , OUT 参数为 P_ErrorOut 3.C#代码调用该存 ...
- 第15章_存储过程与函数(创建存储过程、调用存储过程、存储函数的使用、存储过程和函数的查看、修改、删除)
第15章_存储过程与函数 第15章_存储过程与函数 1. 存储过程概述 1.1 理解 1.2 分类 2. 创建存储过程 2.1 语法分析 2.2 代码举例 3. 调用存储过程 3.1 调用格式 3.2 ...
- UML2面向对象分析与设计 -- 面向对象思维(概念、面向对象技术的发展历史、对象和类、面向对象技术的相关原则:抽象 封装 分解 泛化 多态 分层 复用)
文章目录 1. UML2面向对象分析与设计 学习目标 2. 面向对象思维 2.1 学习目标 2.2 什么是面向对象 2.3 面向对象技术的发展历史 2.4 面向对象技术的优势 2.4.1 便于沟通:在 ...
- 5.计算机发展个人理解-电路终究是电路 软件如何控制硬件 代码如何操作硬件 硬件是怎么执行代码 代码如何执行 软件与硬件如何交互 计算机思维 抽象 封装 规范 屏蔽 协议分层...
计算机只是逻辑电路 除了电路还是电路 计算机就是一堆逻辑电路 他并不知道你到底想要干什么,他也不会理解什么是文件,什么是进程 通电的瞬间,就好像你打开开关,灯泡发光一样 所有的一切都是通过通电来启动的 ...
- SQLServer 中存储过程返回的三种方式( 包括存储过程的创建, 在存储过程中调用, 在VS中调用的方法)...
存储过程有三种返回: 1. 用return返回数字型数据 2. 用返回参数返回结果,可以返回各种数据类型(通过游标来循环查询结果每一行) 3. 直接在存储过程中用select返回结果集,可 ...
- oracle创建函数和调用存储过程和调用函数的例子(区别)
创建函数: 格式:create or replace function func(参数 参数类型) Return number Is Begin --------业务逻辑--------- End; ...
最新文章
- 张立贤:积跬步至千里,我与地学大数据的探索之旅 | 提升之路系列(五)
- RxJava/RxAndroid:timer(long delay, TimeUnit unit)
- NFS文件系统详解以及安全设置
- 利用脚本将文字插入到图片或进行多个图片拼接
- 关于进程和线程以及句柄
- 大数运算(2)——大数加法
- Redis作者antirez:开源维护者的挣扎
- 联名款Redmi K40游戏增强版今日揭晓:神秘女主粉色头发吸睛
- android的动态注册,Android JNI 函数注册的两种方式(静态注册/动态注册)
- 迭代器之输入和输出迭代器
- python将excel文件变成txt文件
- Lesson 1 A puma at large
- Window open使用教程
- MAC安装Securecrt
- 两款Java中小医院信息管理系统源码
- 深度学习入门:手写体识别
- python图像的手绘效果代码_Python项目1:实现将图片转化为手绘效果
- html 文件怎么改类型,怎么更改文件类型
- Android 11 OTA升级集成
- python使用 Captcha 模块来生成验证码图片