上一篇博客:《vb.net如何编写高效率的SqlHelper——(一)基础篇》
咱们谈到了很多关系ADO.net的基础知识,那些是看懂本篇文章的前提。所以童鞋们有必要好好看看哦。
本篇选取了最常用的几个方法,而且尽可能的简单化,灵活化(用到了函数重载和读取配置文件)
好了,废话不多说,直接上代码。
'*************************************************
'作者:刘文彬
'小组:
'说明:利用函数重载,配置文件读取使得程序更加灵活
'创建日期:2015-4-27
'版本号:v1.4
'*************************************************
Imports System.Data
Imports System.Data.sqlClient
Imports System.Configuration
Public Class sqlHelperDAL
'全局配置:连接字符、定义一个cnn,cmd
'增删改,有参数/无参数
'查,有参数/无参数
'全局配置
'连接字符串
'Dim ConnectionString As String = "Server=Bill\MysqL;Database=Charge_System;User ID=sa;Password="
'初始化sqlconnection 对象
Dim cnn As New sqlConnection(Configuration.ConfigurationSettings.AppSettings("ConnectionString")) '读取配置文件,获得ConnectionString的值
Dim cmd As New sqlCommand
#Region "有参增删改ExcuteNoQuery,不返回数据行,返回integer型数据表示受影响的行数。此函数被重载"
''' <summary>
''' 执行 增删改的数据库操作(有参数版)
''' </summary>
''' <param name="cmdText"></param>命令的文本
''' <param name="cmdType"></param>命令的类型
''' <param name="sqlParams"></param>要执行的sql语句集,无法确定具体条数
''' <returns></returns>整型值,表示受影响的行数
''' <remarks></remarks>
Public Function ExcuteNoQuery(ByVal cmdText As String,ByVal cmdType As CommandType,ByVal sqlParams As sqlParameter()) As Integer
'逐条将数组sqlParams中的参数添加到Parameters中
cmd.CommandType = cmdType '将命令的类型传给commandtype
cmd.Connection = cnn '为执行连接命令的参数connection赋值
cmd.CommandText = cmdText '将sql语句赋值给执行命令的文本commandtext
Try
cmd.Parameters.Clear() '清除参数
'如果存在sqlparams参数,则添加到cmd对象中
If Not IsNothing(sqlParams) Then
cmd.Parameters.AddRange(sqlParams)
End If
'如果没有打开连接,则打开连接
If cnn.State = ConnectionState.Closed Then
cnn.Open()
End If
Return cmd.ExecuteNonQuery '执行操作
Catch ex As Exception
Return 0
Finally
ConnectionClose(cnn)
CommandClose(cmd)
End Try
End Function
#End Region
#Region "无参增删改操作,不返回数据行,返回Integer类型数据表示受影响行数重载ExcuteNoQuery"
''' <summary>
''' 执行返回受影响的行数,此处是重载ExcuteNoQuery方法。
''' </summary>
''' <param name="cmdText"></param>要执行的sql文本命令,或者存储过程名
''' <param name="cmdType"></param>要执行的命令的类型,sql文本命令或者存储过程名
''' <returns></returns>Integer类型的数,表示受影响的行数
''' <remarks></remarks>
Public Function ExuteNoQuery(ByVal cmdText As String,ByVal cmdType As CommandType) As Integer
Return ExcuteNoQuery(cmdText,cmdType,Nothing)
End Function
#End Region
#Region "无参版,返回第一行第一列的值"
Public Function ExcuteScalar(ByVal cmdText As String,cmdType As CommandType) As Object
Return ExcuteScalar(cmdText,Nothing)
End Function
#End Region
#Region "获取第一行的第一列的值,有参版,该方法被重载"
Public Function ExcuteScalar(ByVal cmdText As String,sqlParams As sqlParameter()) As Object
Dim result As Object = Nothing
cmd.Connection = cnn
cmd.CommandType = cmdType
cmd.CommandText = cmdText
Try
'如果状态没有打开则,进行连接打开操作
If cnn.State = ConnectionState.Closed Then
cnn.Open()
End If
'如果非空则进行参数的全部添加
If Not IsNothing(sqlParams) Then
cmd.Parameters.AddRange(sqlParams)
End If
result = cmd.ExecuteScalar
Return result
Catch ex As Exception
Throw New Exception("ExcuteScalar错误:",ex)
Finally
ConnectionClose(cnn)
CommandClose(cmd)
End Try
End Function
#End Region
#Region "查询操作,返回datetable,被重载的函数ExcuteSelect"
''' <summary>
''' 执行查询的操作,有参版
''' </summary>
''' <param name="cmdText"></param>要执行的sql命令文本
''' <param name="cmdType"></param>命令类型
''' <param name="sqlParams"></param>要执行数据库操作的sql命令中的参数
''' <returns></returns>dataTable,查询得出的数据库中的数据表项
''' <remarks></remarks>
Public Function ExcuteSelect(ByVal cmdText As String,sqlParams As sqlParameter()) As DataTable
Dim sqlAdapter As sqlDataAdapter
Dim dataTable As DataTable
Dim dataSet As New DataSet
cmd.Connection = cnn
cmd.CommandType = cmdType
cmd.CommandText = cmdText
'为什么此处没有进行cnn.open连接操作也可以连接数据库???,难道是非连接状态的操作?
sqlAdapter = New sqlDataAdapter(cmd)
Try
cmd.Parameters.Clear() '清除参数
'如果传来了sqlparams参数则,添加到cmd对象中
If Not IsNothing(sqlParams) Then
cmd.Parameters.AddRange(sqlParams)
End If
sqlAdapter.Fill(dataSet) '用sqlAdapter 将dataset 填充
dataTable = dataSet.Tables(0) 'dataTable 为dataSet 的第一个表
Return dataTable '返回获得到的数据
Catch ex As Exception
Throw New Exception("查询失败!" + ex.Message)
Finally
ConnectionClose(cnn)
CommandClose(cmd)
End Try
End Function
#End Region
#Region "无参查询,返回datetable,此处重载ExcuteSelect函数"
''' <summary>
''' 无参查询,返回datetable,此处重载ExcuteSelect
''' </summary>
''' <param name="cmdText"></param>要执行的sql文本命令或者存储过程名称
''' <param name="cmdType"></param>要执行的语句的类型,sql语句或者存储过程
''' <returns></returns>DataTable对象实例
''' <remarks></remarks>
Public Function ExcuteSelect(ByVal cmdText As String,ByVal cmdType As CommandType) As DataTable
Return ExcuteSelect(cmdText,Nothing)
End Function
#End Region
''' <summary>
''' 关闭连接对象,释放资源
''' </summary>
''' <param name="cnn"></param>
''' <remarks></remarks>
Public Sub ConnectionClose(ByVal cnn As sqlConnection)
If cnn.State = ConnectionState.Open Then
cnn.Close()
cnn = Nothing
End If
End Sub
''' <summary>
''' 关闭cmd对象,释放资源
''' </summary>
''' <param name="cmd"></param>
''' <remarks></remarks>
Public Sub CommandClose(ByVal cmd As sqlCommand)
If Not IsNothing(cmd) Then
cmd.Dispose()
cmd = Nothing
End If
End Sub
End Class
小结:最初自己就写了两个简单的函数,最后发现不够用了,只好自己继续进行重构sqlHelper类呗。发现自己第二次再写的时候,对于这个数据库访问助手类已经手到拈来了,写起代码来如行云流水,这大概就是学习的过程,重复次数多了,做多了也就会了。所以,没有你做不到的,请坚信自己一定可以的! 哦,忘了告诉大家,怎么在D层调用了,嗯……其实啊,很简单的啦 所以,这么简单你就自己想想怎么用吧……要知道,没有你做不到的,请坚信自己一定可以的!噢耶