免费邮箱 |加入收藏 | 会员中心 | 我要投稿 | RSS
您当前的位置:首页 > .NET专区 > ASP.NET应用

ado.net快速上手疑问及解答(完结篇)

时间:2011-05-21 10:42:14  来源:站内  作者:潘春会


-
楼猪上周周末偶而有感而发(也就是ado.net快速上手实践篇(一)和(二) ),想不到收到三位童鞋的邮件,提出了他们的疑问,并指出楼猪在源码中存在的问题。非常感谢他们的细心和认真的态度,在这里抱住鸣谢一下。下面,楼猪就把童鞋们发现的问题和提出的疑问一并整理,统一回复一下,草草落笔,恐怕还有讹误,请注意甄别。
一、代码中的问题
1、伪SqlMapper的基类为什么用抽象类BaseSqlMapper而不用接口?
答:楼猪也知道在IBatis下的SqlMapper的基类就是一个接口ISqlMapper,但是楼猪写代码的时候,发现泛型约束在抽象基类里写一次,在SqlMapper下就不要再写了,而用接口就必须写两遍约束。呵呵,一时偷懒的后果,没有深刻意识到“针对接口编程”这一条常识,提出这个问题的童鞋明显可以看出技高楼猪一筹啊,,哈哈,楼猪吸取这个教训了,本文最后的demo楼猪将BaseSqlMapper统一换成了ISqlMapper接口,请留意。
2、在前台页面里面写SQL语句太多,是不是不太好?
这个问题也很好。在实际的项目中,SQL语句通常都写在具体的Dao文件中,比如前文demo中提到的PersonDao类。我们在添加一个Person的时候,示例中是通过view plaincopy to clipboardPRint?
public int Insert(string sqlInsert) 

public int Insert(string sqlInsert)
这种形式的方法执行插入的,但是在实际项目中的时候,我们通常都会写view plaincopy to clipboardprint?
public int Insert(Person model) 

public int Insert(Person model)
这种类型的方法执行数据库插入操作。所以在前台(表现层)写SQL语句其实是不合理的。再次多多感谢指出代码问题的童鞋们。如果已经对某些新手造成某些误导,楼猪在这里要深刻反省和检讨(demo写的明显有点随意和偷懒),在这里,楼猪郑重提醒,SQL语句的位置请不要模仿demo中这种糟糕的写法,楼猪也是过来人,因为使用Batis.net的时候都是放在Dal层xml下的,请务必重视起来。

二、疑问(直接摘录邮件内容)
1、“数据库切换貌似没有是吧.怎样切换MSSQL。ACC,XML等等呢”?
答:这个应该是说源码对多种数据库的支持问题。哦,楼猪还没有实现。看源码,Sql Server简单的基本的CRUD功能已经支持了。如果要扩展支持其他数据库,模仿SqlServer类里的具体实现即可。楼猪的机器环境上没有安装Oracle或者MySQL等数据库,所以写完了也不好测试。您如果条件具备,自己可以试着完成它。至于说数据库的切换,理想状态的实现莫过于最经典的抽象工厂模式,呵呵,配置文件配合反射就行了。但是楼猪建议您简单使用伪SqlMapper进行数据库类型切换。具体操作,其实只要在配置文件appsetting中加一个数据库类型节点sqlType,配合类里的常用数据库类型的枚举即可。

  <appSettings>
    <add key="db_timeOut" value="5000"/>
    <!--数据库类型 0 SqlServer 1 Orcale 2 MySql-->
    <add key="sqlType" value="0"/>
  </appSettings>
枚举如下:

代码
namespace AdoNetDataaccess.Mapper
{
        public enum SqlEnum
        {
            Default = 0,
            SQLServer = 0,
            Oracle = 1,
            MySql = 1
        }
}

然后,就是一些实例化SqlMapper的过程判断了,将数据库切换的问题完全转移到实例化SqlMapper上来:

代码
using System;
using System.Collections.Generic;
using System.Configuration;

namespace AdoNetDataAccess.Mapper
{
    using AdoNetDataAccess.Core.Contract;
    using AdoNetDataAccess.Core.Implement;

    #region enum

    public enum SqlEnum
    {
        Default = 0,
        SQLServer = 0,
        Oracle = 1,
        MySql = 1
    }

    #endregion

    public sealed class MapperUtill
    {

        #region fields

        public static string currentSqlKey = "sqlConn";

        public static int cmdTimeOut = 15;

        private static int sqlType = 0;//数据库类型 0 SqlServer 1 Orcale 2 MySql

        private static readonly object objSync = new object();

        private static readonly IDictionary<string, ISqlMapper> dictMappers = new Dictionary<string, ISqlMapper>();

        #endregion

        #region constructor and methods

        private MapperUtill()

来顶一下
返回首页
返回首页
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表
推荐资讯
如何找出DHCP地址池里未使用的IP地址
如何找出DHCP地址池里
国内常用的DNS列表
国内常用的DNS列表
Linux邮件服务器软件比较
Linux邮件服务器软件比
学用纯CSS打造可折叠树状菜单
学用纯CSS打造可折叠树
相关文章
栏目更新
栏目热门