当前位置: 首页 > 编程日记 > 正文

与ObjectDataSource共舞

4,ORM组件XCode(与ObjectDataSource共舞)

XCode为了能更方便的解决大部分问题,不得不“屈身”于ObjectDataSource。

先上一个经典例子(ObjectDataSource+GridView)(ObjectDataSource):

<asp:GridView ID="GridView1" runat="server" AllowPaging="True" AllowSorting="True"
    AutoGenerateColumns
="False" DataKeyNames="ID" DataSourceID="ObjectDataSource1"
    EnableModelValidation
="True">
    
<Columns>
        
<asp:BoundField DataField="ID" HeaderText="ID" InsertVisible="False" ReadOnly="True"
            SortExpression
="ID" />
        
<asp:BoundField DataField="Name" HeaderText="Name" SortExpression="Name" />
        
<asp:BoundField DataField="ParentID" HeaderText="ParentID" SortExpression="ParentID" />
        
<asp:BoundField DataField="test" HeaderText="test" SortExpression="test" />
        
<asp:BoundField DataField="Description" HeaderText="Description" SortExpression="Description" />
    
</Columns>
</asp:GridView>
<asp:ObjectDataSource ID="ObjectDataSource1" runat="server" DataObjectTypeName="PurpleSun.Center.Area"
    DeleteMethod
="Delete" EnablePaging="True" InsertMethod="Insert" OldValuesParameterFormatString="original_{0}"
    SelectCountMethod
="FindCountByName" SelectMethod="FindAllByName" SortParameterName="orderClause"
    TypeName
="PurpleSun.Center.Area" UpdateMethod="Save">
    
<SelectParameters>
        
<asp:Parameter Name="name" Type="String" />
        
<asp:Parameter Name="value" Type="Object" />
        
<asp:Parameter Name="orderClause" Type="String" />
        
<asp:Parameter Name="startRowIndex" Type="Int32" />
        
<asp:Parameter Name="maximumRows" Type="Int32" />
    
</SelectParameters>
</asp:ObjectDataSource>

下面用截图演示整个过程:

拖GridView和ObjectDataSource

wps_clip_image-15245

选中ObjectDataSource,注意右上角的智能标记

wps_clip_image-23943

配置数据源

wps_clip_image-16852

这里只列出数据组件,为什么这里只有我们的Area类?为什么?我们看看实体类

wps_clip_image-12458

就是DataObject特性起的作用,应该说,所有加了该特性的类,都会被当作数据组件在ObjectDataSource配置里面出现。当然,不加DataObject特性也是可以的,但是在ObjectDataSource配置的时候,就不能勾选数据组件了,那样会列出所有类(是的,所有类)。

选择Area类,继续

wps_clip_image-24997

继续猜测,这里能列出这些方法,应该也是有特性的,那就是DataObjectMethod特性啦。

wps_clip_image-9268

第一个参数代表方法类型(查询、插入、更新、删除),第二个参数表示是否默认方法,默认方法会在配置ObjectDataSource时被默认选中。

当然啦,另外三个配置页也是有的(这里以Update为例)

wps_clip_image-12855

wps_clip_image-24612

最后一步定义参数,在这里就不定义了

wps_clip_image-16010

可以看到,左边已经列出了前面选择的Select方法的所有参数。

来看看一个神奇的地方

wps_clip_image-21754wps_clip_image-27958

ObjectDataSource可以把查询参数绑定到Cookie、控件、Request.Form、Request.QueryString、Session等。我们一般绑定到控件,做查询的时候非常有用。每一个查询项作为一个参数,然后在这里绑定到对应的控件;也经常绑定到QueryString,比如表单页面编辑数据的时候,这里绑定主键,然后就能把相应的对象找出来。

这里神奇的地方就在于绑定。需要做复杂查询的时候,可以在界面上放置查询控件

wps_clip_image-140

然后编写一个对应的查询方法,当然要加上DataObjectMethod特性了,然后在ObjectDataSource配置的时候把参数和控件绑定起来

wps_clip_image-9814

(关于这类高级查询后面专门介绍,这里仅仅是为了说明绑定的神奇)

绑定的神奇就在于,界面控件问数据源控件(如ObjectDataSource)要数据的时候,数据源控件开始着手准备参数,反射读取绑定控件的值作为参数,并转为相应的类型,然后再反射调用实体类的查询方法(如Search)。

到这里,ObjectDataSource的基本配置已经完成,绝大多数ORM框架对ObjectDataSource的支持,也仅仅是到这里而已。而XCode的模型,是完全满足ObjectDataSource要求的,下面继续高级功能

wps_clip_image-31176

