使用VB.Net写一个简单的数据访问层(不能称ORM):前言

使用.Net多年,没有什么进步,比较困惑。可能是非主流的原因,很多时候一个问题,能用代码来解决,确无法用文字来解释,为了增强这方面的功力,接下来把自己正在开发的一个数据层拿出来说话。可能这是在重复造轮子,对于小系统来说自己造的轮子,也许用起来更顺手。

此物的目的:也就是一个数据访问的功能。

希望能支持多种数据库:

  1. Access2000,写一个小东西用它还是不错的。
  2. SQLSERVER,不用说,肯定要支持它,我也只对它比较熟一些。
  3. MySql,有时使用SQLSERVER增加了客户的成本,不过这个东西维护人员也不好找吧,当然你用盗版列外。当然我还没有用过,在写这个组件的同时,慢慢学习。

以下是在接下来的演示中需要用到的表结构图:

1

这里有三个表,实体与表是一对一的。也相应的有三个实体,实体我一般都是放在命名空间Common下的。下面我简单的列出主表的实体代码。

Imports At.Data

Imports At.Core

Imports System.ComponentModel

Namespace Common

    Public Class 主表

        Inherits EntityBase

#Region "类实例化"

        Public Sub New()

            MyBase.new()

        End Sub

#End Region

#Region "实体字段描述"

        Private f_ID As IEntityField



        <Browsable(False)> _

        Public Overridable ReadOnly Property _ID() As IEntityField

            Get

                If f_ID Is Nothing Then

                    f_ID = Me.DataHelper.GetEntityField
(Me, "ID", "ID", True, False, DbType.Int32, 4)

                End If

                Return f_ID

            End Get

        End Property



        Private f_物品编号 As IEntityField



        <Browsable(False)> _

        Public Overridable ReadOnly Property _物品编号() As IEntityField

            Get

                If f_物品编号 Is Nothing Then

                    f_物品编号 = Me.DataHelper.GetEntityField
                    (Me, "物品编号", "物品编号", False, False, DbType.String, 50)

                End If

                Return f_物品编号

            End Get

        End Property



        Private f_物品名称 As IEntityField



        <Browsable(False)> _

        Public Overridable ReadOnly Property _物品名称() As IEntityField

            Get

                If f_物品名称 Is Nothing Then

                    f_物品名称 = Me.DataHelper.GetEntityField
                    (Me, "物品名称", "物品名称", False, False, DbType.String, 50)

                End If

                Return f_物品名称

            End Get

        End Property



        Private f_物品型号 As IEntityField



        <Browsable(False)> _

        Public Overridable ReadOnly Property _物品型号() As IEntityField

            Get

                If f_物品型号 Is Nothing Then

                    f_物品型号 = Me.DataHelper.GetEntityField
                 (Me, "物品型号", "物品型号", False, False, DbType.String, 50)

                End If

                Return f_物品型号

            End Get

        End Property



        Private f_单位 As IEntityField



        <Browsable(False)> _

        Public Overridable ReadOnly Property _单位() As IEntityField

            Get

                If f_单位 Is Nothing Then

                    f_单位 = Me.DataHelper.GetEntityField
                    (Me, "单位", "单位", False, False, DbType.String, 50)

                End If

                Return f_单位

            End Get

        End Property



        Private f_生产厂家 As IEntityField



        <Browsable(False)> _

        Public Overridable ReadOnly Property _生产厂家() As IEntityField

            Get

                If f_生产厂家 Is Nothing Then

                    f_生产厂家 = Me.DataHelper.GetEntityField
        (Me, "生产厂家", "生产厂家", False, False, DbType.String, 50)

                End If

                Return f_生产厂家

            End Get

        End Property



        Private f_库存量 As IEntityField



        <Browsable(False)> _

        Public Overridable ReadOnly Property _库存量() As IEntityField

            Get

                If f_库存量 Is Nothing Then

                    f_库存量 = Me.DataHelper.GetEntityField
   (Me, "库存量", "库存量", False, False, DbType.Decimal, 9)

                End If

                Return f_库存量

            End Get

        End Property



        Private f_库存金额 As IEntityField



        <Browsable(False)> _

        Public Overridable ReadOnly Property _库存金额() As IEntityField

            Get

                If f_库存金额 Is Nothing Then

                    f_库存金额 = Me.DataHelper.GetEntityField
    (Me, "库存金额", "库存金额", False, False, DbType.Decimal, 9)

                End If

                Return f_库存金额

            End Get

        End Property





#End Region

