首页 > 代码库 > 数据库抽象之sqlhelper

数据库抽象之sqlhelper

         个人重构版的机房收费系统已经走过了开始的这一关了,由于走在前面的人已经很多了,在开始机房之前看过他们的一些博客以及和他们的交流知道可以在连接、操作数据库时抽象出一个sqlhelper的类,封装对数据库的各种操作方法。但是这个学习的过程需要自己去摸索,才能真正体会到抽象的给编程带来的好处以及原有的方式的弊端。

        先实现三层架构的登陆窗体和查看学生余额的功能后 ,在D层代码有重复,数据库的链接、数据库的查询,这也是三层架构设计的一点弊端吧,降低了系统的耦合度同时也增加了编程的代码量。接下来就开始了真正的学习和实现sqlhelper。

      sqlhelper是什么?

   SqlHelper是一个基于.NET Framework的数据库操作组件。组件中包含数据库操作方法,目前SqlHelper有很多版本,主要以微软一开始发布的SqlHelper类,后面包含进了Enterprise Library开源包中了。还有一个主要版本是dbhelper.org开源的sqlhelper组件,优点是简洁,高性能,不仅仅支持sqlserver,同时支持sqlserver、oracle、access、Mysql数据库,也是一个开源项目,提供免费下载。

  SqlHelper用于简化你重复的去写那些数据库连接(SqlConnection),SqlCommand,SqlDataReader等等。SqlHelper 封装过后通常是只需要给方法传入一些参数如数据库连接字符串,SQL参数等,就可以访问数据库了,很方便。

  SqlHelper 类用于通过一组静态方法来封装数据访问功能。该类不能被继承或实例化,因此将其声明为包含专用构造函数的不可继承类。在 SqlHelper 类中实现的每种方法都提供了一组一致的重载。这提供了一种很好的使用 SqlHelper 类来执行命令的模式,同时为开发人员选择访问数据的方式提供了必要的灵活性。每种方法的重载都支持不同的方法参数,因此开发人员可以确定传递连接、事务和参数信息的方式。

     前提:为了让SQLhelper发挥更好的效果我们需要使用配置文件来链接数据。

   

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
	<appSettings>
		<add key="Connstr" value=http://www.mamicode.com/"server=LXY;database=yangjfcharge;user id=sa;password=123456"/>>

下面介绍SQLheper里面常用的方法

   ExecuteReader。此方法用于返回SqlDataReader对象,该对象包含由某一命令返回的结果集。

   ExecuteDataset。此方法返回DataSet对象,该对象包含由某一命令返回的结果集。

   ExecuteScalar。此方法返回一个值。该值始终是该命令返回的第一行的第一列。

   ExecuteXmlReader。此方法返回FOR XML查询的XML段。

除了这些公共方法外,SqlHelper 类还包含一些专用函数,用于管理参数和准备要执行的命令。不管客户端调用什么样的方法实现,所有命令都通过 SqlCommand 对象来执行。在 SqlCommand 对象能够被执行之前,所有参数都必须添加到 Parameters 集合中,并且必须正确设置 Connection、CommandType、CommandText 和 Transaction 属性。SqlHelper 类中的专用函数主要用于提供一种一致的方式,以便向 SQL Server 数据库发出命令,而不考虑客户端应用程序调用的重载方法实现。SqlHelper 类中的专用实用程序函数包括:

  AttachParameters:该函数用于将所有必要的 SqlParameter 对象连接到正在运行的 SqlCommand。

  AssignParameterValues:该函数用于为 SqlParameter 对象赋值。

  PrepareCommand:该函数用于对命令的属性(如连接、事务环境等)进行初始化。

  ExecuteReader:此专用 ExecuteReader 实现用于通过适当的 CommandBehavior 打开 SqlDataReader 对象,以便最有效地管理与阅读器关联的连接的有效期。

    但是现阶段主要设置的是SQLhelper中必要的一些链接参数,即SqlCommand,Parameters,commandType,CommandText属性链接数据库。

SQLhelper类中的函数分为查询和增删改更新,同时这两部分又详细分为有参和无参。

经过上面的理论应该对这个神秘得类有产生好奇心,那我们来揭开它的面纱!

代码:

Imports System.Data
Imports System.Configuration
Imports System.Data.SqlClient

