为了提高代码的复用性、易修改,避免每次访问数据库时都要进行一系列的创建连接对象、Command对象、连接字符串等。本文封装了一个数据库连接访问类SQLHelper,下面对该类进行简单的介绍:
1、类的构造函数。在构造函数中实例化一个数据库连接对象,创建连接字符串,这样做的目的是,在创建一个SQLHelper对象时就已经建立了与数据库的连接。
2、LastError属性。LastError属性是当数据库连接异常时,最后出现的异常信息。
3、HandleException方法。处理异常的方法,将产生的异常归为四类,SqlException,InvalidOperationException,DBConcurrencyException和除此三类异常之外的其他异常,并根据这四类不同异常分别对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;
/// <summary>
/// 无参构造函数
/// </summary>
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();
}
/// <summary>
/// 最近一次异常信息
/// </summary>
public static string LastError
{
get { return lastError; }
//set { lastError = value; }
}
public SqlConnection Conn
{
get { return conn; }
set { conn = value; }
}
/// <summary>
/// 通用异常处理函数
/// </summary>
/// <param name="e">需要处理的异常</param>
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);
}
}
/// <summary>
/// 无返回值的SQL语句执行
/// </summary>
/// <param name="sql">欲执行的SQL语句</param>
/// <param name="parameters">参数集合</param>
/// <returns>影响记录的行数</returns>
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;
}
/// <summary>
/// 获得离线数据集合
/// </summary>
/// <param name="sql">欲执行的SQL语句</param>
/// <param name="parameters">与SQL相关的参数</param>
/// <returns>返回查询结果集合</returns>
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;
}
/// <summary>
/// 将本地修改的结果集提交至服务器
/// </summary>
/// <param name="ds">已修改的结果集合</param>
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