网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > C#应用
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
网络编程:ASP教程,ASP.NET教程,PHP教程,JSP教程,C#教程,数据库,XML教程,Ajax,Java,Perl,Shell,VB教程,Delphi,C/C++教程,软件工程,J2EE/J2ME,移动开发
本月文章推荐
.用CDO.Message打造邮件发送程序.
.C#中如何读写INI文件.
.C#操作技巧的数据类型之间的转换.
.利用c#制作简单的留言板(3) .
.IP数据包的校验和算法C#版.
.获取cpu序列号,硬盘ID,网卡MAC地.
.C#进制转换 的记录 .
.C#图像处理之-给你的图片打上LOGO.
.解读C#中的正则表达式.
.在C#中运用SQLDMO备份和恢复Micr.
.c-sharp开发应避免的几个小滥用.
.捕捉摄相头的数据流 .
.C# 操作文件.
.基于Remoting透明代理的AOP组件.
.通过win32api让c#控制Windows任务.
.C#2.0终于有了?:便捷判断的单分支.
.使用Web服务将C#代码转换为VB.NE.
.对C#委托及事件委托的理解.
.C#中时间格式的转换.
.C#多线程-不同线程之间通过事件委.

如何让数据访问过程更透明

发表日期:2006-6-2


    在编写数据库操作方法时我们经常考虑方法内部处理的Connection, Transaction等,主要方便以后不同方法进行整合扩展。但很多时候写数据库操作方法都是封闭,在方法内部打开Connection或Transaction处理;这样即满足现有需求的需要,要省下了调用方法所带来的麻烦事(因为在调用方法里必须定义Connection等信息传进去)。虽然这样满足了现有的需求,但面对以后在功能扩展需要整合几个方法时问题就产生了,因为方法是封闭的当你需多个方法同时使用一个Connection或Transaction就必须修改原有方法;虽然可以对方法重载一个新版来适应新的需要,但是代码的修改和重构也不是一件轻松的工作。

    简单地描述一下问题:

    public void a()

    {

              ........

}

public void b()

{

       …….

}

以上两个方法单独使用并没有什么问题,因为它们都是独立的。当出现下面情况又是如何呢?

Public void c()

{

a();

b();

….

}

在执行这个方法时有可能要保证a和b里面的数据库访问必须使用同一个Connection,如果需要数据完全整性还要确保两个方法的数据操作都必须使用同一个Transaction。由于刚开始编写a和b方法没有考虑这些情况,这个时候我们能做的只有把a和b方法进行重构来满足原有和现在的需要。

如果我们不修改a和b就能满足c的需要那是件多么好的事情,这样开发人员就有更多的时间去处理业务相关的麻烦事情。有时想一下dotNET提供一个DataContext(数据库操作上下文对象)该多好啊,在编写数据库操作代码时不用关心使用什么的Connection和Transaction;通过当前的DataContext来确定。虽然自己有这样的想法去实现,不过dotNET能提供是件最好不过的事情。

Public void c()

{

    using(DataContext context = new DataContext())

{

a();

b();

….

}

}

 

Public void D()

{

using(DataContext context = new DataContext())

{

c();

….

}

     }

补充一下:
其实在我的想法中DataContext不一定要显式创建,可以通过配置的方式在中程序设置一个默认的DataContext。
以下代码的功能没有完全实现。
  Table orders = new Table("Orders");
    Table orderdetails = new Table("[Order Details]");
    orderdetails.Delete(OrderDetails._OrderID == 10500);
    orders.Delete(Orders._OrderID == 10500);
即使不用显式创建DataContext 上面代码也可以运行。
为了保证数据完整性可以这样做:
using(TransactionContext tran = new TransactionContext())
{
    Table orders = new Table("Orders");
    Table orderdetails = new Table("[Order Details]");
    orderdetails.Delete(OrderDetails._OrderID == 10500);
    orders.Delete(Orders._OrderID == 10500);
    tran.Commit();

在写代码的过程就可以把这些东西抛开,需要时候定义相应的DataContext就可以了。

如果需要高度透明性,只有一个DataContext是远远不够的,必须提供相应数据操作的封装。

上一篇:存储过程中调用C#写的DLL 人气:8022
下一篇:在dotnet下用c#编写下载器 人气:7012
浏览全部c#的内容 Dreamweaver插件下载 网页广告代码 祝你圣诞节快乐 2009年新年快乐