IT猫扑网:您身边最放心的安全下载站! 最新更新| 软件分类| 专题汇总| 手机版

您当前所在位置:IT猫扑网 > 数据库 > MSSQL > 通用数据库操作

通用数据库操作

时间:2015-06-28 00:00 来源:IT猫扑网|http://www.itmop.com/ 作者:网管联盟 我要评论(0)

  一个系统执行一个数据操作的步骤:

  1.连接数据库

  2.构建Sql 语句。

  3.执行语句。

  4.返回 执行结果。

  注:

  一个系统可能有 N 个操作 ,然后另一个系统也要执行数据访问操作,那么我们可以不可以把连接数据、库执行语句、返回结果

  写成一个公共的东西呢? 答案是一定的。例如:NHibernate 我们只要引用它的类库、配置数据库连接语句和Mapping 文件 就可以

  进行操作了。那我今天说的是 不用写配置文件 的一个 公用数据库操作类库。暂时只实现查询

  首先我们编写一个接口:

  IDataProvider

using System;
using System.Collections.Generic;
using System.Text;
using System.Data.Common;
using System.Data;
namespace CustomDataOperate.Data.DataProviders
{
    public interface IDataProvider
    {
        DbConnection OpenConnection();
        void Open();
        void Close();
        IDataReader ExecuteReader(string sql);
        int ExecuteNonQuery(string sql);
        ICollection<TEntity> ExcuteReader<TEntity>(string sql) where TEntity : class;
    }
}

  DbConnection OpenConnection(); 打开一个数据库连接

  void Open(); 当连接为关闭状态时 再次打开连接

  void Close(); 关闭连接

  IDataReader ExecuteReader(string sql); 执行Sql 语句返回执行结果

  int ExecuteNonQuery(string sql); 执行 修改、删除、增加

  ICollection<TEntity> ExcuteReader<TEntity>(string sql) where TEntity : class;  执行查询返回对象集合

  然后为接口写一个抽象类:

  DataProviderBase

using System;
using System.Collections.Generic;
using System.Text;
using System.Data.Common;
using CustomDataOperate.Data.Translates;
using System.Data;
namespace CustomDataOperate.Data.DataProviders
{
    public abstract class DataProviderBase : IDataProvider
    {
        protected DbConnection _Connection;
        protected DbCommand _Command;
        protected IEntityTranslate _Translate;
        #region IDataProvider Members
        public abstract DbConnection OpenConnection();
        public virtual void Close()
        {
            _Connection.Close();
        }
        public virtual void Open()
        {
            _Connection.Open();
        }

        protected virtual DbCommand Command
        {
            get { return _Command; }
            set { _Command = value; }
        }

        protected IEntityTranslate Translate
        {
            get
            {
                if (_Translate == null)
                {
                    _Translate = new EntityTranslate();
                }
                return _Translate;
            }
        }
        public abstract IDataReader ExecuteReader(string sql);
        public abstract int ExecuteNonQuery(string sql);

    public abstract ICollection<TEntity> ExcuteReader<TEntity>(string sql) where TEntity : class;
        #endregion
    }

 

  在 DataProviderBase 中出现了 Translate 属性 他是什么呢 ? 他是一个 (IEntityTranslate) 转换器

  将IDataReader 转换为Entity

  代码如下:

  IEntityTranslate

using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
namespace CustomDataOperate.Data.Translates
{
    public interface IEntityTranslate
    {
        TEntity Translate<TEntity>(IDataReader reader) where TEntity : class;
    }
}
using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using MD = CustomDataOperate.Data.Attributes;
using System.Reflection;
namespace CustomDataOperate.Data.Translates
{
    public class EntityTranslate:IEntityTranslate
    {
        public TEntity Translate<TEntity>(IDataReader reader) where TEntity : class
        {
            Type entityType = typeof(TEntity);
            object entity = Activator.CreateInstance(entityType);
            foreach (PropertyInfo info in entityType.GetProperties())
            {
                string columnName = string.Empty;
                object[] attributes = info.GetcustomAttributes(true);
                foreach (object attribute in attributes)
                {
                    if (attribute is MD.DataColumn)
                    {
                        columnName = (attribute as MD.DataColumn).ColumnName;
                        int filedIndex = 0;
                        while (filedIndex < reader.FieldCount)
                        {
                            if (reader.GetName(filedIndex) == columnName)
                            {
                                info.SetValue(entity, reader.GetValue(filedIndex), null);
                                break;
                            }
                            filedIndex++;
                        }
                        break;
                    }
                }
            }
            return entity as TEntity;
        }
    }
}

  为什么转换器中会出现 DataColumn 是 System.Data 命名空间下的吗? 不是 这是一个自定义的 Attirbute

  DataColumn

using System;
using System.Collections.Generic;
using System.Text;
namespace CustomDataOperate.Data.Attributes
{
    public class DataColumn : System.Attribute
    {
        public DataColumn()
        {
        }
        public DataColumn(string columnName)
        {
            ColumnName = columnName;
        }
        public string ColumnName
        {
            get;
            set;
        }
    }
}

  注释:

  ColumnName :将数据库的Filed 和 Entity Property 对应。

  到这里还要做什么呢? 对了还缺少实现,那么我们开始实现这个 Provider

  SqlDataProvider

using System;
using System.Collections.Generic;
using System.Text;
using CustomDataOperate.Data.DataProviders;
using System.Da

关键词标签:数据库

相关阅读 sql server系统表损坏的解决方法 SQL Server asp.net 数据提供程序连接池 SqlServer2005对现有数据进行分区具体步骤 一个Access数据库数据传递的实例方法 为导入文件加上时间戳标记的两种方法 SQL Server 2005 在不允许远程连接的情况下的破解

文章评论
发表评论

热门文章 sql server系统表损坏的解决方法 sql server系统表损坏的解决方法 SqlServer2005对现有数据进行分区具体步骤 SqlServer2005对现有数据进行分区具体步骤 解决SQL Server中Group无法实现的问题 解决SQL Server中Group无法实现的问题 SQL Server 2005降级到2000的正确操作步骤 SQL Server 2005降级到2000的正确操作步骤 手把手教你学会SQL Server镜像操作 手把手教你学会SQL Server镜像操作 实战手记:让百万级数据瞬间导入SQL Server 实战手记:让百万级数据瞬间导入SQL Server

相关下载

人气排行 配置和注册ODBC数据源-odbc数据源配置教程 如何远程备份(还原)SQL2000数据库 SQL2000数据库远程导入(导出)数据 SQL2000和SQL2005数据库服务端口查看或修改 修改Sql Server唯一约束教程 SQL Server 2005降级到2000的正确操作步骤 sql server系统表损坏的解决方法 浅谈JSP JDBC来连接SQL Server 2005的方法 SQL Server创建表语句介绍 MS-SQL2005服务器登录名、角色、数据库用户、角色、架构的关系 如何使用SQL Server中的客户端配置工具 SQL Server 分布式查询:OLE DB连接(一)