“就不能不换DB吗?——抽象工厂模式”,没错,这是大话设计中的一章,在这一章中,大鸟教会了小菜,用配置文件改变‘DB’的值,从而改变了应用程序要访问的数据库类型。详情请见大话设计模式P157
- 我们在SQLHelper中也用到了配置文件来改变SQLHelper中数据库连接的字符串
因为我们使用的是应用程序配置文件,所以我们将配置文件添加在UI层,右击UI层->新建项->常规->应用程序配置文件,在app.config中对connstr进行赋值。
-
SQLHelper将我们日常生活中常用的四个存储过程(insert,delete,modify, select)进行了封装
- 无参,返回值为所影响行数的增删改方法
- 有参,返回值为所影响行数的增删改方法
- 无参,返回值为SqlDataReader的查方法
-
有参,返回值为SqlDataReader的查方法
<span style="font-family:Tahoma;font-size:18px;">Imports System
Imports System.Data
'需要在解决方案管理器中对SQLHelper所在的项目中添加对System.Configuration的引用
Imports System.Configuration
Imports System.Data.SqlClient
Public Class SQLHelper
Dim conn As SqlConnection
Dim cmd As SqlCommand
Dim connstr As String = ConfigurationManager.AppSettings("connstr").ToString
Public SQLHelper()
#Region "建立数据库连接对象"
''' <summary>
''' 建立数据库的连接
''' </summary>
''' <returns>返回一个数据库的连接SqlConnection对象</returns>
''' <remarks></remarks>
Public Function getSqlConnection() As SqlConnection
Try
conn = New SqlConnection(connstr) '利用配置文件,连接到connstr所指定的数据库
If (conn.State.Equals(ConnectionState.Open)) = False Then
conn.Open()
End If
Catch ex As Exception
Throw New Exception(ex.Message.ToString())
End Try
Return conn
End Function
#End Region
#Region "设置SqlCommand对象"
''' <summary>
''' 设置SqlCommand对象
''' </summary>
''' <param name="cmd">SqlCommand对象</param>
''' <param name="cmdText">命令文本</param>
''' <param name="cmdType">命令类型</param>
''' <param name="cmdParms">参数集合</param>
''' <remarks></remarks>
Public Sub SetCommand(ByVal cmd As SqlCommand, ByVal cmdText As String, ByVal cmdType As CommandType, ByVal cmdParms As SqlParameter())
cmd.Connection = conn
cmd.CommandText = cmdText
cmd.CommandType = cmdType
If (cmdParms Is Nothing) = False Then
cmd.Parameters.AddRange(cmdParms)
End If
End Sub
#End Region
#Region "无参,返回所影响的行数的增删改方法"
''' <summary>
''' 执行不带参数sql语句或存储过程,返回所影响的行数
''' </summary>
''' <param name="cmdText">增,删,改sql语句</param>
''' <returns>返回所影响的行数</returns>
''' <remarks></remarks>
Public Function ExecuteNonQuery(ByVal cmdText As String) As Int16
Dim count As Int16
Try
getSqlConnection()
cmd = New SqlCommand(cmdText, conn)
count = cmd.ExecuteNonQuery()
conn.Close()
Catch ex As Exception
Throw New Exception(ex.Message.ToString())
End Try
Return count
End Function
#End Region
#Region "有参,返回所影响的行数的增删改方法"
''' <summary>
''' 执行带参数sql语句或存储过程,返回所影响的行数
''' </summary>
''' <param name="cmdText">带参数的sql语句和存储过程名</param>
''' <param name="cmdType">命令类型</param>
''' <param name="cmdparms">参数集合</param>
''' <returns>返回所影响的行数</returns>
''' <remarks></remarks>
Public Function ExecuteNonQuery(ByVal cmdText As String, ByVal cmdType As CommandType, ByVal cmdparms As SqlParameter())
Dim count As Int16
Try
getSqlConnection()
Dim cmd As New SqlCommand
SetCommand(cmd, cmdText, cmdType, cmdparms)
count = cmd.ExecuteNonQuery()
cmd.Parameters.Clear()
conn.Close()
Catch ex As Exception
Throw New Exception(ex.Message.ToString)
End Try
Return count
End Function
#End Region
#Region "无参,具有返回值的查询方法"
''' <summary>
''' 执行不带参数sql语句,返回一个从数据源读取数据的SqlDataReader对象
''' </summary>
''' <param name="cmdText">相应的sql语句</param>
''' <returns>一个从数据源读取数据的SqlDataReader对象</returns>
''' <remarks></remarks>
Public Function ExecuteReader(ByVal cmdText As String) As SqlDataReader
Dim reader As SqlDataReader
Try
getSqlConnection()
cmd = New SqlCommand(cmdText, conn)
reader = cmd.ExecuteReader(CommandBehavior.CloseConnection)
Catch ex As Exception
Throw New Exception(ex.Message.ToString)
End Try
Return reader
End Function
#End Region
#Region "无参,具有返回值的查询方法"
''' <summary>
''' 执行带参数的sql语句或存储过程,返回一个从数据源读取数据的SqlDataReader对象
''' </summary>
''' <param name="cmdText">sql语句或存储过程名</param>
''' <param name="cmdType">命令类型</param>
''' <param name="cmdParms">参数集合</param>
''' <returns>返回一个从数据源读取数据的SqlDataReader对象</returns>
''' <remarks></remarks>
Public Function ExecuteReader(ByVal cmdText As String, ByVal cmdType As CommandType, ByVal cmdParms As SqlParameter()) As SqlDataReader
Dim reader As SqlDataReader
Try
getSqlConnection()
cmd = New SqlCommand()
SetCommand(cmd, cmdText, cmdType, cmdParms)
reader = cmd.ExecuteReader(CommandBehavior.CloseConnection)
Catch ex As Exception
Throw New Exception(ex.Message.ToString())
End Try
Return reader
End Function
#End Region
End Class</span>
光有代码,不会使用也发挥不了SQLHelper的强大之处
有参,返回值为所影响行数的增删改使用
有参,返回值为SqlDataReader的查方法的使用
从开始知道有个SQLHelper到真正实现,花了我一周的时间,可真是耗时耗力,不过我也体会到了SQLHelper的好处,SqlHelper简化了我们需要重复写的数据库连接,如SqlConnection,SqlCommand,SqlDataReader等等;还有,SqlHelper封装过后通常是只需要给方法传入一些参数如数据库连接字符串,SQL参数等,就可以访问数据库了,很方便。