这是ObjectDataSource控件属性中的分页类属性,第一项启用分页,第三项指定用于查询所有记录数的方法(前面提到过查询方法是成对出现的,这里的FindAllByName和FindCountByName就是一对),至于第二项和第四项,是不是很熟悉?

wps_clip_image-17527

wps_clip_image-6921

这两个方法,一个返回实体集合,一个返回总行数,而参数则是一摸一样。这就是ObjectDataSource对分页查询的要求,如果没有第二个,ObjectDataSource也能提供查询数据功能,但是就没办法分页了。

回过头了,仔细看看最后两个参数的名称,是不是跟ObjectDataSource属性中的那两个一摸一样?所以,XCode使用这两个名字作为参数名,正是这个原因。如果查询方法使用的不是这两个参数,那么在配置ObjectDataSource的时候自己跟着改就是了。

这两个参数,第一个是从哪一行开始读数据,第二个是返回的最大行数,其实就是每页行数。这种分页结构,跟别的绝大部分分页控件什么的都不相同。所以,并不是XCode的分页另类,而是别的分页才是另类,XCode是正统(哈哈)。

除了分页属性,再看看一个排序属性

wps_clip_image-8804

正是查询方法的倒数第三个参数。GridView在排序的时候,会给这个参数传递ID Asc或Name Desc等。而查询方法内部,正是根据这个参数,以及两个分页参数,拼接SQL语句进行查询的。

至此,ObjectDataSource配置完成。打开GridView的智能标记,选择ObjectDataSource控件作为数据源,GridView即可自动生成列

wps_clip_image-7754

当然,这个列并不是数据库字段,而是实体类的属性。

在智能标记面板上可以看到,启用分页和启用排序可以勾选了,正是因为刚才在ObjectDataSource中配置好了。都勾上!

运行,看效果

wps_clip_image-6948

界面很丑,不过那是美工的事情了。试试分页(打开OrmDebug开关,查看SQL语句)

wps_clip_image-8101

执行的SQL:

Select * From (Select row_number() over(Order By ID Desc) as row_number, * From Area) XCode_Temp_b Where row_Number Between 71 And 80

这是XCode生成的分页语句,因为现在测试环境是SQL2008,随意生成了row_number的分页,如果是别的数据库,就会不同了。但那是XCode的事情,开发者不需要关心。

再试试在分页的基础上排序(点击Name):

wps_clip_image-31464

执行的SQL:

Select * From (Select row_number() over(Order By Name) as row_number, * From Area) XCode_Temp_b Where row_Number Between 81 And 90

排序已经改为Order By Name了,再点一次Name,执行SQL:

Select * From (Select row_number() over(Order By Name DESC) as row_number, * From Area) XCode_Temp_b Where row_Number Between 81 And 90

完全满足要求!

BTW:GridView那里,其实还可以启用编辑和删除的,因为配置ObjectDataSource的时候,默认已经配置了编辑和删除的方法。

最后,目的已经达到,或许你还没有发现,到这里我们还没有手工编写任何代码呢!

XCode与ObjectDataSource共舞可以得到非常美的开发效果,但是,上面的模式,已经是三年前的做法了,我们现在有了更好的工业级的做法——批量生产

大石头

新生命开发团队

2010-08-24 13:25

转载于:https://www.cnblogs.com/nnhy/archive/2010/09/13/1824669.html

相关文章:

2.4 Go语言基础之切片

本文主要介绍Go语言中切片&#xff08;slice&#xff09;及它的基本使用。 一、引子 因为数组的长度是固定的并且数组长度属于类型的一部分&#xff0c;所以数组有很多的局限性。 例如&#xff1a; func arraySum(x [3]int) int{sum : 0for _, v : range x{sum sum v}return …

java 文件下载 【学习记录】

