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

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. Windows操作 - Photoshop为图片添加透明立体水印

    原文地址:http://design.yesky.com/photoshop/252/2427752.shtml 本文我们介绍用Photoshop为图片添加透明立体水印的方法和技巧. 原图: 打开原图 ...

  2. Android打造带透明圆弧的ImageView

    这几天因为项目需求,需要在ImageView上面叠加一层透明圆弧,并且在沿着圆弧的方向显示相应的文字,效果如下图所示: 拿到这个需求,首先想到的是自定义一个ImageView来实现此功能,即在onDr ...

  3. 浅析人脸检测之Haar分类器方法

    一.Haar分类器的前世今生 人脸检测属于计算机视觉的范畴,早期人们的主要研究方向是人脸识别,即根据人脸来识别人物的身份,后来在复杂背景下的人脸检测需求越来越大,人脸检测也逐渐作为一个单独的研究方向发 ...

  4. 机器学习算法一:K-近邻算法

    最近在<机器学习实战>里学习了一些基本的算法,对于一个纯新手我也在网上找了写资料,下面就我在书上所看的加上在其他博客上的内容做一个总结,博客请参照http://www.cnblogs.co ...

  5. Python批量插入SQL Server数据库

    因为要做性能测试,需要大量造数据到数据库中,于是用python写了点代码去实现,批量插入,一共四张表 简单粗暴地插入10万条数据 import pymssql import random __auth ...

  6. ApplePay

    ApplePay要在项目有里配置,,配置好项目之后,就剩下编码了,做ApplePay首先要检查设备是否支持ApplePay,支持 ApplePay的设备在 iPhone6及以后,  PKPayment ...

  7. php get传递数据

    url:?goods[]=924&goods[]=967&goods[]=993 <?php  if($_GET){            print_r($_GET);  } ...

  8. 可视化数据包分析工具-CapAnalysis

    可视化数据包分析工具-CapAnalysis 我们知道,Xplico是一个从pcap文件中解析出IP流量数据的工具,本文介绍又一款实用工具-CapAnalysis(可视化数据包分析工具),将比Xpli ...

  9. JS与JQ倒计时的写法

    页面需要制作一个倒计时的功能:然后度娘了一遍,找到两种写法,原生JS与JQ 的,经过测试原生JS在IE可能会有不刷新的现象所以结合了一个大神的JQ写法修改好了一个. 原生JS写法: HTML: < ...

  10. [my]_ubuntu12.10_/etc/apt/sources.list

    deb http://mirrors.163.com/ubuntu/ precise main universe restricted multiverse deb-src http://mirror ...