当前位置: 首页 > 图文教程 > 网络编程 > ASP.NET > 数据访问层的第一种实现:Access+SQL

ASP.NET
Asp.net 时间操作基类(支持短日期,长日期,时间差)
asp.net 获取机器硬件信息(cpu频率、磁盘可用空间、内存容量等)
asp.net 数据库备份还原(sqlserver+access)
Asp.Net 数据操作类(附通用数据基类)
Asp.net 弹出对话框基类(输出alet警告框)
Asp.net 文件上传类(取得文件后缀名,保存文件,加入文字水印)
Asp.net Socket客户端(远程发送和接收数据)
Asp.net 字符串操作基类(安全,替换,分解等)
Asp.Net数据输出到EXCEL表格中
asp.net Gridview里添加汇总行
asp.net UpdatePanel的简单用法
asp.net ajaxControlToolkit FilteredTextBoxExtender的简单用法
this connector is disabled错误的解决方法
sql事务应用积累
asp.net Page.Controls对象(找到所有服务器控件)
在asp.NET中字符串替换的五种方法
ASP.NET缓存方法分析和实践示例代码
asp.net 在DNN模块开发中遇到的resx怪问题
ASP.NET State service状态服务的问题解决方法
asp.net 结合mysql存储过程进行分页代码

ASP.NET 中的 数据访问层的第一种实现:Access+SQL


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-09-23   浏览: 127 ::
收藏到网摘: n/a

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

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

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

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

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

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

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

第一条为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的实现非常相似,在这里不再赘述。