当前位置:首页>>网络编程>>ASP.net>>正文

数据访问层的第一种实现:Access+SQL

文章出处:博客园 作者:T2噬菌体 发布时间:2008-07-21 收藏到QQ书签

经过上面篇文章的介绍,整个系统的框架算是基本搭建完了,下面,我们要具体实现各个层次。关于数据访问层的实现,我准备讨论三种实现方式,这一篇文章讨论第一种:Access+动态生成SQL。

顾名思义,这种实现将使用Access作为后台数据库,而操作方式也是最基本的使用SQL命令。

在具体编写实现代码之前,我们需要做一些准备工作:

第一步,我们要将Access数据库搭建完成,具体做法如下。

在Web工程下新建一个文件夹,命名为AccessData,并在其中新建一个mdb文件(即Access数据库文件),按照前面介绍过的数据库设计构架,将数据表及表间关系建好,这里不再赘述。

第二步,我们要进行一些配置。

打开Web工程下的Web.config文件,在其中的appSettings节点下,添加如下键值:

      <add key="AccessConnectionString" value="Provider=Microsoft.Jet.OLEDB.4.0;Data Source={DBPath}"/>
      <add key="AccessPath" value="~/AccessData/AccessDatabase.mdb"/>

第一条为Access的连接字符串,第二条为Access数据库文件的路径,其中“~”表示网站根目录。

第三步,新建一个工程。

我们要新建一个工程AccessDAL,用来存放Access数据访问层的代码。

准备工作做完了,现在来实现具体的代码。

1.编写数据访问助手类

因为很多数据访问操作流程很相似,所以,这里将一些可复用的代码抽取出来,编写成助手类,以此减少代码量,提高代码复用性。

这个助手类放在AccessDAL下,叫AccessDALHelper,主要负责Access数据库的访问。它包括三个方法:

GetConnectionString:从配置文件中读取配置项,组合成连接字符串。

ExecuteSQLNonQuery:执行指定SQL语句,不返回任何值,一般用于Insert,Delete,Update命令。

ExecuteSQLDataReader:执行SQL语句返回查询结果,一般用于Select命令。

具体代码如下:

 using System;
 using System.Web;
 using System.Web.Caching;
 using System.Configuration;
 using System.Data;
 using System.Data.OleDb;
 using NGuestBook.Utility;
 
 namespace NGuestBook.AccessDAL
{
    /**//// <summary>
    /// Access数据库操作助手
    /// </summary>
    public sealed class AccessDALHelper
    {
        /**//// <summary>
        /// 读取Access数据库的连接字符串
        /// 首先从缓存里读取,如果不存在则到配置文件中读取,并放入缓存
        /// </summary>
        /// <returns>Access数据库的连接字符串</returns>
        private static string GetConnectionString()
        {
            if (CacheAccess.GetFromCache("AccessConnectionString") != null)
            {
                return CacheAccess.GetFromCache("AccessConnectionString").ToString();
            }
            else
            {
                string dbPath = ConfigurationManager.AppSettings["AccessPath"];
                string dbAbsolutePath = HttpContext.Current.Server.MapPath(dbPath);
                string connectionString = ConfigurationManager.AppSettings["AccessConnectionString"];

                CacheDependency fileDependency = new CacheDependency(HttpContext.Current.Server.MapPath("Web.Config"));
                CacheAccess.SaveToCache("AccessConnectionString", connectionString.Replace("{DBPath}", dbAbsolutePath), fileDependency);

                return connectionString.Replace("{DBPath}", dbAbsolutePath);
            }
        }

        /**//// <summary>
        /// 执行SQL语句并且不返回任何值
        /// </summary>
        /// <param name="SQLCommand">所执行的SQL命令</param>
        /// <param name="parameters">参数集合</param>
        public static void ExecuteSQLNonQuery(string SQLCommand,OleDbParameter[] parameters)
        {
            OleDbConnection connection = new OleDbConnection(GetConnectionString());
            OleDbCommand command = new OleDbCommand(SQLCommand, connection);

            for (int i = 0; i < parameters.Length; i++)
            {
                command.Parameters.Add(parameters[i]);
            }

            connection.Open();
            command.ExecuteNonQuery();
            connection.Close();
        }

        /**//// <summary>
        /// 执行SQL语句并返回包含查询结果的DataReader
        /// </summary>
        /// <param name="SQLCommand">所执行的SQL命令</param>
        /// <param name="parameters">参数集合</param>
        /// <returns></returns>
        public static OleDbDataReader ExecuteSQLDataReader(string SQLCommand,OleDbParameter[] parameters)
        {
            OleDbConnection connection = new OleDbConnection(GetConnectionString());
            OleDbCommand command = new OleDbCommand(SQLCommand, connection);

            for (int i = 0; i < parameters.Length; i++)
            {
                command.Parameters.Add(parameters[i]);
            }

            connection.Open();
            OleDbDataReader dataReader = command.ExecuteReader();
            //connection.Close();

            return dataReader;
        }
    }
}

2.实现具体的数据访问操作类

因为前面已经定义了数据访问层接口,所以实现数据访问操作类就是很机械的工作了。下面仅以Admin的数据访问操作类为例:

using System;
  using System.Collections.Generic;
  using System.Text;
  using System.Data;
  using System.Data.OleDb;
  using NGuestBook.IDAL;
  using NGuestBook.Entity;
 
  namespace NGuestBook.AccessDAL
{
     public class AdminDAL : IAdminDAL
     {
         /**//// <summary>
         /// 插入管理员
         /// </summary>
         /// <param name="admin">管理员实体类</param>
         /// <returns>是否成功</returns>
         public bool Insert(AdminInfo admin)
         {
            string SQLCommand = "insert into [TAdmin]([Name],[Password]) values(@name,@password)";
             OleDbParameter[] parameters ={
                 new OleDbParameter("name",admin.Name),
                 new OleDbParameter("password",admin.Password)
             };
 
             try
             {
                 AccessDALHelper.ExecuteSQLNonQuery(SQLCommand, parameters);
                 return true;
            }
             catch
             {
                 return false;
             }
         }
 
