使用VB.Net写一个简单的数据访问层(不能称ORM):CRUD操作
2008-10-28 19:13
886 查看
上一篇,简单的介绍了实体对象的一些方法和属性。接下来看看,CRUD操作。
C:创建
R:获取
U:更新
D:删除
首先看C:
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
相关文章推荐
- 使用VB.Net写一个简单的数据访问层(不能称ORM):CRUD操作
- 使用VB.Net写一个简单的数据访问层(不能称ORM):前言
- 使用VB.Net写一个简单的数据访问层(不能称ORM):前言
- 使用VB.Net写一个简单的数据访问层:T-Sql函数的支持。
- 使用VB.Net写一个简单的数据访问层:T-Sql函数的支持。
- 一个简单的动态编译器,支持C#和VB.NET。当你想测试一些简单的代码的时候可以使用。
- sharpziplib是一个不错的在线压缩软软件.用VB.net简单写了个使用代码!
- ado.net 操作excel 问题记录 -- 操作必须使用一个可更新的查询
- [VB.NET]使用ODBC更新DBF表时提示操作符号丢失 怎么弄啊
- [VB.NET]一个简单的问题!立刻给分!
- [VB.NET]Socket 最简单的使用问题
- ASP.NET_ACCESS_操作必须使用一个可更新的查询
- android 使用 websocket 进行长链接的一个简单的 demo,可以用来收发消息或别的操作,里面用到了 autobahn 的 jar 包
- ORM,ASP.NET中ORM学习,ASP.NET中ORM学习心得,WEB2.0中ORM实现原理,Asp.net简单ORM示例源码详细讲解,Asp.net2.0:如何使用ObjectDataSource(配合ORM )
- git 使用 (此处作为基础 大多是只有一个分支时的简单操作)
- b/s软件中使用Access数据库,只能查询,不能添加、修改、删除,提示操作必须是一个可更新的查询解决。
- ASP.Net下如何解决关于Access数据库“操作必须使用一个可更新的查询”问题
- VB.NET操作Word,解决“RPC 服务器不能用”错误
- 一步一步教你使用AgileEAS.NET基础类库进行应用开发-基础篇-演示ORM的基本操作
- VB.NET 中 使用 ListView 控件的简单例子