思维导图
开始听到有人说sqlhelper类,sqlhelper层,看其他人的总结博客大部分都在说写一个sqlhelper封装了增删改查的数据操作,减少了代码量,大大方便了数据库操作,很好用,然后百度后有专门的百度百科进行讲解:SqlHelper是一个基于.NET Framework的数据库操作组件。组件中包含数据库操作方法。SqlHelper用于简化你重复的去写那些数据库连接(SqlConnection),SqlCommand,SqlDataReader等等。SqlHelper 封装过后通常是只需要给方法传入一些参数如数据库连接字符串,SQL参数等,就可以访问数据库了,很方便,看到这个解释后便去找这个组件结果没有找到sqlhelper到底是自己写出来的一个呢还是系统自带的呢sqlhelper到底是一个类还是一层,应该放在哪解决这两个问题最好的办法就是把巨人的思想结晶先拿过来,在实践中去体会其中的奥妙,现在的理解:
sqlhelper即sql+helper合成,我们在编程的起名中有一个基本的规定就是见名知义,sql语句是用来对数据库进行增删改查的语句,而查询与增删改无非两类,一个是有参数的,一个是无参数的,但每一次和数据库打交道的语句是一样的,怎样能减少重复的代码,提高效率呢,helper帮助者sqlhelper就起到了这个作用,帮助我们减少重复的sql语句的敲写。
vs自身带的还是自己编写的呢,VS中我们用到的大多数对象也不是凭空生成的,而是开发人员根据使用频率将一些常用的进行了封装,所以我们只用进行引用就能直接使用,sqlhelper目前还是我们自己进行封装的一个类,即自己写四个方法就可以了,这四个方法就是有参和无参的增删改查,网上也有一些封装好了的sqlhelper,也可以引用,感觉不如自己写方便
sqlhelper首先是一个类,剩下的就要看把它放到什么位置上了,所以sqlhelper算不算一层,就看自己的设计逻辑了
<strong><span style="font-size:18px;"></pre><pre name="code" class="vb"><strong><span style="font-size:18px;">Imports System.Data Imports System.Data.SqlClient Imports System.Configuration '************************************************* '作者:李建敏 '说明:封装增删改查的操作,在DAL层之间调用即可 '创建日期:2016-2-14 '版本号:1.00 '********************************************** Public Class sqlHelper '通过配置文件来进行数据库链接字符串的值传递 Private ReadOnly strConnection As String = ConfigurationSettings.AppSettings("ConnStr") 'sqlconnection表示一个可以到SqlServer数据库的打开的链接 Dim conn As New SqlConnection(strConnection) 'sqlcommand表示对SqlServer执行的一个T-sql语句或存储过程 Dim cmd As New SqlCommand ''' <summary> ''' 执行增删改三个操作,(无参)返回值为Boolean类型,确认是否执行成功 ''' </summary> '''<param name="cmdText">需要执行语句,一般是Sql语句,也有存储过程</param> ''' <returns>Interger,受影响的行数</returns> '''<remarks></remarks> Public Function ExecAddDelUpdateNo(ByVal cmdText As String, ByVal cmdType As CommandType) As Boolean '将该函数形参赋给cmd命令已达到预期的功能 cmd.CommandText = cmdText '将接收到的sql语句传递进来 cmd.CommandType = cmdType '设置sql语句如何解释,有三种默认文本,表和存储过程 cmd.Connection = conn '进行数据库的链接 Try conn.Open() '打开数据库链接 Return cmd.ExecuteNonQuery Catch ex As Exception MsgBox(ex.Message, "数据库操作") Return False Finally Call CloseConn(conn) '调用一个过程来关闭数据库链接,不然会进行报错 Call CloseCmd(cmd) End Try End Function ''' <summary> ''' 执行增删改三个操作,(有参)返回值为Boolean类型,确认是否执行成功 ''' </summary> '''<param name="cmdText">需要执行语句,一般是Sql语句,也有存储过程</param> ''' <param name="paras">参数数组,无法确认有多少参数</param> ''' <returns></returns> '''<remarks>2016-2-14 21:47:15</remarks> Public Function ExecAddDelUpdate(ByVal cmdText As String, ByVal cmdType As CommandType, ByVal paras As SqlParameter()) As Boolean cmd.Parameters.AddRange(paras) cmd.CommandText = cmdText cmd.CommandType = cmdType cmd.Connection = conn Try conn.Open() Return cmd.ExecuteNonQuery() cmd.Parameters.Clear() Catch ex As Exception MsgBox(ex.Message, , "数据库操作") Return False Finally Call CloseConn(conn) Call CloseCmd(cmd) End Try End Function ''' <summary> ''' 执行查询操作,(有参),返回值为datatable类型,参数不限 ''' </summary> '''<param name="cmdText">需要执行语句,一般是Sql语句,也有存储过程</param> '''<param name="paras">传入的参数</param> ''' <returns></returns> '''<remarks></remarks> Public Function Execselect(ByVal cmdText As String, ByVal cmdType As CommandType, ByVal paras As SqlParameter()) As DataTable 'sqldataadapter用于更新sql数据库的一组命令和一个sql链接 Dim sqladaper As New SqlDataAdapter '实例化一个表对象 Dim dt As New DataTable Dim ds As New DataSet '将函数的形参传递给cmd以便达到相应的功能 cmd.CommandText = cmdText '传入接收到的sql语句 cmd.CommandType = cmdType <span style="font-family: Arial, Helvetica, sans-serif;"> '设置sql语句解释类型</span> cmd.Connection = conn cmd.Parameters.AddRange(paras) '所需要的参数传入 sqladaper = New SqlDataAdapter(cmd) '目前还不是能很好的理解 Try sqladaper.Fill(ds) dt = ds.Tables(0) '从表的第0行开始搜索将符合的值赋值给dt cmd.Parameters.Clear() '将参数清楚等待下一个参数的传入 Catch ex As Exception MsgBox(ex.Message, , "数据库操作") Finally Call CloseCmd(cmd) End Try Return dt '返回查询到的内容 End Function ''' <summary> ''' 执行查询操作,(无参),返回值为datatable类型 ''' </summary> '''<param name="cmdText">需要执行语句,一般是Sql语句,也有存储过程</param> '''<param name="cmdType">判断Sql语句的类型,一般都不是存储过程</param> ''' <returns>dataTable,查询到的表格</returns> '''<remarks></remarks> Public Function ExecSelectNo(ByVal cmdText As String, ByVal cmdType As CommandType) As DataTable Dim sqlAdapter As SqlDataAdapter Dim dt As New DataTable Dim ds As New DataSet cmd.CommandText = cmdText cmd.CommandType = cmdType cmd.Connection = conn sqlAdapter = New SqlDataAdapter(cmd) Try sqlAdapter.Fill(ds) dt = ds.Tables(0) Catch ex As Exception MsgBox(ex.Message, , "数据库操作") Finally Call CloseCmd(cmd) End Try Return dt End Function ''' <summary> ''' 关闭连接 ''' </summary> '''<param name="conn ">需要关闭的连接</param> '''<remarks></remarks> Public Sub CloseConn(ByVal conn As SqlConnection) If (conn.State <> ConnectionState.Closed) Then '如果没有关闭 conn.Close() '关闭连接 conn = Nothing '不指向原对象 End If End Sub ''' <summary> ''' 关闭命令 ''' </summary> '''<param name="cmd ">需要关闭的命令 </param> '''<remarks></remarks> Public Sub CloseCmd(ByVal cmd As SqlCommand) If Not IsNothing(cmd) Then '如果cmd命令存在 cmd.Dispose() '销毁 cmd = Nothing End If End Sub End Class</span></strong> </span></strong>
<strong><span style="font-size:18px;"></pre><pre name="code" class="vb"></span></strong>
第一次看见这段代码没有任何头绪,跟着注释敲了一遍,知道了大体它是如何工作,可以看出好像挺复杂,其实就是四个函数然后,在D层传进其所需要的cmdText,cmdType,sqlparams即可,它是如何具体工作的就不懂了,然而我们在仔细一分析,就会发现这些东西似曾相识——ADO七个对象
三个独立对象:Connection对象(用于数据库链接),Command对象(执行相关sql语句和存储过程),Recordset对象(获得记录集)
四个非独立对象:Error对象(connection),parameter对象(command),Field对象(recordset),Property对象(connection,command,recordset,field)
具体详解请见另一篇博客,大体是如何工作的就有一个微观的认识了
在这中还有一个新接触的类SqlDataAdapter, DataSet和 SQL Server之间的桥接器,。SqlDataAdapter通过对数据源使用适当的Transact-SQL语句映射 Fill(它可填充DataSet中的数据以匹配数据源中的数据)和 Update(它可更改数据源中的数据以匹配 DataSet中的数据)来提供这一桥接。
具体的研究可参考:https://msdn.microsoft.com/zh-cn/library/system.data.sqlclient.sqldataadapter.aspx
sqlhelper是一个自己封装好在D层进行数据库访问时一个很好用的类吗,数据库一般不打开的话可读不可写,这四个方法的写法也是一个收获,复习了一下ADO七个对象,认识了一个新的类sqlDataAdaper,不足也基本就是收获的东西还只是停留在理论上,没有自己进行一个小例子去实践中在深入一点