#Region "实体属性"

        Private md_ID As Integer



        <Browsable(True)> _

        Public Overridable Property ID() As Integer

            Get

                Return md_ID

            End Get

            Set(ByVal Value As Integer)

                If value <> md_ID Then

                    md_ID = Value

                    Me.OnPropertyChanged("ID")

                End If

            End Set

        End Property



        Private md_物品编号 As String = String.Empty



        <Browsable(True)> _

        Public Overridable Property 物品编号() As String

            Get

                Return md_物品编号

            End Get

            Set(ByVal Value As String)

                If value <> md_物品编号 Then

                    md_物品编号 = Value

                    Me.OnPropertyChanged("物品编号")

                End If

            End Set

        End Property



        Private md_物品名称 As String = String.Empty



        <Browsable(True)> _

        Public Overridable Property 物品名称() As String

            Get

                Return md_物品名称

            End Get

            Set(ByVal Value As String)

                If value <> md_物品名称 Then

                    md_物品名称 = Value

                    Me.OnPropertyChanged("物品名称")

                End If

            End Set

        End Property



        Private md_物品型号 As String = String.Empty



        <Browsable(True)> _

        Public Overridable Property 物品型号() As String

            Get

                Return md_物品型号

            End Get

            Set(ByVal Value As String)

                If value <> md_物品型号 Then

                    md_物品型号 = Value

                    Me.OnPropertyChanged("物品型号")

                End If

            End Set

        End Property



        Private md_单位 As String = String.Empty



        <Browsable(True)> _

        Public Overridable Property 单位() As String

            Get

                Return md_单位

            End Get

            Set(ByVal Value As String)

                If value <> md_单位 Then

                    md_单位 = Value

                    Me.OnPropertyChanged("单位")

                End If

            End Set

        End Property



        Private md_生产厂家 As String = String.Empty



        <Browsable(True)> _

        Public Overridable Property 生产厂家() As String

            Get

                Return md_生产厂家

            End Get

            Set(ByVal Value As String)

                If value <> md_生产厂家 Then

                    md_生产厂家 = Value

                    Me.OnPropertyChanged("生产厂家")

                End If

            End Set

        End Property



        Private md_库存量 As Decimal



        <Browsable(True)> _

        Public Overridable Property 库存量() As Decimal

            Get

                Return format(md_库存量, "0.######")

            End Get

            Set(ByVal Value As Decimal)

                If value <> md_库存量 Then

                    md_库存量 = Value

                    Me.OnPropertyChanged("库存量")

                End If

            End Set

        End Property



        Private md_库存金额 As Decimal



        <Browsable(True)> _

        Public Overridable Property 库存金额() As Decimal

            Get

                Return format(md_库存金额, "0.######")

            End Get

            Set(ByVal Value As Decimal)

                If value <> md_库存金额 Then

                    md_库存金额 = Value

                    Me.OnPropertyChanged("库存金额")

                End If

            End Set

        End Property





#End Region

#Region "设置实体的属性"



        Public Overrides Sub SetValue(ByVal attributename As String, ByVal value As Object)

            Select Case attributename



                Case "ID"

                    ID = value

                Case "物品编号"

                    物品编号 = value

                Case "物品名称"

                    物品名称 = value

                Case "物品型号"

                    物品型号 = value

                Case "单位"

                    单位 = value

                Case "生产厂家"

                    生产厂家 = value

                Case "库存量"

                    库存量 = value

                Case "库存金额"

                    库存金额 = value

                Case Else

                    MyBase.SetValue(attributename, value)

            End Select

        End Sub

#End Region

#Region "获取实体的属性"



        Public Overrides Function GetValue(ByVal attributename As String) As Object

            Select Case attributename



                Case "ID"

                    Return ID

                Case "物品编号"

                    Return 物品编号

                Case "物品名称"

                    Return 物品名称

                Case "物品型号"

                    Return 物品型号

                Case "单位"

                    Return 单位

                Case "生产厂家"

                    Return 生产厂家

                Case "库存量"

                    Return 库存量

                Case "库存金额"

                    Return 库存金额

                Case Else

                    Return MyBase.GetValue(attributename)

            End Select

        End Function

#End Region

#Region "实体其它属性"



        <Browsable(False)> _

        Public ReadOnly Property Guid() As String

            Get

                Return "aee5307acf2a24a0a8e1f5c650d5e24d6"

            End Get

        End Property



        <Browsable(False)> _

        Public Overrides ReadOnly Property TableName() As String

            Get

                Return "主表"

            End Get

        End Property



        <Browsable(False)> _

        Public Overrides ReadOnly Property AutoIncrement() As IEntityField

            Get

                Return _ID

            End Get

        End Property

#End Region

    End Class

End Namespace

         表里的每个字段映射到实体对象的实体字段(IEntityField对象),这里没有采用XML配置文件或属性的方式。使用XML文件太繁杂,特别是系统经常进行调整和修改时会很头痛。属性的方式比较字段,但是不能按一个常规对象来进行访问。曾在前两年使用过这种方式。

属性解说:

TableName:对应的是数据库的表名,有时我们可能需要在同一服务器上进行跨库访问,可以不用修改数据库连接字符串,直接设置实体对象的DbName名称就可以,以后会有这方面的例子。

AutoIncrement:是对应的自动增长字段,虽然我们可以通过IEntityField对象可以判断出那个字段是AutoIncrement的,这样需要一个循环,所以这里就单独的公开了一个属性。如果需要对实体进行CRUD操作,则必须要设置一个字段为自动增长字段。当然你可以不设,那么CRUD操作,就需要你自己写代码了。

Guid:这个属性没有实际意义,正在考虑,是否去掉。

SetValue,GetValue:这个方法是重写基类的,基类的SetValue和GetValue是使用反射的形式把DataRow对象转换为一个实体对象,反射的效率比较差,所以这里就采用了折衷的方法,使用硬编码。

OnPropertyChanged:这个方法用于当字段的值发生变化时,引发一个事件。

DataHelper.GetEntityField:用于根据当前数据库获取一个字段描述对象,我称为字段对象。

对这个实体对象就简单介绍完了,如果您有兴趣讲继续关注。一个简单的数据访问层!

你可能感兴趣的:(VB.NET)