打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
超级DBHelper,让三层代码冗余降低【原创博文】

大家或许知道动态网页就是需要和服务器做交互,并且有数据交互的,所以基本会用到数据库,世界上有很多种数据库,但现在最流行的基本是以结构化语句(SQL)作为标准化的关系型数据库,比如IBM的DB2、微软的SQL Server数据库和Access数据库甲骨文的Orale数据库、原Sun公司的MySql数据库(Sun被甲骨文收购了,现在的MySql数据库版权归甲骨文公司所有,但M7在这里把他归属于Sun公司,可以看作是一种历史)、Sybase公司的Sybase数据库等等,这些都是平时开发比较常用的数据库,而我等下要公布的超级DBHelper是建立在SQL Server数据库基础上的,当然聪明的朋友可以在using引入的类库中其他数据库的Connection对象,这样就能成为万能的DBHelper。

 

注意:

1 要使用SqlConnection对象必须先引入SqlClient命名空间,SqlClinent是一个连接SQL Server数据库的方法的“集合”,里面有很多种方法只是针对SQL Server数据库,继承于Data命名空间,Data命名空间可以看作是所有数据库方法的父类,里面包含7种命名空间,有连接Orale数据库的命名空间OleDb等等。

using System.Data.SqlClient;

2 DBHelper一般是作为数据访问层(DAL)的一个类,也可以看做是一个写了很多种方法的“接口”,里面写了很多种方法便于DAL层中的很多类来实现,这样谁要用到这个方法就调用DBHelper中的这个方法,减少代码的冗余。

3 访问数据库的数据库名、账户、密码、域名等等都将存放在Web.config配置文件中,因为外部是无法访问或下载Web.confige文件的,而且在不同配置的服务器中可能密码或者账户不同,所以可以先在配置文件中配置多个数据,只要在DBHelper文件中修改引入的Name就行了,很方便的一个使用方法,所以必须先在DAl层中点击右键——添加引用,会出现一个窗体,如图:

然后在.NET中寻找System.Configuration,找到之后选中,点击确定,完成。

 

4 或许有人要问,上面的添加引用是干什么的?不添加引用,我们在using引入中找不到Configuration命名空间,因为我在上面也会说了,我们要把密码等一系列安全级别较高的数据存放在配置文件中,这个命名空间的方法是为了在类中读取配置文件的,所以必须先添加引用,然后在DB类中引入空间:

using System.Configuration;

5 以上两个命名空间成功引入就可以写代码了,代码如下:


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Configuration;
using System.Data.SqlClient;
using System.Data;


namespace TestPrj                 //空间名字 TestPrj

{
    public class DBHelper         //类名 DBHelper
    {

        
        private static string connStr = ConfigurationManager.ConnectionStrings["sqlserver"].ConnectionString;

        private static SqlConnection conn;

        public static SqlConnection Conn
        {
            get
            {
                if (conn == null)
                {
                    conn = new SqlConnection(connStr);
                    conn.Open();
                }
                if (conn != null && conn.State != ConnectionState.Closed)
                {
                    conn.Close();
                    conn.Open();
                }
                else
                {
                    conn.Open();
                }
                return DBHelper.conn;
            }
        }


        /// <summary>
        /// 关闭连接
        /// </summary>
        public static void closeConn()
        {
            if (Conn != null && Conn.State != ConnectionState.Closed)
            {
                Conn.Close();
            }
        }


        /// <summary>
        /// 查询操作
        /// </summary>
        /// <param name="sql"></param>
        /// <param name="type"></param>
        /// <param name="pars"></param>
        /// <returns></returns>
        public static SqlDataReader getReader(string sql, CommandType type, params SqlParameter[] pars)
        {
            SqlCommand cmd = new SqlCommand(sql, Conn);
            cmd.CommandType = type;
            cmd.Parameters.AddRange(pars);
            return cmd.ExecuteReader();
        }


