vb 数据库应用实例(VB.NET数据库操作核心类库-第02篇)
.NET操作中,核心部分就是对于数据库的操作其中涉及读取数据、更新数据、采用事务操作等等,下面我们就来聊聊关于vb 数据库应用实例?接下来我们就一起去了解一下吧!
vb 数据库应用实例
.NET操作中,核心部分就是对于数据库的操作。其中涉及读取数据、更新数据、采用事务操作等等。
上一篇,在写此核心类库前的准备,身份验证类。因为现在操作基本以SQL Server数据库操作居多,因此此类库操作以ms SQL为主。
1、新类库继承
由于身份验证类是基类,继承后需要对于基类函数进行重写。
''' <summary> ''' 2019.8.12 ''' 操作数据库类库 ''' </summary> Public Class BaseSql Inherits SecuriVerify(Of string,string,string) Public OverriDes ReadOnly Property ErrMessage As String Get Throw New NotImplementedException() End Get End Property Protected Overrides ReadOnly Property ProcLevel As EmpowerLevel Get Throw New NotImplementedException() End Get End Property Protected Overrides ReadOnly Property SecuriPass As Integer Get Throw New NotImplementedException() End Get End Property Protected Overrides Sub ExportMessage(vMsg As String) Throw New NotImplementedException() End Sub Friend Overrides Function CheckCode(vUserName As String, vCode As String) As Integer Throw New NotImplementedException() End Function Friend Overrides Function ProcPermission(vCode As String) As EmpowerLevel Throw New NotImplementedException() End Function End Class
其中继承基类 SecuriVerify 定义泛型参数,在继承的时候为了后续方便操作,默认string类型
2、类库重构
对于类库今后的调用重构函数设计就显得比较重要,此为调用类库入口
设计思路:
- 我们提供开发用户,需要提供用户名、加密的授权码和校验码,新建一个带3个参数的重构函数
''' <summary> ''' 说明:重构 ''' </summary> ''' <param name="vUserName">用户名</param> ''' <param name="vSecuriKey">类授权代码</param> ''' <param name="vProcKey">过程及函数使用授权码</param> ''' <remarks></remarks> Public Sub New(ByVal vUserName As String, ByVal vSecuriKey As String, ByVal vProcKey As String) MyBase.New(vUserName, vSecuriKey, vProcKey) End Sub
- 有时候为了方便调用,希望三个参数改为一个参数传递,为此我们需要创建一个类调用身份验证结构类型
''' <summary> ''' 创建时间:2019.8.12 ''' 说明:类调用身份验证结构类 ''' </summary> ''' <remarks></remarks> Public Structure UserSecurity Public UserName As String '//用户名 Public SecuriKey As String '//类验证码 Public ProcKey As String '//类过程及函数验证 End Structure
- 对于重构函数进行重载操作
''' <summary> ''' 说明:重构函数 ''' </summary> ''' <param name="vUserSecurity">用户安全认证信息</param> ''' <remarks></remarks> Public Sub New(ByVal vUserSecurity As UserSecurity) MyBase.New(vUserSecurity.UserName, vUserSecurity.SecuriKey, vUserSecurity.ProcKey) End Sub
- MyBase介绍:
MyBase关键字的行为方式类似于引用当前类实例的基类的对象变量;
MyBase 通常用于访问派生类中被重写或被隐藏的基类成员;
MyBase.New 用于从派生类构造函数中显式调用基类构造函数;
MyBase只能引用直接父类,无法继续沿继承链向上定位;
- DataSet通过DataAdapter从数据库中获取数据DataSet对象内部包括一个集合(Tables),也就是可以拥有多个表(DataTables);每个表存放着从数据库放回的一个结果集(一般由一条SELECT语句产生一个结果集)DataTable对象包含一个行集合(Rows),集合中的每个元素都是一个DataRow类型的对象。DataRow提供了通过下标或者列名进行访问字段数据的操作DataTable对象还包含一个列集合(Columns),集合中的每个元素都是一个DataColumn类型的对象,用于代表查询结果集合中每一列的属性,例如名称、数据类型等DataSet对象包含一个关联集合(Relations),集合中的每一个DataRelation代表两个表之间的关联。请注意,数据库表之间的关联不会被自动带到DataSet中来,需要变成为DataSet中的SataTable建立关联可以由DataTable创建(DataView),DataView可以用来代表DataTable中经过过滤后的数据,并且将用来绑定到数据展现控件中
通俗说法:通过DataAdapter从数据库读取数据,建立一个离线数据库dataset,并且创建一个datatable(数据库表),用户可以操作和读取此表,这个好处在于可以离线作业,不像早期的ADO,都是在线操作,人数使用较多考验数据库性能。
我们可以先看源码,看函数ExecuteDataset
''' <summary> ''' 说明:执行查询sqlcommand,返回记录集Dataset ''' </summary> ''' <param name="vSqlcon">sqlconnection参数</param> ''' <param name="vcommandType">命令类型</param> ''' <param name="vcommandText">SQL查询语句</param> ''' <param name="vSqlpara">参数数组</param> ''' <returns>数据记录集Dataset</returns> ''' <remarks></remarks> Friend Overloads Function ExecuteDataset(ByVal vSqlcon As SqlConnection, ByVal vcommandType As CommandType, ByVal vcommandText As String, ByVal ParamArray vSqlpara() As SqlParameter) As DataSet Dim vSqlcmd As New SqlCommand() Dim ds As New DataSet() Dim da As SqlDataAdapter Try '//配置sqlcommand '//如果连接未打开,则打开连接 If vSqlcon.State <> ConnectionState.Open Then vSqlcon.Open() End If With vSqlcmd '//设置sqlcommand对应数据库连接 .CommandTimeout = MConnectionTimeOut .Connection = vSqlcon .CommandText = vcommandText '//操作SQL命令 .CommandType = vcommandType '//命令操作类型 '//如果存在参数数组,则添加到sqlcommand If Not (vSqlpara Is Nothing) Then ' AttachParameters(vSqlcmd, vSqlpara) Dim p As SqlParameter For Each p In vSqlpara '//参数可输出也 可输入 If p.Direction = ParameterDirection.InputOutput And p.Value Is Nothing Then p.Value = Nothing End If '对于存储过程,有些参数是输出 If p.Direction = ParameterDirection.Output Then '//sqlcommand添加参数变量 vSqlcmd.Parameters.Add(p).Direction = ParameterDirection.Output Else '//sqlcommand添加参数变量 vSqlcmd.Parameters.Add(p) End If Next End If End With 'create the DataAdapter & DataSet da = New SqlDataAdapter(vSqlcmd) da.Fill(ds) '//清理sqlpara vSqlcmd.Parameters.Clear() '关闭连接池 F_CancelConn(vSqlcon) Catch ex As Exception '//销毁链接及操作命令 F_CancelConn(vSqlcon) F_CancelCommand(vSqlcmd) ExportMessage(ex.Message) '传输错误信息出去 End Try Return ds End Function
为何写成Friend Public,此函数为核心函数,并不想让用户直接调用,不方便控制用户调用权限。我们集成身份验证基类目的就是管控权限,自然不可能让用户直接调用此函数,因此我们需要重新创建一个调用函数
调用函数F_GetDataTable
''' <summary> ''' 说明:执行查询SQL语句,返回记录集内存库表DataTable ''' </summary> ''' <param name="commandText">数据库链接字符串</param> ''' <param name="commandType">命令类型</param> ''' <param name="commandParameters">SQL语句</param> ''' <param name="vConnection">数据库链接字符串</param> ''' <returns>返回内存库表DataTable</returns> ''' <remarks></remarks> Public Overloads Function F_GetDataTable( ByVal commandText As String, ByVal commandType As CommandType, ByVal commandParameters As SqlParameter(), ByVal vConnection As String) As DataTable Dim dt As New DataTable If MProcLevel > EmpowerLevel.D Then ExportMessage("你无权限调用此函数") Return dt Else '//数据库链接字符串 Dim cn As New SqlConnection(vConnection) Dim ds As New DataSet Try If cn.State <> ConnectionState.Open Then cn.Open() End If ds = ExecuteDataset(cn, commandType, commandText, commandParameters) dt = ds.Tables(0) Return dt Finally cn.Dispose() End Try Return dt End If End Function
此函数在调用前,会验证用户的授权等级,来决定是否可以调用。这个等级设置,开发用户可以根据函数的重要性和功能性来决定调用等级。
上述是通过http://ADO.NET查询数据库,返回记录的操作,通过继承身份验证基类,提高函数的安全性,再加上加密工具,基本可以保证类库不被随便调用。
后续还要讲解数据库更新操作函数,敬请期待第三篇
类库源码放在github ,喜欢的朋友可以下载,顺便帮忙点个赞。
https://github.com/chenfeng1029/LINKCommon
,免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com