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

本文分享了一个.NET数据访问层的设计思路,支持多种数据库(如Access2000、SQL Server、MySQL)。通过实体类映射数据库表结构,并提供属性和方法实现数据的增删改查操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

希望能支持多种数据库:

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

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

1

<script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript"></script>

这里有三个表,实体与表是一对一的。也相应的有三个实体,实体我一般都是放在命名空间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

        
  
   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

        
  
   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

        
  
   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

        
  
   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

        
  
   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

        
  
   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

        
  
   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

        
  
   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

        
  
   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

        
   
    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

        
    
     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

        
     
      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

        
      
       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

        
       
        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 
        
         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 
         
          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 
          "实体其它属性" 
          
           False)> _ 
           Public 
           ReadOnly 
           Property Guid() 
           As 
           String 
           Get 
           Return 
           "aee5307acf2a24a0a8e1f5c650d5e24d6" 
           End 
           Get 
           End 
           Property 
           
            False)> _ 
            Public 
            Overrides 
            ReadOnly 
            Property TableName() 
            As 
            String 
            Get 
            Return 
            "主表" 
            End 
            Get 
            End 
            Property 
            
             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:用于根据当前数据库获取一个字段描述对象,我称为字段对象。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值