zoukankan      html  css  js  c++  java
  • 浅识数据库——封装数据库操作

    前言

        昨天机房验收,师父问了我几个关于数据库方面的问题,我支支吾吾答不上来,好多就是知道是什么意思,就是不知道官方用语怎么说,这下可为难了。下来以后,查了查,权当温故而知新了。

    内容

        ADO(ActiveXData Object)是优化的访问数据库的专用对象集。想了半天也找不到合适的词去理解这个,自己简单的理解为了接口,为了和数据库连接,声明一些对象,然后通过参数的传递去实现这些对象。(个人浅理解)

    七个对象

        其中这七个对象分为(3个独立对象和依赖独立对象才能使用的4个非独立对象)

    • Connection:连接对象,用于创建数据源连接。在使用其他对象之前必须先建立数据源连接,然后在连接对象上创建和使用其他对象。
    • Command:命令对象,用于执行动作查询,比如创建/删除数据库、执行查询返回记录集、删除记录等操作。
    • Recordset:记录集对象,保存来自基本表或命令对象返回的结果。使用记录集对象几乎可以完成所有的数据操作。
    • Field:字段对象,依赖于记录集对象使用。可使用Fields集合来获得记录集中每个字段信息。(相当于Field承接了数据库的字段,算是交互了吧。。。)
    • Parameter:参数对象,依赖于命令对象使用,用于为参数查询提供数据。同时使用参数对象和命令对象,可使数据库对查询进行预编译,从而提高执行速度。
    • Property:属性对象,每个连接对象,命令对象,记录集对象以及字段对象都有一个属性对象集合。使用属性对象可以访问特定对象的主要信息,例如获取数据库表名称(个人认为Property是一个封装好得数据库属性集合,每个对象可以获取这个属性,达到访问特定对象通过属性对象,获取自己想要的东西。:一个超市(属性对象),买水果者、买盐者、买水者等,这些买东西的对象,获取超市这个属性集,获取自己特定的需求。)
    • Error:错误对象,依赖连接对象使用。如果在访问数据库过程中发生错误,这些错误的信息便保存到连接对象的Errors集合中。使用错误对象来定义处理相应错误的措施,避免应用程序在执行过程中意外终止。

    应用

        上面的七个对象简单的了解一下,知识还是贵在实践啊。所以师父建议我结合两版机房的数据库连接部分进行对比一下。VB 6.0和VB.NET,这两个在控件的使用还有属性的设置方面还是没有多大的变化的,个人认为区别最大的就是:VB6.0是面向过程的,VB.NET是面向对象的,很好的降低了代码和功能之间的耦合性,便于后期的扩展和维护。下面就看看VB版和VB.NET版关于D层是怎么样设置的。

    VB版

        首先利用抽象的思维,在模块里抽象出了一个执行SQL语句的方法。不得不说这点类似与VB.NET版中的SQLHelper。

    <span style="font-family:KaiTi_GB2312;font-size:18px;">'数据库的连接,以文件DSN标记,访问ODBC数据源
    Public Function ConnectString() As String
        ConnectString = "FileDSN=charge.dsn;UID=sa;PWD=123" '保证数据库登录信息与访问信息一致
    '    ConnectString = "provider=sqloledb;server=192.168.26.26;UID=sa;PWD=123456;database=charge_sys"
    End Function
    
    Public Function ExecuteSQL(ByVal SQL As String, MsgString As String) As ADODB.Recordset
    '执行SQL和返回记录集
        Dim cnn As ADODB.Connection '建立数据库的连接。
        Dim rst As ADODB.Recordset '声明一个记录集
        Dim sTokens() As String
        
    On Error GoTo ExecuteSQL_Error
         
        sTokens = Split(SQL)
        Set cnn = New ADODB.Connection
        cnn.Open ConnectString
        '如果是增、删、改这些操作就执行SQL语句;
        If InStr("INSERT,DELETE,UPDATE", UCase$(sTokens(0))) Then '非Slect语句
            cnn.Execute SQL '数据量不大时,可以在连接上,直接执行SQL语句
            MsgString = sTokens((0)) & "query successful"
            '虽然MsgString不是返回值,但传递方式是ByRef,实参地址和这个地址相同
        Else  'Select语句
            Set rst = New ADODB.Recordset
            rst.Open Trim$(SQL), cnn, adOpenKeyset, adLockOptimistic
            '得到临时表,游标指向第一条记录
            '得到记录条数
            Set ExecuteSQL = rst
            MsgString = "查询到" & rst.RecordCount & "条记录"
        End If
    ExecuteSQL_Exit:
        Set rst = Nothing
        Set cnn = Nothing
        Exit Function
    
    ExecuteSQL_Error:
        MsgString = "查询错误:" & Err.Description
        
        Resume ExecuteSQL_Exit
        
    End Function</span>

    VB.NET版

        采用了运用配置文件去连接数据库。SQLHelper封装了对数据库的增删改查。

    • 用到的全局变量

    <span style="font-family:KaiTi_GB2312;font-size:18px;">    '定义全局变量,设置连接
        Shared conn As SqlConnection = New SqlConnection(ConnectionString)
        '定义全局cmd命令
        Shared cmd As New SqlCommand</span>


    • 配置文件连接数据库

    <span style="font-family:KaiTi_GB2312;font-size:18px;">    'configurationManager表示读配置文件;
        'appsetting获取配置文件的数据;
        'Shared ConnectionString As String = ConfigurationManager.AppSettings("sqlConnectStr")
        '这里需要注意配置文件读取ConnectionString时,内容需要进行字符串的转换。
        Shared ConnectionString As String = ConfigurationManager.ConnectionStrings("sqlConnectStr").ToString()</span>
    <span style="font-family:KaiTi_GB2312;font-size:18px;">    <connectionStrings>
            <add name="sqlConnectStr"
                connectionString="Data Source=ZLT;persist security info=False;Initial Catalog=ComputerCharge_sys;User ID=sa;Password=123"
                providerName="System.Data.SqlClient" />
        </connectionStrings></span>


    • 抽象的方法

    <span style="font-family:KaiTi_GB2312;font-size:18px;">    '对于关闭连接,重新定义一个函数
        ''' <summary>
        ''' 关闭连接
        ''' </summary>
        ''' <param name="conn"></param>'需要关闭的连接
        ''' <remarks></remarks>
        Public Shared 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 Shared Sub CloseCmd(ByVal cmd As SqlCommand)
            If Not IsNothing(cmd) Then
    
                cmd.Dispose() '销毁
                cmd = Nothing
    
            End If
        End Sub</span>


    • 无参数的增删改

    <span style="font-family:KaiTi_GB2312;font-size:18px;">    ''' <summary>
        ''' 执行增删改三个操作,(无参)
        ''' </summary>
        ''' <param name="cmdText"></param>执行增删改查SQL语句或者存储过程
        ''' <param name="cmdType"></param>命令类型文本或者是存储过程
        ''' <returns>interger,受影响的行数</returns>
        ''' <remarks></remarks>
        Public Shared Function ExecAddDelUpdateNo(ByVal cmdText As String, ByVal cmdType As CommandType) As Integer
            '为要执行的命令cmd赋值
            cmd.CommandText = cmdText
            cmd.CommandType = cmdType
            cmd.Connection = conn
    
            Dim result As Integer
            '执行操作
            Try
    
                conn.Open()
                result = cmd.ExecuteNonQuery()
    
            Catch ex As Exception
    
                MsgBox(ex.Message, , "数据库操作")
    
            Finally
    
                Call CloseConn(conn)
                Call CloseCmd(cmd)
    
            End Try
            Return result '返回受影响的行数
        End Function</span>


    • 有参数的增删改

    <span style="font-family:KaiTi_GB2312;font-size:18px;">    ''' <summary>
        ''' 执行非查询操作(增删改)有参数
        ''' </summary>
        ''' <param name="cmdText"></param>执行增删改查SQL语句或者存储过程;
        ''' <param name="cmdType"></param>命令类型文本或者是存储过程;
        ''' <param name="paras"></param>参数数组,无法确认有多少参数
        ''' <returns></returns>
        ''' <remarks></remarks>
        Public Shared Function ExecuteNoQuery(ByVal cmdText As String, ByVal cmdType As CommandType, ByVal paras As SqlParameter()) As Integer
            '将传入的值,分别为cmd的属性赋值
            Dim result As Integer '定义变量用来存放执行的结果
            cmd.Parameters.AddRange(paras) '将参数传入
            cmd.CommandType = cmdType '设置一个值,解释cmdtext
            cmd.Connection = conn '设置连接,全局变量
            cmd.CommandText = cmdText '设置查询语句
    
            Try
                conn.Open() '打开连接
                result = cmd.ExecuteNonQuery() '执行增删改操作
                cmd.Parameters.Clear() '清楚参数
    
            Catch ex As Exception
                MsgBox(ex.Message, , "数据库操作") '如果出错,返回0
            Finally
                '关闭数据库连接
                Call CloseConn(conn)
                Call CloseCmd(cmd)
            End Try
            Return result '返回受影响的行数
        End Function</span>

    • 无参数查询

    <span style="font-family:KaiTi_GB2312;font-size:18px;">    ''' <summary>
        ''' 执行增删改三个操作,(无参)
        ''' </summary>
        ''' <param name="cmdText"></param>执行增删改查SQL语句或者存储过程
        ''' <param name="cmdType"></param>命令类型文本或者是存储过程
        ''' <returns>interger,受影响的行数</returns>
        ''' <remarks></remarks>
        Public Shared Function ExecAddDelUpdateNo(ByVal cmdText As String, ByVal cmdType As CommandType) As Integer
            '为要执行的命令cmd赋值
            cmd.CommandText = cmdText
            cmd.CommandType = cmdType
            cmd.Connection = conn
    
            Dim result As Integer
            '执行操作
            Try
    
                conn.Open()
                result = cmd.ExecuteNonQuery()
    
            Catch ex As Exception
    
                MsgBox(ex.Message, , "数据库操作")
    
            Finally
    
                Call CloseConn(conn)
                Call CloseCmd(cmd)
    
            End Try
            Return result '返回受影响的行数
        End Function</span>

    • 有参数查询

    <span style="font-family:KaiTi_GB2312;font-size:18px;">    ''' <summary>
        ''' 执行查询的操作,(有参),参数不限
        ''' </summary>
        ''' <param name="cmdText"></param>执行增删改sql语句或者存储过程
        ''' <param name="cmdType"></param>文本类型或者存储过程
        ''' <param name="paras"></param>传入的参数
        ''' <returns></returns>
        ''' <remarks></remarks>
        Public Shared Function ExecSelect(ByVal cmdText As String, ByVal cmdType As CommandType, ByVal paras As SqlParameter()) As DataTable
            Dim sqlAdapter As SqlDataAdapter
            Dim dt As New DataTable
            Dim ds As New DataSet
            '还是给cmd赋值
            cmd.CommandText = cmdText
            cmd.CommandType = cmdType
            cmd.Connection = conn
            cmd.Parameters.AddRange(paras) '参数添加
            sqlAdapter = New SqlDataAdapter(cmd) '实例化adapter
            Try
    
                sqlAdapter.Fill(ds) '用adapter将dataSet填充
                dt = ds.Tables(0) 'datatable为dataset的第一个表
    
                cmd.Parameters.Clear() '清除参数
    
            Catch ex As Exception
    
                MsgBox(ex.Message, , "数据库操作")
    
            Finally '销毁cmd释放资源
    
                Call CloseCmd(cmd)
    
            End Try
            Return dt
        End Function</span>


    对比

        1、VB版用了ODBC进行数据库的连接;ODBC为一个数据库访问协议,提供了访问数据库的接口,不直接与DBMS交互。VB.NET用了ADO技术直接对DBMS进行操作,不需要注册数据源,具有很好的移植性。

        2、VB版和VB.NET版大致是一样的。只是IDE环境不一样。在对数据库封装上个人认为是一致的。

    小结

        1、知识是反复的,需要我们不断的重复。

        2、多多对比,有时候收获甚微,但是记忆深刻。


    感谢您的宝贵时间~~~

  • 相关阅读:
    有效的括号
    数组
    复杂度分析
    技术派-epoll和IOCP之比较
    2020 University Rankings US News(美国)
    2020 University Rankings US News(亚洲)
    2020 University Rankings US News(中国)
    技术派-如果编译提示winnt.h(222):error C2146错误
    技术派-github常见的一些用法和缩写
    技术派-9个常用的代码托管平台
  • 原文地址:https://www.cnblogs.com/zhoulitong/p/6412419.html
Copyright © 2011-2022 走看看