从基础开始,从一个SQLHelper开始
2018-06-17 21:03:57来源:未知 阅读 ()
最开始考虑的问题有这三点:
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(); } }
}
}
对有些概念依然模糊,需要每次执行完语句就直接断开链接吗?这里面的哪些写法不对?
求各位指教。
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- Delphi10.3状态栏上显示进度条/图片 2020-06-02
- 一个托盘图标组件 2020-01-03
- Delphi-基础(例程、例程返回值) 2019-12-02
- Delphi-基础(常量、集合、数组[动态数组、多维数组]) 2019-12-02
- Delphi-基础(for循环) 2019-12-02
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash