最开始考虑的问题有这三点:

1.Access和SQLServer都要能用。

2.尽量简单,清晰。

3.性能不出大问题。

    public class SQLHelp
{
#region 私有域 private static string ConnStr = ConfigurationManager.ConnectionStrings["SqlConnection"].ConnectionString;
private static string ProviderType = ConfigurationManager.AppSettings["ProviderType"].ToString();
private DbConnection _Conn;
private static DbProviderFactory DbFactory=DbProviderFactories.GetFactory(ProviderType);
private DbCommand _Cmd = DbFactory.CreateCommand(); private string _CmdText;
private CommandType _CmdType;
#endregion
#region 属性
private DbConnection Conn
{
get
{ return _Conn; }
set
{ _Conn = value; }
} public DbCommand Cmd
{
get { return _Cmd; }
set { _Cmd = value; }
}
public string CmdText
{
get { return _CmdText; }
set
{
_CmdText = value;
_Cmd.CommandText = value;
}
} public CommandType CmdType
{
get { return _CmdType; }
set
{
_CmdType = value;
_Cmd.CommandType = value;
}
}
#endregion
#region 私有方法
private void OpenCon()
{
try
{
if (Conn == null)
{
Conn = DbFactory.CreateConnection();
}
if (Conn.State == ConnectionState.Closed)
{
Conn.ConnectionString = ConnStr;
Conn.Open();
}
}
catch (Exception ex)
{ throw (new Exception("打开数据库出错,错误" + ex.Message));
}
}
private void CloseCon()
{
if (Conn.State == ConnectionState.Open)
{
Conn.Close();
}
}
#endregion
/// <summary>
/// 执行指定的SQL语句(如添加、更新、删除等操作)
/// </summary>
/// <returns>受影响的行数</returns>
public int ExecuteNonQuery()
{
OpenCon();
try
{
return Cmd.ExecuteNonQuery();
}
catch (Exception ex)
{
throw (new Exception("数据库执行错误: " + ex.Message));
}
finally
{ CloseCon();
}
} /// <summary>
/// 使用 DataAdapter 提取数据返回为 DataTable,并为 DataTable 指定名称
/// </summary>
/// <returns>DataTable</returns>
public DataTable ExecuteDataTable()
{
OpenCon();
try
{
using (DbDataAdapter da =DbFactory.CreateDataAdapter())
{
da.SelectCommand = Cmd;
DataTable dt = new DataTable();
da.Fill(dt);
return dt;
}
}
catch (Exception ex)
{
throw (new Exception("数据库执行错误:" + ex.Message));
}
finally
{
CloseCon();
}
}
  }
}

写的过程发现了很多问题:每个属性该不该静态,赋初值在哪里进行,属性的写法是否合适,需不需要构造函数。最主要的疑惑:SQL语句执行完了立即释放Cmd好,还是等多条都用同一个Cmd执行好。

然后发邮件给一位学长,学长回复:

问题1、看场合决定用什么工厂,抽象工厂或工厂方法。
问题2、连接和命令都是用完立即释放。按你的做法,会一直占用数据库的连接资源,SQL SERVER的连接数本来就少,这种做法个人觉得不好。
问题3、这个问题干脆不回答了。我建议你看看ADO.NET的思想,考虑它为何提供连接后又提供断开连接。断开连接的产生就是为了让你读取完数据后马上释放连接资源。你反复连接是没问题的,因为有连接池在管理。

代码方面
异常处理我是在程序中作统一处理,辅助类中不加异常处理代码。