         /**//// <summary>
         /// 删除管理员
         /// </summary>
       /// <param name="id">欲删除的管理员的ID</param>
         /// <returns>是否成功</returns>
         public bool Delete(int id)
         {
             string SQLCommand = "delete from [TAdmin] where [ID]=@id";
             OleDbParameter[] parameters ={
                 new OleDbParameter("id",id)
             };
 
             try
            {
                 AccessDALHelper.ExecuteSQLNonQuery(SQLCommand, parameters);
                 return true;
             }
             catch
             {
                 return false;
             }
         }
 
        /**//// <summary>
         /// 更新管理员信息
         /// </summary>
         /// <param name="admin">管理员实体类</param>
         /// <returns>是否成功</returns>
         public bool Update(AdminInfo admin)
         {
             string SQLCommand = "update [TAdmin] set [Name]=@name,[Password]=@password where [ID]=@id";
             OleDbParameter[] parameters ={
                 new OleDbParameter("id",admin.ID),
                new OleDbParameter("name",admin.Name),
                 new OleDbParameter("password",admin.Password)
             };
 
             try
             {
                 AccessDALHelper.ExecuteSQLNonQuery(SQLCommand, parameters);
                 return true;
             }
             catch
            {
                 return false;
             }
         }
 
         /**//// <summary>
         /// 按ID取得管理员信息
         /// </summary>
         /// <param name="id">管理员ID</param>
         /// <returns>管理员实体类</returns>
        public AdminInfo GetByID(int id)
         {
             string SQLCommand = "select * from [TAdmin] where [ID]=@id";
             OleDbParameter[] parameters ={
                 new OleDbParameter("id",id)
             };
 
             try
             {
                 OleDbDataReader dataReader = AccessDALHelper.ExecuteSQLDataReader(SQLCommand, parameters);
                if (!dataReader.HasRows)
                {
                    throw new Exception();
                }

                AdminInfo admin = new AdminInfo();
                dataReader.Read();
                admin.ID=(int)dataReader["ID"];
                admin.Name=(string)dataReader["Name"];
                admin.Password=(string)dataReader["Password"];

                return admin;
            }
            catch
            {
                return null;
            }
        }

        /**//// <summary>
        /// 按用户名及密码取得管理员信息
        /// </summary>
        /// <param name="name">用户名</param>
        /// <param name="password">密码</param>
        /// <returns>管理员实体类,不存在时返回null</returns>
        public AdminInfo GetByNameAndPassword(string name, string password)
        {
            string SQLCommand = "select * from [TAdmin] where [Name]=@name and [Password]=@password";
            OleDbParameter[] parameters ={
                new OleDbParameter("name",name),
                new OleDbParameter("password",password),
            };

            try
            {
                OleDbDataReader dataReader = AccessDALHelper.ExecuteSQLDataReader(SQLCommand, parameters);
                if (!dataReader.HasRows)
                {
                    throw new Exception();
                }

                AdminInfo admin = new AdminInfo();
                dataReader.Read();
                admin.ID = (int)dataReader["ID"];
                admin.Name = (string)dataReader["Name"];
                admin.Password = (string)dataReader["Password"];

                return admin;
            }
            catch
            {
                return null;
            }
        }

        /**//// <summary>
        /// 按管理员名取得管理员信息
        /// </summary>
        /// <param name="name">管理员名</param>
        /// <returns>管理员实体类</returns>
       public AdminInfo GetByName(string name)
        {
            string SQLCommand = "select * from [TAdmin] where [Name]=@name";
            OleDbParameter[] parameters ={
                new OleDbParameter("name",name),
            };

            try
            {
                OleDbDataReader dataReader = AccessDALHelper.ExecuteSQLDataReader(SQLCommand, parameters);
                if (!dataReader.HasRows)
                {
                    throw new Exception();
                }

                AdminInfo admin = new AdminInfo();
                dataReader.Read();
                admin.ID = (int)dataReader["ID"];
                admin.Name = (string)dataReader["Name"];
                admin.Password = (string)dataReader["Password"];

                return admin;
            }
            catch
            {
                return null;
            }
        }

        /**//// <summary>
        /// 取得全部管理员信息
        /// </summary>
        /// <returns>管理员实体类集合</returns>
        public IList<AdminInfo> GetAll()
        {
            string SQLCommand = "select * from [TAdmin]";
            try
            {
                OleDbDataReader dataReader = AccessDALHelper.ExecuteSQLDataReader(SQLCommand, null);
                if (!dataReader.HasRows)
                {
                    throw new Exception();
                }

                IList<AdminInfo> adminCollection = new List<AdminInfo>();
                int i = 0;
                while (dataReader.Read())
                {
                    AdminInfo admin = new AdminInfo();
                    admin.ID = (int)dataReader["ID"];
                    admin.Name = (string)dataReader["Name"];
                   admin.Password = (string)dataReader["Password"];

                    adminCollection.Add(admin);
                    i++;
                }

                return adminCollection;
            }
            catch
            {
                return null;
            }
        }
    }
}

可以看到,这里主要包括三种类型的操作,一种是修改型,如Insert;一种是返回单个实体类型,如GetByID;还有一种是返回实体类集合型,如GetAll。

MessageDAL和CommentDAL的实现非常相似,在这里不再赘述。


Google