通用数据库操作_绿色软件之家

绿色软件之家:您身边最放心的安全下载站! 最新更新|软件分类|软件专题|手机版|系统之家|纯净系统

您当前所在位置:首页数据库MSSQL → 通用数据库操作

通用数据库操作

时间:2015/6/28来源:绿色软件之家作者:网管联盟我要评论(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

关键词标签:数据库

相关阅读

文章评论
发表评论

热门文章 SqlServer2005对现有数据进行分区具体步骤SqlServer2005对现有数据进行分区具体步骤sql server系统表损坏的解决方法sql server系统表损坏的解决方法MS-SQL2005服务器登录名、角色、数据库用户MS-SQL2005服务器登录名、角色、数据库用户Access、SQL Server、Oracle常见应用的区别Access、SQL Server、Oracle常见应用的区别

相关下载

人气排行 如何远程备份(还原)SQL2000数据库SQL2000数据库远程导入(导出)数据配置和注册ODBC数据源-odbc数据源配置教程SQL2000和SQL2005数据库服务端口查看或修改SQL Server 2005降级到2000的正确操作步骤修改Sql Server唯一约束教程浅谈JSP JDBC来连接SQL Server 2005的方法SQL Server创建表语句介绍