        /// <summary>
        /// 执行非查询操作(执行增、删、改操作的),不支持事务
        /// </summary>
        /// <param name="sql"></param>
        /// <param name="type"></param>
        /// <param name="pars"></param>
        /// <returns></returns>
        public static int ExecuteNoneQuery(string sql, CommandType type, params SqlParameter[] pars)
        {
            int result = 0;

            SqlCommand cmd = new SqlCommand(sql, Conn);
            cmd.CommandType = type;
            if (pars != null)
            {
                cmd.Parameters.AddRange(pars);
            }

            result = cmd.ExecuteNonQuery();

            //关闭连接对象
            CloseConn();

            return result;
        }

        /// <summary>
        /// 非查询操作(执行增、删、改操作的),支持事务,进行批量操作
        /// </summary>
        /// <param name="sql"></param>
        /// <param name="conn"></param>
        /// <param name="type"></param>
        /// <param name="pars"></param>
        /// <returns></returns>
        public static int ExecuteNoneQuery(string sql, SqlConnection conn, CommandType type, params SqlParameter[] pars)
        {
            int result = 0;

            //接受外部提供的数据连接对象,并且此连接在本次操作后不要关闭
            SqlCommand cmd = new SqlCommand(sql, conn);
            cmd.CommandType = type;
            cmd.Parameters.AddRange(pars);

            result = cmd.ExecuteNonQuery();

            return result;
        }

        /// <summary>
        /// 获取单个值,首行首列
        /// </summary>
        /// <param name="sql"></param>
        /// <param name="type"></param>
        /// <param name="pars"></param>
        /// <returns></returns>
        public static object GetScalar(string sql, CommandType type, params SqlParameter[] pars)
        {
            object obj = null;

            SqlCommand cmd = new SqlCommand(sql, Conn);
            cmd.CommandType = type;
            cmd.Parameters.AddRange(pars);

            obj = cmd.ExecuteScalar();

            //关闭连接对象
            CloseConn();

            return obj;
        }
    }


//ConfigurationManager 方法:提供对客户端应用程序配置文件的访问,也就是说必须通过这个方法才能访问Web.config配置文件

//ConnectionStrings 方法有什么用,干什么的?我们来看张图你就明白了,打开配置文件找到子节点<ConnectionStrings/>如图:

      

//代码修改如下:<ConnectionStrings>

//                        <add name="你要调用的名字"  connectionString="数据库连接对象—— 服务器名 账户 密码 数据库名" />

//                        </ConnectionStrings>

// 所以这句你自然就看的懂了 ConfigurationManager.ConnectionStrings["sqlserver"].ConnectionString;

// 在客户端访问配置文件的方法 点(.) 配置文件中的子节点  ["子节点中的名字"]  点(.)  相对的子节点中的内容;

//其中的<add > 可以有多个,name 不能重复,其实name就等于Key ,而后面的ConnectionString就等于Value值。

//用于配置不同的服务器名账户密码,因为你开发一个项目可能你的服务器名字密码是sa sa. 但是别人的不一定是这样的,当你的项目在别人的机器上用的时候,只需要之前在添加个<add>,把别人的账户密码存放在ConnectionString中就行了,到时候在DB中把访问配置文件的名字改成刚添加的<add>中的name就行了,很方便。

 

//上面有3个判断,连接对象是否为空?连接对象的状态是否为断开?连接对象是否为关闭?

//如果是空的话,就实例化,然后在利用(Open())方法打开连接对象。

//如果在断开状态,就先关闭,在打开,一定要先关闭,断开不等于关闭,这个要注意。

//如果是关闭的话,也就是说连接对象已经实例化成功,但没有开启,要用就要开启,所以直接打开就行了。

 

//下面还有个关闭的方法

//也会做个判断 是否实例化了,没有实例化自然没有打开,如果强行关闭肯定会抛异常,所以关闭前必须做判断,当然如果本来就是关闭的状态,在去关闭肯定也会抛异常,所以我们做了这个综合性的判断,不在这两者状态下我们才去关闭连接对象。

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
C# 怎么执行SQL语句
C#进阶ADO.NET基础二 DataSet、配置文件、SqlHelper
封装?和?DataSet
C#提升性能“数据库连接打开与关闭”经验分享(附:优化过的DBHelper类) 之配餐系统的开发
DBHelper类
Visual C#中动态操作SQL Server数据库
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服