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

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

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

希望能支持多种数据库:

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

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

1

<script type="text/javascript"> </script><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文件太繁杂,特别是系统经常进行调整和修改时会很头痛。属性的方式比较字段,但是不能按一个常规对象来进行访问。曾在前两年使用过这种方式。

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

属性解说:

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

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

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

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

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

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值