Public Class Sqlhelper
    '获取数据库连接字符串
    Private ReadOnly strConn As String = ConfigurationManager.AppSettings("Connstr")
    '新建链接
    Dim connSql As SqlConnection = New SqlConnection(strConn)
    '定义命令
    Dim cmdSql As New SqlCommand
    ''' <summary>
    ''' 执行增删改,有参,确认是否执行成功
    ''' </summary>
    ''' <param name="cmdSQLText">需要执行的数据库语句</param>
    ''' <param name="cmdSQLType">数据语句的类型,可能是sql类型,也可能是存储过程等</param>
    ''' <param name="sqlParams">参数数组,无法确定有多少参数</param >
    ''' <returns>返回受影响行数</returns>
    ''' <remarks></remarks>
    Public Function ExecuteAddDelUpdate(ByVal cmdSQLText As String, ByVal cmdSQLType As CommandType, ByVal sqlParams As SqlParameter()) As Integer
        cmdSql.Parameters.AddRange(sqlParams) '将参数传入
        cmdSql.CommandType = cmdSQLType '确定语句类型,是sql还有Oracle还是以其他类型
        cmdSql.CommandText = cmdSQLText '将sql语句传给cmdSQL
        cmdSql.Connection = connSql '设置连接,全局变量

        '开始执行查询
        Try
            connSql.Open() '打开链接
            Return cmdSql.ExecuteNonQuery() '执行查询
            cmdSql.Parameters.Clear() '清除参数

        Catch ex As Exception
            Return 0
        Finally
            Call CloseConnection(connSql) '调用关闭数据连接的函数
            Call CloseSQLCommand(cmdSql) '调用命令撤销函数
        End Try
    End Function
    ''' <summary>
    ''' 执行增删改,无参,确认是否执行成功
    ''' </summary>
    ''' <param name="cmdText">需要执行的数据库语句</param>
    ''' <param name="cmdType">数据语句的类型,一般为sql语句,不是存储过程</param>
    ''' <returns>返回受影响的额行数</returns>
    ''' <remarks></remarks>
    Public Function ExecuteAddDelUpdate(ByVal cmdText As String, ByVal cmdType As CommandType) As Integer
        cmdSql.CommandType = cmdType '确定语句类型,是sql还是Oracle还是其他类型
        cmdSql.CommandText = cmdText '将sql语句传给cmdsql
        cmdSql.Connection = connSql '设置连接,全局变量

        '执行查询
        Try
            connSql.Open() '打开链接
            Return cmdSql.ExecuteNonQuery() '执行查询
            cmdSql.Parameters.Clear() '清除参数

        Catch ex As Exception
            Return 0
        Finally
            Call CloseConnection(connSql)
            Call CloseSQLCommand(cmdSql)
        End Try
    End Function
    '''<summary>
    ''' 执行查询操作,有参,返回datatable类型
    ''' </summary >
    ''' <param name="cmdText">需要执行的数据库语句,一般SQL语句,也有存储过程</param>
    ''' <param name="cmdType">数据语句的类型,一般为Sql语句,不是存储过程</param>  
    ''' <param name="sqlParams">参数数组,不确定有多少参数数组</param>  
    ''' <returns>返回datatable类型</returns>  
    ''' <remarks></remarks>   

    Public Function ExecuteSelect(ByVal cmdText As String, ByVal cmdType As CommandType, ByVal sqlParams As SqlParameter()) As DataTable
        Dim sqlAdapter As SqlDataAdapter
        Dim dtSQL As New DataTable
        Dim dsSQL As New DataSet

        cmdSql.CommandText = cmdText
        cmdSql.CommandType = cmdType
        cmdSql.Connection = connSql
        cmdSql.Parameters.AddRange(sqlParams)
        sqlAdapter = New SqlDataAdapter(cmdSql)
        Try
            sqlAdapter.Fill(dsSQL)
            dtSQL = dsSQL.Tables(0) 'datatable为dataSet的第一个表
            cmdSql.Parameters.Clear()
        Catch ex As Exception
            MsgBox("查询失败", CType(vbOKOnly + MsgBoxStyle.Exclamation, MsgBoxStyle), " 警告")
        Finally
            Call CloseSQLCommand(cmdSql)
        End Try


        Return dtSQL
    End Function
   
    ''' <summary>
    ''' 执行查询操作,无参,返回datatable类型     
    ''' </summary>
    ''' <param name="cmdText">需执行的数据库语句,一般SQL语句,也有存储过程 </param>
    ''' <param name="cmdType">数据语句的类型,一般为sql语句,不是存储过程</param>
    ''' <returns>返回datatable流行性</returns>
    ''' <remarks></remarks>
    Public Function ExecuteSelect(ByVal cmdText As String, ByVal cmdType As CommandType) As DataTable
        Dim sqlAdapter As SqlDataAdapter
        Dim dtSQL As New DataTable
        Dim dsSQL As New DataSet

        cmdSql.CommandText = cmdText
        cmdSql.CommandType = cmdType
        cmdSql.Connection = connSql
        sqlAdapter = New SqlDataAdapter(cmdSql) '实例化adapter
        Try
            sqlAdapter.Fill(dsSQL) '用dsSQL 填充sqlAdapater'
            dtSQL = dsSQL.Tables(0)

        Catch ex As Exception
            CloseSQLCommand(cmdSql)
        End Try
        Return dtSQL
    End Function
    ''' <summary>
    ''' 关闭数据库链接
    ''' </summary>
    ''' <param name="connSQL">数据库链接</param>
    ''' <remarks></remarks>

    Public Sub CloseConnection(ByVal connSQL As SqlConnection)
        If (connSQL.State <> ConnectionState.Closed) Then '如果没有关闭
            connSQL.Close() '关闭连接
            connSQL = Nothing '不指向原对象

        End If
    End Sub
    ''' <summary>
    ''' 命令撤销
    ''' </summary>
    ''' <param name="cmdSql">数据库执行的一个 Transact-SQL 语句或存储过程。无法继承此类。</param>
    ''' <remarks></remarks>
    Public Sub CloseSQLCommand(ByVal cmdSql As SqlCommand)
        If Not IsNothing(cmdSql) Then '如果存在命令
            cmdSql.Dispose() '命令销毁
            cmdSql = Nothing

        End If
    End Sub
End Class
   SQLhelper防止了直接对数据库的的操作,增加了数据库的安全性,也减少了编程的代码工作量。我个人觉得它跟以前vb中学过的模块的功能是一样的,抽象出公共的方法,可以供各个功能调用!

虽然网上对SQLhelper的介绍由于它自身的经典特性已经数不胜数,处于学习和巩固以及以后的回顾,特此发表了此博客,纯属初学者的观点,有错误的地方还清雅正!