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

上一篇,简单的介绍了实体对象的一些方法和属性。接下来看看,CRUD操作。

C:创建

R:获取

U:更新

D:删除

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

首先看C:

    <NUnit.Framework.Test()> _
    Public Sub Insert()
        Dim item As New Common.主表
        item.物品名称 = "test"
        item.物品编号 = System.Guid.NewGuid.ToString
        item.库存量 = 1
        item.库存金额 = 11
        Dim o As New Common.主表_Operate
        If o.Accept(item) = 0 Then
            Assert.Fail("没有返回插入记录,影响的行数。")
        End If

        NUnit.Framework.Assert.AreNotEqual(item.ID, 0)
    End Sub
首先实例化实体,实体赋值,在实例化操作对象。系统也提供通用的操作对象EntityDbOperate。
在大多数业务情况上,添加,删除,修改都有自己相应的逻辑。
看R:
    <NUnit.Framework.Test()> _
    Public Sub [Select]()
ADD:
        Dim item As New Common.主表
        Dim o As New Common.主表_Operate

        Dim ec As Common.主表_Container = o.GetEntityContainer(Nothing)
        If ec.Count = 0 Then
            Me.Insert()
        End If
        Assert.AreNotEqual(ec.Count, 0)


        Console.WriteLine("共有 {0} 个对象。", ec.Count)

    End Sub
GetEntityContainer方法返回所有的实体对象。由于这里是测试方法,还调用添加对象的方法。
GetEntityContainer方法的参数是expression,也就是表达式,可以支持自定义命令。
这里传入Nothing,也就是获取所有的对象,当然这里先获取DataTable在转换成实体的。
返回的是自定义的集合对象,实现了IList,IBindList等集合方面的接口,可以直接绑到
DataGrid,UltraGrid等表格控件上。
看D:
    <NUnit.Framework.Test()> _
    Public Sub Delete()
Del:
        Dim item As Common.主表
        item = New Common.主表
        Dim o As New EntityDbOperate(Me.DbOperate.DataProvider)

        item = o.GetEntity(o.SQL.Select(1, False).From(item).WHERE(Nothing), item)
        If item Is Nothing Then
            Me.Insert()
            GoTo Del
        End If

        Dim o1 As New Common.主表_Operate
        Dim command As ICommand = o1.SQL.Delete(item).From(item).WHERE(item._ID.EqualTo(item.ID))
        Console.WriteLine(command.CommandText)

        Console.WriteLine("删除前共有 {0} 条记录!", o.GetCount(Nothing, item))

        If o1.Delete(item) = 0 Then
            Assert.Fail("删除实体发生错误,没有返回影响的行数。")
        End If

        Console.WriteLine("删除后共有 {0} 条记录!", o.GetCount(Nothing, item))

        NUnit.Framework.Assert.AreEqual(item.State, Core.EntityState.Deleted)

    End Sub
这里看起代码比较多,这里是先获取一个实体对象
o.sql(1,false).from(item).where(nothing),这是我自己定义的sql语句写法,
翻译成t-sql语句就是:select top 1 * from item
如果当前还没有记录,就添加一个对象。
Dim command As ICommand = o1.SQL.Delete(item).From(item).WHERE(item._ID.EqualTo(item.ID))
 Console.WriteLine(command.CommandText) 
这句话的意思是构建一条删除语句,我这里主要是为了打印出语句才这样写的,产生的t-sql语句是:
delete from item where item.id=1
那么实体删除实体的代码呢是:o1.Delete(item),只有一句代码,当然方法内部也是通过上面这条语句构建的
删除语句。
看U:
    <NUnit.Framework.Test()> _
    Public Sub Update()