工具类 public static Boolean downloadExcelFile(HttpServletResponse response, String fileName) {OutputStream output;File file new File(fileName);if (file.exists()) {try {FileInputStream fileInputStream new FileInputStream(file);BufferedInputStream buffe…

[UI自动化]:控制浏览器操作

控制浏览器窗口大小 . PC端执行自动化测试脚本大多的情况下是希望浏览器在全屏幕模式下执行&#xff0c;那么可以使用maximize_window()方法使打开的浏览器全屏显示 控制浏览器后退、前进 在使用浏览器浏览网页时&#xff0c;浏览器提供了后退和前进按钮&#xff0c;可以方便地…

在项目中使用Google Closure Compiler

现在的Web项目总是离不开大量JavaScript&#xff0c;而JS文件的体积也越来越大&#xff0c;也越来越影响页面的感知性能&#xff08;Perceived Performance&#xff09;。因此&#xff0c;我们会对JS文件进行压缩&#xff0c;一方面是使用Gzip&#xff0c;而另一方面则是去除JS…

文件服务器共享目录设置(二)

三、 设置磁盘配额及文件屏蔽 为了防止用户无限制的上传文件&#xff0c;或上传病毒木马等文件&#xff0c;还需要进一步加强安全设置。用磁盘配额来管理用户的文件夹空间&#xff0c;用文件屏蔽来阻止用户上传有风险的文件。 在win2003中&#xff0c;磁盘配额只能…

Codeforces 894.D Ralph And His Tour in Binary Country

D. Ralph And His Tour in Binary Countrytime limit per test2.5 secondsmemory limit per test512 megabytesinputstandard inputoutputstandard outputRalph is in the Binary Country. The Binary Country consists of n cities and (n - 1) bidirectional roads connect…

linux下获取系统时间 和 时间偏移

获取linux时间 并计算时间偏移 void getSystemTimer(void){#if 0 char *wdate[]{"Sun","Mon","Tue","Wed","Thu","Fri","Sat"} ; time_t timep; struct tm *p; time(&timep); pgmtime(&timep)…

使用git命令上传本地文件到GitHub上

1、官网下载git并且anz安装 2、在Github上申请账号 3、在本地使用git命令生成私钥和公钥 连续按三次 回车键 $ ssh-keygen -t rsa -C "账号"生成如图 将生成的公钥设置到github上 &#xff0c; 生成公钥的地址是 ./ssh &#xff08;C盘的用户目录&#xff09; 4…

POI解析Excel文件工具类

/*** 读取excel数据*/public static List<Map<String, Object>> exportListFromExcel(File file, int sheetNum) throws IOException { return exportListFromExcel(new FileInputStream(file), FilenameUtils.getExtension(file.getName()), sheetNum); } publ…

关于Bulk加载模式

Bulk加载模式是Informatica提供的一种高性能数据加载模式&#xff0c;它利用数据库底层机制&#xff0c;依靠调用数据库本身提供的Utility来进行数据的加载  该方式将绕过数据库的log记录&#xff0c;以此提高数据库加载性能&#xff0c;因此Bulk模式不能进行数据的Rollback操…

C#:CsvReader读取.CSV文件(转换成DataTable)

原文引用&#xff1a;https://www.codeproject.com/Articles/9258/A-Fast-CSV-Reader using LumenWorks.Framework.IO.Csv;using System;using System.Collections.Generic;using System.Data;using System.IO;using System.Linq;using System.Text;using System.Threading.Tas…

Standup Timer的MVC模式及项目结构分析

前言 学习android一段时间了&#xff0c;为了进一步了解android的应用是如何设计开发的&#xff0c;决定详细研究几个开源的android应用。从一些开源应用中吸收点东西&#xff0c;一边进行量的积累&#xff0c;一边探索android的学习研究方向。这里我首先选择了jwood的Standup …

ISDN的配置

ISDN的配置 1、 实验目的&#xff1a; 通过配置ISDN使两个路由器之间能够通信 2、 实验拓扑图&#xff1a; 3、 实验步骤&#xff1a; &#xff08;1&#xff09; R1的配置 Router> R1的ISDN配置 Router>en R…

5,ORM组件XCode(动手)

本篇才真正是XCode教程第一篇。《速览》是为了以最简洁的语言最短小的篇幅去吸引开发者&#xff1b;《简介》则是对XCode组件和XCode开发模式的一个整体介绍&#xff0c;让开发者从宏观的角度去理解XCode&#xff1b;《共舞》把XCode提到了一个新的高度&#xff0c;让开发者感受…

前端知识分享.md

目录 一些支持固定列和表头的组件库element UIiViewAmaze UIlayui一些比较好的IDEMVVM 框架VueNode生态其它SassTypeScript一些支持固定列和表头的组件库 element UI https://element.eleme.cn/#/zh-CN/component/table iView https://www.iviewui.com/components/table Amaze …

C 输入 输出

C 输入 & 输出 当我们提到输入时&#xff0c;这意味着要向程序填充一些数据。输入可以是以文件的形式或从命令行中进行。C 语言提供了一系列内置的函数来读取给定的输入&#xff0c;并根据需要填充到程序中。 当我们提到输出时&#xff0c;这意味着要在屏幕上、打印机上或任…

搭建服务器环境 安装jdk、mysql、Tomcat 以及配置https 记录

1.在cenos上安装 jdk #在usr/local下创建 java 文件夹 mkdir java#将jdk拷贝到该文件夹中 [rootVM_0_15_centos jdk1.8.0_181]# cp jdk-8u181-linux-x64.tar.gz /usr/local/java/#解压该文件 [rootVM_0_15_centos jdk1.8.0_181]# tar -zxvf jdk-8u181-linux-x64.tar.gz #配置环…

一个Java程序员应该掌握的10项技能

1、语法&#xff1a;必须比较熟悉&#xff0c;在写代码的时候IDE的编辑器对某一行报错应该能够根据报错信息知道是什么样的语法错误并且知道任何修正。 2、命令&#xff1a;必须熟悉JDK带的一些常用命令及其常用选项&#xff0c;命令至少需要熟悉&#xff1a;appletviewer、 Ht…

逆向-攻防世界-maze

题目提示是走迷宫。 IDA载入程序分析。 输入字符长度必须是24&#xff0c;开头必须是nctf{&#xff0c;结尾必须是}。在125处按R就可以变成字符。 sub_400650和sub_400660是关键函数&#xff0c;分析sub_400650。 v10的下一字节减1. sub_400660v10的下一字节加1. 分析这两个函数…

linxu passwd 给linux用户设置密码 命令

[rootlocalhost ~]# passwd # 修改 root 用户的密码passwd 给linux用户设置密码 命令 passwd www 直接passwd是当前用户设置密码 非交互式修改密码&#xff1a; echo "123456" |passwd --stdin www [rootMongoDB ~]# echo "123456" | passwd…

MultipartFile 使用 记录

MultipartFile file 获取文件流 file.getInputStream()&#xff1b; 获取文件名称 String fileName file.getOriginalFilename(); 待补充

多语言加载图片问题

系统要求多语言&#xff1a;中文和英文&#xff0c;分别在两个xml文件中书写相关内容&#xff0c;类似&#xff1a; <root><resource name"VersionName">Version</resource><resource name"Logout">Logout</resource></r…

5.html基础标签:块级+行级元素+特殊字符+嵌套规则

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Document</title> </head> <body><!-- 块元素&#xff1a;独立成一行(相当于标签前后都设置了br),可以设置宽高,默认宽高100%文字…

[摘]终于找到一个有助理解left/right/full outer join的例子

近日在学习《Understading DB2》的时候找到了一个例子&#xff0c;对于理解 left/right/full 三种 outer join 的大有裨益。 先看样本数据&#xff0c;来自DB2的示例数据库 sample&#xff1a; db2 > insert into employee values(99999,killkill,N,Huang,null,null,null,no…

vue——props的两种常用方法

vue——props的两种常用方法 1、实现父——>子的通信 举例如下&#xff1a; 父组件 parent.vue<children :channel"object1"></children> 子组件 children.vue export default{name:"children",props:["channel"],data(){return{…

idea导入模板

1.我的配置文件下载 请点下面的连接 https://download.csdn.net/download/huyande123/10728802 先导入第二个文件&#xff0c;在导入第一个文件 在此基础上添加了类注释和方法注释&#xff08;方法注释快捷键 qtab&#xff09; 参考链接 https://blog.csdn.net/qq_34581118…

为office添加繁简体转换

为office添加繁简体转换本人所在的公司是一间港资公司&#xff0c;很多香港同事习惯繁体&#xff0c;而我们内地的同事则习惯简体&#xff0c;于是免不了要进行繁简体转换&#xff0c;这时候就要装一个office的插件来达到这样的功能&#xff0c;如下&#xff1a;1、没装插件的时…

关闭Windows 7中的 Program Compatibility Assistant

感觉微软总喜欢把简单问题复杂化。安装几个小软件也老是弹出这样的对话框&#xff1a; 然后点击“What settings are applied?”&#xff0c;看到帮助中一段&#xff1a; 提示我在组策略里能够关闭这个烦人的程序兼容性助手&#xff0c;却没有明说&#xff0c;故意卖关子呢。那…

Swift学习:自动引用计数

swift 使用自动引用计数&#xff08;ARC&#xff09;机制来跟踪和管理你的应用程序的内存。通常情况下&#xff0c;swift 内存管理机制会一直起作用&#xff0c;你无须自己来考虑内存的管理。ARC 会在类的实例不再被使用时&#xff0c;自动释放其占用的内存。 然而在少数情况下…

简单又实用的分享!SharePoint母版页引用(实战)

分享人&#xff1a;广州华软 极简 一. 前言 此SharePoint 版本为2013&#xff0c;请注意版本号。此文以图文形式&#xff0c;描述了根网站及子网站引用母版页&#xff0c;需要注意的点已用图文形式以标明。 本文适用于初学者。 二. 目录 1. 前言 2. 目录 3. 如何引用母版页 4. …