数据连接、断开及操纵封装类SQLHelper

    为了提高代码的复用性、易修改,避免每次访问数据库时都要进行一系列的创建连接对象、Command对象、连接字符串等。本文封装了一个数据库连接访问类SQLHelper,下面对该类进行简单的介绍:

1、类的构造函数。在构造函数中实例化一个数据库连接对象,创建连接字符串,这样做的目的是,在创建一个SQLHelper对象时就已经建立了与数据库的连接。

2、LastError属性。LastError属性是当数据库连接异常时,最后出现的异常信息。

3、HandleException方法。处理异常的方法,将产生的异常归为四类,SqlExceptionInvalidOperationExceptionDBConcurrencyException和除此三类异常之外的其他异常,并根据这四类不同异常分别对LastError属性赋予相应的异常信息。该方法为静态方法,有一个参数类型为Exception的参数。

4、ExecuteNonQuery方法。执行不返回结果集的SQL语句的方法,该方法参数中有一个待执行的SQl语句和与SQL语句相关的可变参数数组,是静态方法,程序不要求有任何返回值,但在定义此方法时返回了数值类型,用来表示执行当前语句后数据库中被影响的行数,但在程序的调用中可以不返回值,直接调用方法,若目标记录不存在返回0,出错返回-1,产生异常时显示异常信息。

5、ExecSQLByDataSet方法。该方法执行SQl语句,返回DataSet数据集合,参数中有一个待执行的SQl语句和与SQL相关的可变参数数组。该方法的优点是:通过直接调用此方法获得所需的DataSet数据集,而不需要每次都创建SqlDataAdapter对象来进行填充数据,提高了代码的复用性。该方法如出错返回null,出现异常时显示异常信息,为静态方法。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SqlClient;
using System.Data;
using System.Windows.Forms;

namespace SpecialEquipmentManagement
{
    class SQLHelper
    {        
        private static string lastError;//最近一次异常信息,定义为静态字段,方便被静态方法引用
        private SqlConnection conn;

        /// 
        /// 无参构造函数
        /// 
        public SQLHelper()
        {
            string str = @"Data Source=127.0.0.1;Initial Catalog=DBSpeEquManagement;Integrated Security=true";
            this.conn = new SqlConnection();//实例化一个数据连接对象
            this.conn.ConnectionString = str;
        }

        public void OpenDB()
        {
            this.conn.Open();
        }

        public void CloseDB ()
        {
            this.conn.Close();
        }

        /// 
        /// 最近一次异常信息
        /// 
        public static string LastError
        {
            get { return lastError; }
            //set { lastError = value; }
        }

        public SqlConnection Conn
        {
            get { return conn; }
            set { conn = value; }
        }

        /// 
        /// 通用异常处理函数
        /// 
        /// 需要处理的异常
        private static void HandleException(Exception e)
        {
            if (e is SqlException)
            {
                lastError = string.Format("在打开连接时出现连接级别的错误:{0}", e.Message);
            }
            else if (e is InvalidOperationException)
            {                
                lastError = e.Message;
            }
            else if (e is DBConcurrencyException)
            {
                //数据并发异常
                lastError = string.Format("尝试执行 INSERT、UPDATE 或 DELETE 语句,但没有记录受到影响:{0}", e.Message);
            }
            else
            {
                lastError = string.Format("未预料的异常:{0}", e.Message);
            }
        }
              
        /// 
        /// 无返回值的SQL语句执行
        /// 
        /// 欲执行的SQL语句
        /// 参数集合
        /// 影响记录的行数
        public static int ExecuteNonQuery(string sql, params SqlParameter[] parameters)
        {
            string str = @"Data Source=127.0.0.1;Initial Catalog=DBSpeEquManagement;Integrated Security=true";
            using (SqlConnection conn = new SqlConnection(str))
            {
                try
                {
                    //Open异常捕获
                    conn.Open();
                    using (SqlCommand cmd = conn.CreateCommand())
                    {
                        cmd.CommandText = sql;
                        foreach (SqlParameter param in parameters)
                        {
                            cmd.Parameters.Add(param);
                        }
                        return cmd.ExecuteNonQuery();
                    }
                }
                catch (Exception ex)
                {

                    HandleException(ex);
                    MessageBox.Show(SQLHelper.LastError);
                }
            }
            return -1;
        }

        /// 
        /// 获得离线数据集合
        /// 
        /// 欲执行的SQL语句
        /// 与SQL相关的参数
        /// 返回查询结果集合
        public static DataSet ExecSQLByDataSet(string sql, params SqlParameter[] parameters)
        {
            //parameters是可变的数组参数
            string str = @"Data Source=127.0.0.1;Initial Catalog=DBSpeEquManagement;Integrated Security=true";
            using (SqlConnection conn = new SqlConnection(str))
            {
                try
                {
                    conn.Open();//打开数据库连接
                    using (SqlCommand cmd = conn.CreateCommand())
                    {
                        cmd.CommandText = sql;
                        foreach (SqlParameter parameter in parameters)
                        {
                            cmd.Parameters.Add(parameter);
                        }
                        SqlDataAdapter da = new SqlDataAdapter(cmd);
                        DataSet ds = new DataSet();
                        da.Fill(ds);
                        conn.Close();//有必要关闭数据库连接的吗?
                        return ds;
                    }
                }
                catch (Exception ex)
                {
                    HandleException(ex);
                    MessageBox.Show(SQLHelper.LastError);
                }
            }
            return null;
        }

        /// 
        /// 将本地修改的结果集提交至服务器
        /// 
        /// 已修改的结果集合
        public static void UpdateByDataSet(DataSet ds)
        {
            string str = @"Data Source=127.0.0.1;Initial Catalog=DBSpeEquManagement;Integrated Security=true";
            using (SqlConnection conn = new SqlConnection(str))
            {
                conn.Open();
                using (SqlCommand cmd = conn.CreateCommand())
                {
                    SqlDataAdapter da = new SqlDataAdapter(cmd);
                    new SqlCommandBuilder(da);
                    da.ContinueUpdateOnError = true;
                    try
                    {                        
                        da.Update(ds);
                    }
                    catch (Exception ex)
                    {
                        HandleException(ex);
                        MessageBox.Show(SQLHelper.LastError);
                    }
                }
            }
        }
    }
}

 自己参考博客改写的一个数据库简易封装类,水平有限,有什么问题希望朋友们指出!

参考博客:http://www.cnblogs.com/ForDream/archive/2011/07/28/2119834.html

你可能感兴趣的:(C#)