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


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

    C:创建

    R:获取

    U:更新

    D:删除

    首先看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

         这里也是综合了几个方法的代码,首先看一下红色部份的代码
         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
    
    

  • 相关阅读:
    【LeetCode-字符串】重构字符串
    【LeetCode-二叉树】填充每个节点的下一个右侧节点指针
    【LeetCode-回溯】分割回文串
    【LeetCode-字符串】最后一个单词的长度
    【LeetCode-数组】生命游戏
    【LeetCode-链表】奇偶链表
    【LeetCode-字符串】反转字符串
    【LeetCode-数学】打乱数组
    Java中实现多线程的3种方法介绍和比较
    oracle 临时表空间、数据表空间、创建用户名与密码、赋予用户权限
  • 原文地址:https://www.cnblogs.com/zqonline/p/1321584.html
Copyright © 2020-2023  润新知