REST:
        Dim o As New Common.主表_Operate

        Dim item As New Common.主表

        '获取任意一个实体
        item = o.GetEntity(Nothing)
        If item Is Nothing Then
            '当前表中没有记录,插入一个实体。
            Me.Insert()
            GoTo REST
        End If


        Dim key As String = System.Guid.NewGuid.ToString
        item.物品名称 = key
        If item.State <> EntityState.Modified Then
            Assert.Fail("实体的状态没有发生变化。")
        End If

        If item._物品名称.State <> FieldState.Modified Then
            Assert.Fail("实体字段 模块名称 状态没有置为Modified。")
        End If

        '提交数据更新
        Dim cmd As ICommand = o.GetUpdateCommand(item)
        '打印SQL语句
        Console.WriteLine(cmd.CommandText)
        '获取需要更新的字段列表
        Dim fs As Data.ColumnValueCollection = o.GetUpdateColumns(item)
        For Each c As IColumnValue In fs.ToArray
            Console.WriteLine(c.FieldExpression.Expression(Nothing).ToString)
        Next
        o.Update(item)

        '判断更新是否成功。
        '按当前实体的ID进行查找,这里也可以写成
        item = o.GetEntity(item._ID.EqualTo(item.ID))

        Assert.AreEqual(item.物品名称, key, "值没有更新成功")


    End Sub
<script type="text/javascript"> </script> <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>
     这里也是综合了几个方法的代码,首先看一下红色部份的代码
     item.State<>EntityState.Modified
     这句话的作用是判断实体是已发生了更改。
     item._物品名称.State<>FieldState.Modified
     这句话的作用是判断实体的字段是否发生了修改。
    
'提交数据更新 
Dim cmd As ICommand = o.GetUpdateCommand(item) 
'打印SQL语句
 Console.WriteLine(cmd.CommandText) 
'获取需要更新的字段列表 
Dim fs As Data.ColumnValueCollection = o.GetUpdateColumns(item) 
For Each c As IColumnValue In fs.ToArray 
Console.WriteLine(c.FieldExpression.Expression(Nothing).ToString) 
Next 
以上这段代码也是,用于测试的,首先获取一个cmd对象,这个Cmd对象是根据传入的实体对象
构建成的一个UpdateCommand对象,也就是更新语句。
接着打印出更新语句。
然后获取传的实体那些字段参于了更新,实体在进行更新时,就会提交已修改的字段,
没有修改的字段,不会造成在Update语句中。这里是根据实体字段的状态State进行判断的。
其实真正更新实体的语句是
o1.Update(item),以上部门都是在Update方法内部实现的。
好了,今天就先到这里了,如果大家有兴趣,请继续关注!
主博客:http://zqonline.cnblogs.com
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
VB/C#.Net实体代码生成工具(EntitysCodeGenerate)【ECG】是一款专门为VB/C#.Net数据库程序员开发量身定做的(ORM框架)代码生成工具,所生成的代码基于面向对象、分层架构、ORM使用改进的抽象工厂设计模式及反射机制等。目前直接支持Oracle、SqlServer、Sybase、DB2、Access、MySQL、SQLite、PostgreSQL、DM(达梦)、OleDb和Custom(自定义)类型的数据库、PowerDesigner文件,同时也支持Informix、Firebird、MaxDB、Odbc等,可用于各种数据库。从数据库中生成表对应的VB/C#实体代码,并提取表及字段的注释等信息,亦可对生成的实体数据类型进行各种自定义的设置和方便的数据操作等。如数据库列和VB/C#代码类型的映射、实体命名空间、代码个性化注释、是否生成对应的数据操作等,操作简单实用。同时通过实体可快速实现数据库表的增删改查等操作,另外,所生成的操作数据库的代码,只需按生成的配置文件说明修改数据库连接,即可用于各种类型数据库的访问操作等,对应文件会自动解析,即一次生成可用于各种类型的数据库的操作;且当表字段发生重大变化时再生成一次即可。所有数据库的操作默认以实体对应表的主键(可以是联合主键)为准,当然也可指定条件。增加和更新合并为一个保存操作,由实体自己判断是增加还是更新,若你愿意也可以分开来做,实体也提供了对应的快捷方式等。更多的好处在你用过之后才会发现。工具同时提供帮助文档和大量的示例源码(如ECG.Demo等),用VS2005打开每个Demo文件解决方案文件(.sln)即可看到源代码,一些示例以对应数据库自带的示例库为例介绍的(如Oracle)。详见安装后文件和工具帮助. 最新版也可参见 http://download.csdn.net/source/3246612 http://www.skycn.com/soft/53715.html http://download.enet.com.cn/html/030212009031901.html http://qun.qq.com/air/#60873348/share http://blog.csdn.net/chutao/archive/2009/08/31/4504485.aspx

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值