在这个大数据的今天,我们无时无刻不再对数据进行着操作,即使一个简单的小系统,也会有10张表左右,更别说如果我们在面对一个大的项目的时候,上百张表是常有的事情,如果我们对每一张表都实现一个简单的操作,那么我们就意味着要连接上百次数据库。
那么如果我们是第一次连接数据库,我想大家会这么写。
Imports System.Data.SqlClient Public Class UserDB '数据库连接语句 Dim str As String = "Data Source=localhost;Initial Catalog=Charge;Persist Security Info=True;User ID=sa;Password=123456" Dim conn As SqlClient.SqlConnection Public Sub New() '构造函数 建立连接,打开数据库 conn = New SqlClient.SqlConnection conn.ConnectionString = str conn.Open() End Sub '查询数据库中的用户是否存在 Public Function Query_User(ByVal tstUser As Model.User) As Boolean '数据库查询语句 Dim sqlstr As String sqlstr = "Select * From user_info Where user_id='" & tstUser.user_id & "' And user_PWD = '" & tstUser.user_pwd & "'" '查询 Dim sqlcmd As SqlClient.SqlCommand = New SqlClient.SqlCommand(sqlstr, conn) Dim myReader As SqlDataReader '定义一个reader用来读数据 myReader = sqlcmd.ExecuteReader() '运行你的查询,结果到myReader If myReader.Read() Then '如果查到了数据 Return True Else Return False End If End Function End Class那么如果我们要连接次数是上百次,那么代码除了SQL语句,百分之90是一样的,如果我们每次都去重新写一遍的话感觉浪费功夫,如果我们是每次都复制的话,又会增加出BUG的概率,所以我们就得想办法,让我们每次的操作尽可能少。所有便有了几天的SQLHelper这个类,他是对上边的代码找到了每次出现连接数据库后的相同点的总结。
/* * 创建人: 孟海滨 * 创建时间:2014年11月13日 16:42:40 * 说明:数据库助手类 */ using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Data.SqlClient; using System.Data; using System.Configuration; namespace DAL { public class SQLHelper { private SqlConnection conn = null; private SqlCommand cmd = null; private SqlDataReader sdr = null; public SQLHelper() { string connStr = ConfigurationManager.ConnectionStrings["connStr"].ConnectionString; conn = new SqlConnection(connStr); } private SqlConnection getConn() { if (conn.State==ConnectionState.Closed) { conn.Open(); } return conn; } /// <summary> /// 执行不带参数的增删改SQL语句或存储过程 /// </summary> /// <param name="cmdText"></param> /// <param name="ct"></param> /// <returns></returns> public int ExecuteNonQuery(string cmdText, CommandType ct) { int res; try { cmd = new SqlCommand(cmdText, getConn()); cmd.CommandType = ct; res = cmd.ExecuteNonQuery(); } catch (Exception ex) { throw ex; } finally { if (conn.State == ConnectionState.Open) { conn.Close(); } } //string sql="insert into category(name) values('nsdf')"; return res; } /// <summary> /// 执行带参数的增删改SQL语句或存储过程 /// </summary> /// <param name="cmdText">sql语句或者存储过程</param> /// <param name="ct">命令类型</param> /// <returns></returns> public int ExecuteNonQuery(string cmdText,SqlParameter[] paras, CommandType ct) { int res; using(cmd=new SqlCommand(cmdText,getConn())) { cmd.CommandType=ct; cmd.Parameters.AddRange(paras); cmd.CommandType = ct; res = cmd.ExecuteNonQuery(); } return res; } /// <summary> /// 执行带参数的查询SQL语句或存储过程 /// </summary> /// <param name="cmdText">sql或存储过程</param> /// <param name="paras">参数</param> /// <param name="ct">类型</param> /// <returns></returns> public DataTable ExecuteQuery(string cmdText,SqlParameter[] paras,CommandType ct) { DataTable dt = new DataTable(); cmd = new SqlCommand(cmdText, getConn()); cmd.CommandType = ct; cmd.Parameters.AddRange(paras); using (sdr = cmd.ExecuteReader(CommandBehavior.CloseConnection)) { dt.Load(sdr); } return dt; } /// <summary> ///该方法执行带参数的sql或存储过程的查询 /// </summary> /// <param name="cmdText">sql语句或</param> /// <param name="paras">参数</param> /// <param name="ct">类型</param> /// <returns></returns> public DataTable ExecuteQuery(string cmdText,CommandType ct) { DataTable dt = new DataTable(); cmd = new SqlCommand(cmdText, getConn()); cmd.CommandType = ct; using (sdr = cmd.ExecuteReader(CommandBehavior.CloseConnection)) { dt.Load(sdr); } return dt; } } }顺便说一下,这里之所以用三个///这个来注释,是因为我们在写代码的时候,如果把鼠标放在一个方法上,上边会出来相应的解释,其实就是这三个斜杠的作用。 Using(sdr=cmd.ExecuteReader(CommandBehavior.CloseConnection))这句相当于判断是否连接,如果连接,完事后会自动关闭,从而省去了手动判断的过程。
在机房收费系统的时候就用过,但是当时不理解,就直接从网上当了一份,但是这次是跟着视频好好的学习了一遍,也照着敲了一般,敲的过程中最大的感慨就是抽象无处不再,会抽象,工作才高效,才简单。