这是改后的第二版:

 public class SQLHelp
{
#region 私有域 private static string ConnStr = ConfigurationManager.ConnectionStrings["SqlConnection"].ConnectionString;
private static string ProviderType = ConfigurationManager.AppSettings["ProviderType"].ToString();
private DbConnection _Conn;
private static DbProviderFactory DbFactory=DbProviderFactories.GetFactory(ProviderType);
private DbCommand _Cmd; private string _CmdText;
private CommandType _CmdType = CommandType.Text;
#endregion
#region 属性
private DbConnection Conn
{
get
{ return _Conn; }
set
{ _Conn = value; }
} public DbCommand Cmd
{
get { return _Cmd; }
set { _Cmd = value; }
}
public string CmdText
{
get { return _CmdText; }
set { _CmdText = value;}
} public CommandType CmdType
{
get { return _CmdType; }
set { _CmdType = value; }
}
#endregion
#region 私有方法
private void OpenCon()
{
try
{
if (Conn == null)
{
Conn = DbFactory.CreateConnection();
}
if (Conn.State == ConnectionState.Closed)
{
Conn.ConnectionString = ConnStr;
Conn.Open();
}
}
catch (Exception ex)
{ throw (new Exception("打开数据库出错,错误" + ex.Message));
}
}
private void CloseCon()
{
if (Conn.State == ConnectionState.Open)
{
Conn.Close();
}
if (Cmd != null)
{
Cmd.Dispose();
Cmd = null;
}
}
private void StartCommend()
{
OpenCon();
Cmd = Conn.CreateCommand();
Cmd.CommandText = CmdText;
Cmd.CommandType = CmdType;
}
#endregion
/// <summary>
/// 执行指定的SQL语句(如添加、更新、删除等操作)
/// </summary>
/// <returns>受影响的行数</returns>
public int ExecuteNonQuery()
{
StartCommend();
try
{
return Cmd.ExecuteNonQuery();
}
catch (Exception ex)
{
throw (new Exception("数据库执行错误: " + ex.Message));
}
finally
{
CloseCon();
}
} /// <summary>
/// 使用 DataAdapter 提取数据返回为 DataTable,并为 DataTable 指定名称
/// </summary>
/// <returns>DataTable</returns>
public DataTable ExecuteDataTable()
{
StartCommend();
try
{
using (DbDataAdapter da =DbFactory.CreateDataAdapter())
{
da.SelectCommand = Cmd;
DataTable dt = new DataTable();
da.Fill(dt);
return dt;
}
}
catch (Exception ex)
{
throw (new Exception("数据库执行错误:" + ex.Message));
}
finally
{
CloseCon();
}
}
  }
}

对有些概念依然模糊,需要每次执行完语句就直接断开链接吗?这里面的哪些写法不对?

求各位指教。

