上次文章中说到。对于一个项目来说,sqlHelper是一个很重要的类。
在正在构造的机房收费系统中。有大量的操作数据库的操作。如今,把重复的代码全部拿出来,就形成了sqlHelper类。这个sqlHelper执行参数化查询。至于使用,只需要提供相应的sql语句和参数。就可以执行数据库的操作了。
实现声明一下啊。这个例子 我也不知道能不能用在机房收费系统上。刚学完设计模式,突发奇想在数据库的链接上,加上了一个单例模式。如果出现什么不显示的情况,请联系我。
接下来看一下,sqlHelper是如何写的。以及如何在D层中使用的。
- Imports System.Data.sqlClient
- Imports System.Configuration
- Public NotInheritable Class sqlHelper
- ''' <summary>
- ''' 定义连接对象 和 cmd 命令
- ''' </summary>
- ''' <remarks></remarks>
- Dim Connsql As sqlConnection '连接字符串
- Dim cmdsql As New sqlCommand
- '创建链接,使用自己的链接方式(也算是一个单例模式吧)
- Public Sub New()
- Connsql = sqlConnectionDAL.GetConn '使用自己的sqlconnection
- End Sub
- ''' <summary>
- ''' 带参数的查询
- ''' </summary>
- ''' <param name="strText">sql语句</param>
- ''' <param name="cmdType">查询类型</param>
- ''' <param name="sqlParams">句子中的参数</param>
- ''' <returns></returns>向数据库 提取 指定的数据
- ''' <remarks></remarks>
- Public Function Query(ByVal strText As String,ByVal cmdType As CommandType,ByVal sqlParams As sqlParameter()) As DataTable
- Dim sqlAdapater As sqlDataAdapter
- Dim dtsql As New DataTable
- Dim dssql As New DataSet
- cmdsql.CommandText = strText
- cmdsql.CommandType = cmdType
- cmdsql.Connection = Connsql
- cmdsql.Parameters.AddRange(sqlParams)
- sqlAdapater = New sqlDataAdapter(cmdsql)
- Try
- sqlAdapater.Fill(dssql)
- dtsql = dssql.Tables(0)
- cmdsql.Parameters.Clear()
- Catch ex As Exception
- MsgBox(ex.Message,CType(vbOKOnly + MsgBoxStyle.Exclamation,MsgBoxStyle),"警告")
- End Try
- Return dtsql
- End Function
- ''' <summary>
- ''' 无参数的查询
- ''' </summary>
- ''' <param name="strText">sql语句</param>
- ''' <param name="cmdType">查询类型</param>
- ''' <returns></returns>主要是向数据库中取数据,用来使用
- ''' <remarks></remarks>
- Public Function QueryNo(ByVal strText As String,ByVal cmdType As CommandType) As DataTable
- Dim sqlAdapater As sqlDataAdapter
- Dim dtsql As New DataTable
- Dim dssql As New DataSet
- cmdsql.CommandText = strText
- cmdsql.CommandType = cmdType
- cmdsql.Connection = Connsql
- '添加参数
- sqlAdapater = New sqlDataAdapter(cmdsql)
- Try
- sqlAdapater.Fill(dssql)
- dtsql = dssql.Tables(0)
- cmdsql.Parameters.Clear()
- Catch ex As Exception
- MsgBox(ex.Message,"警告")
- End Try
- Return dtsql
- End Function
- ''' <summary>
- ''' 带参数的增删改
- ''' </summary>
- ''' <param name="strText">sql语句</param>
- ''' <param name="cmdType">查询类型:有参数的增删改</param>
- ''' <param name="sqlParams">参数</param>
- ''' <returns></returns>执行成功返回true
- ''' <remarks></remarks>
- Public Function UpdDelAlter(ByVal strText As String,ByVal sqlParams As sqlParameter()) As Boolean
- cmdsql.CommandText = strText
- cmdsql.CommandType = cmdType
- cmdsql.Connection = Connsql
- '添加参数
- cmdsql.Parameters.AddRange(sqlParams)
- Dim flag As Boolean
- Try
- flag = cmdsql.ExecuteNonQuery
- cmdsql.Parameters.Clear()
- Return flag
- Catch ex As Exception
- Return False
- End Try
- End Function
- End Class
在上面的例子中,还缺少那个 单例模式。如果感觉不合适的,请自行编写一个数据库的连接方式就可以了。
- Imports System.Data.sqlClient
- ''' <summary>
- ''' 连接字符串 数据库 使用单例模式
- ''' </summary>
- ''' <remarks></remarks>赵崇 14-5-17
- Public Class sqlConnectionDAL
- ''' <summary>
- ''' 定义一个连线字符串
- ''' </summary>
- ''' <remarks></remarks>赵崇 14-5-17
- Private Shared ReadOnly strLink As String = System.Configuration.ConfigurationManager.AppSettings("ConnStr")
- Public Shared conn As sqlConnection = Nothing
- '创建一个静态 只读进程 辅助对象
- Public Shared ReadOnly syncRoot As New Object
- ''' <summary>
- ''' 私有构造函数,外部代码不能使用
- ''' </summary>
- ''' <remarks></remarks>
- Private Sub New()
- End Sub
- Public Shared ReadOnly Property GetConn() As sqlConnection
- Get
- If conn Is Nothing Then
- SyncLock syncRoot '锁,确保只有一个链接可使用
- If conn Is Nothing Then
- conn = New sqlConnection(strLink)
- conn.Open()
- End If
- End SyncLock
- ElseIf conn.State = ConnectionState.Closed Then
- conn.Open()
- ElseIf conn.State = ConnectionState.Broken Then
- conn.Close()
- conn.Open()
- End If
- Return conn
- End Get
- End Property
- End Class
对于以上,项目的sqlHelper就编写完成了。只需要使用就可以了。至于使用。在D层的实现,这里只写一个例子。
咱们就写一个看看吧。
- ''' <summary>
- ''' 获取用户表中的用户级别信息
- ''' </summary>
- ''' <returns></returns>
- ''' <remarks></remarks>
- Function GetTable() As DataTable Implements IDAL.IUser.GetUserTable
- Dim strsql As String = "Select distinct Level as [用户级别] from User_Info Des"
- Dim helper As New sqlHelper
- Dim dtUser = helper.QueryNo(strsql,CommandType.Text)
- Return dtUser
- End Function
删除用户表:(更新 修改 等等 只需要替换相应的sql语句 和参数 即可实现)
- ''' <summary>
- ''' 删除用户
- ''' </summary>
- ''' <param name="user">用户信息</param>
- ''' <returns></returns>返回true表示删除成功,返回false表示删除失败
- ''' <remarks></remarks>赵崇 14-5-21
- Public Function DeleteUser(ByVal user As UserEntity) As Boolean Implements IDAL.IUser.DeleteUser
- Dim strsql As String
- strsql = "Delete from User_Info where UserID=@UserID"
- Dim helper As New sqlHelper
- Dim sqlparameter As sqlParameter() = {New sqlParameter("@UserID",user.UserID)}
- Dim flag As Boolean
- flag = helper.UpdDelAlter(strsql,CommandType.Text,sqlparameter)
- Return flag
- End Function
通过上面的例子,你会发现,在于数据库进行操作的时候,仅仅提供sql语句 加 参数。就可以达到自己的目的。sqlHelper类,一次编写,到处使用。大量的节省代码。
对于使用三层架构的程序,编写代码的时候,脑子里只有 对象及其方法。在U层写代码的时候,不需要考虑B层的实现过程,只知道B层的返回结果就可以了。