从基础开始,从一个SQLHelper开始的更多相关文章

  1. 自己写的一个SqlHelper,感觉使用起来挺方便的

    自己写的一个SqlHelper,感觉使用起来挺方便的 using System; using System.Data; using System.Collections.Generic; using ...

  2. (C#)Windows Shell 编程系列1 - 基础,浏览一个文件夹

    原文 (C#)Windows Shell 编程系列1 - 基础,浏览一个文件夹 (本系列文章由柠檬的(lc_mtt)原创,转载请注明出处,谢谢-) Windows Shell 编程,即 Windows ...

  3. JAVA_SE基础——5.第一个Java程序HelloWorld&注释的应用

    配置完JDK&环境变量后,我们就可以开始写程序了,那么程序怎么写呢,用什么工具呢,我建议 为了方便学习,我们最好在一个磁盘下建立一个专门的文件来写java程序,比如就在D盘下建立一个名为&qu ...

  4. (C#)Windows Shell 外壳编程系列1 - 基础,浏览一个文件夹

    1 - 基础,浏览一个文件夹 我们知道,在win32中是以外壳名字空间的形式来组织文件系统的,在外壳名字空间里的每一个对象(注)都实现了一个IShellFolder的接口,通过这个接口我们可以直接查询 ...

  5. Jmeter使用基础笔记-写一个http请求

    前言 本篇文章主要讲述2个部分: 搭建一个简单的测试环境 用Jmeter发送一个简单的http请求 搭建测试环境 编写flask代码(我参考了开源项目HttpRunner的测试服务器),将如下的代码保 ...

  6. RPC基础以及造一个RPC的轮子需要注意些什么

    RPC基础以及造一个RPC的轮子需要注意些什么 前言 rpc即远程过程调用,是分布式系统常用的通信方法.远程可以是在一台机器上的不同进程或在不同一个机器上的不同进程.rpc更看重速度,像调用本地方法一 ...

  7. 【云开发】10分钟零基础学会做一个快递查询微信小程序,快速掌握微信小程序开发技能(轮播图、API请求)

    大家好,我叫小秃僧 这次分享的是10分钟零基础学会做一个快递查询微信小程序,快速掌握开发微信小程序技能. 这篇文章偏基础,特别适合还没有开发过微信小程序的童鞋,一些概念和逻辑我会讲细一点,尽可能用图说 ...

  8. Vue.js基础篇实战--一个ToDoList小应用

    距离开始学Vue已经过去一个多月了,总想把学到的东西柔和在一起,做点东西出来,于是有了这个Todolist小应用. 使用vuex 纯粹基础,没有用到web pack,vuex,npm,下次把它改造一下 ...

  9. 《Entity Framework 6 Recipes》翻译系列 (3) -----第二章 实体数据建模基础之创建一个简单的模型

    第二章 实体数据建模基础 很有可能,你才开始探索实体框架,你可能会问“我们怎么开始?”,如果你真是这样的话,那么本章就是一个很好的开始.如果不是,你已经建模,并在实体分裂和继承方面感觉良好,那么你可以 ...

随机推荐

  1. 置换贴图 Displacement Mapping

    视差贴图和法线贴图都是使用特定的手段来达到欺骗视觉的目的,让人以为物体的表面是凹凸起伏的.而置换贴图却是真的将模型的顶点进行偏移,在原本的平面上创造出凹凸的效果.既然是对顶点进行偏移,那么就需要模型有 ...

  2. Laxcus大数据管理系统2.0(10)- 第八章 安全

    第八章 安全 由于安全问题对大数据系统乃至当前社会的重要性,我们在Laxcus 2.0版本实现了全体系的安全管理策略.同时我们也考虑到系统的不同环节对安全管理的需求是不一样的,所以有选择地做了不同的安 ...

  3. [codevs5578][咸鱼]tarjan/结论题

    5578 咸鱼  时间限制: 1 s  空间限制: 128000 KB   题目描述 Description 在广袤的正方形土地上有n条水平的河流和m条垂直的河流,发达的咸鱼家族在m*n个河流交叉点都 ...

  4. 如何创建下拉列表为一个树列表?(此文为dev控件中,服务器控件暂不知,但想方法应该都差不多吧)

    //前端控件代码:<dx:ASPxDropDownEdit ID="drop_treelist" runat="server" ClientInstanc ...

  5. android style 中一些颜色的定义

    colorControlNormal 单选多选等控件颜色 colorControlActivated 单选多选等控件激活颜色

  6. 实用防火墙(Iptables)脚本分析

    实用防火墙(Iptables)脚本分析 --Redhat,CentOS,Ubuntu等常见Linux发行版中都会预装Iptables防火墙,大多数初学者设置起来由于对这款软件比较陌生,设置起来比较困难 ...

  7. PC上安装MAC X Lion

    PC上安装MACXLion 网上关于如何在PC下安装MAC的文章已近不少了,但对于一些初学者在实践当中会遇到各种问题,以下视频资料为大家展示两种虚拟机安装MacOS. 1.VmwareWorkstat ...

  8. 【drp 10】JSP页面中model1和model2的区别

    一.基本概念 1.1,model1 model1的开发模式是:jsp+javabean的模式,它的核心是JSP页面,在这个页面中,jsp页面负责整合页面和javabean(业务逻辑),而且渲染页面.它 ...

  9. 使用throws抛出异常

    声明抛出异常实在一个方法声明的throws子句中指明的.throws子句方法的基本形式如下.方法 throws 异常列表{ }throws子句中可以指明多个异常,说明该方法不对这些异常进行处理,而是抛 ...

  10. jQuery插件开发方式

    一.jQuery扩展 1.$.extend(object) 类似于.Net的扩展方法,用于扩展jQuery.然后就可以用$.的方式调用. $(function(){ $.extend({ fun1: ...