AJAX DataSet的使用心得-程序员宅基地

技术标签: delphi  string  ajax框架  Ajax专题  dataset  ajax  sql  

无论是VB、Delphi、.NET还是Java,都有提供对数据结果集的操作,有了数据结果集,我们只需要使用结果集的方法移动记录,获取记录字段数据,再结合界面,就可以很容易地完成一个数据库应用的编程,现在都流行用AJAX做基于web的系统了。

老大决定新版要用AJAX来做,给了我们用AJAX做一些试验和原型的任务,可是当我们的技术组在预研时,才发现到了web上完全不是那么回事呀,仅仅通过form表单来操作和提交数据要实现我们的设备管理真的很麻烦,以前都是用delphi三层结构,有ClientDataSet,有DCOM,MIDAS,还有我们最爱的DEV系列控件,界面以及数据的读取,操作,保存都是不需要太多程序的,我们还积累了不少框架和通用类呢。

了解了一些AJAX框架,大多是只支持java的,这次我们要用C#,也有少数.NET的AJAX开源的项目,功能就是些框架和一些不完整的类,偶和菜哥、阿狼搞了几天,还是没有搭好一个能够很好支撑我们项目开发的基础,可能我的js和html基础太差了,后来阿狼居然在网上发现有AJAX的WebShop,下了看了,居然非常像delphi,也有DataSet,还有很多数据感应的控件像DBGrid什么的,试了一下,发现这个DataSet确实厉害,竟然用javascript实现了以前的ClientDataSet,而且与数据感应控件的使用也沿袭了Delphi的模式,于是决定使用它,简单的应用也很容易,那个工具提供可视化的开发方式,也有示例,不过真正开发起来,在使用过程也遇到好多问题,幸好这个工具的开发商有在线客服,有些深入使用的功能就直接找他们问,我们的设备管理系统的原型只用了15天就搭建出来啦,AJAX确实厉害,功能上和操作方便性比以前的asp程序不知道好哪去了,哈哈。好了,言归正题,我们在做原型过程中用到最多的就是DataSet,有的时候没有使用数据感应控件,有的界面用了,我就把使用DataSet的一些心得给大家讲讲:

这个DataSet是一个客户端的AJAX数据集,完全是纯js的实现,界面与后台的数据交互基本上全是通过它进行的,包括数据的读取和提交。听他们说是用js操纵XML,能够进行分页、样式无刷新查询数据、还有如果增删改了少量数据,是实现的增量数据提交,而后台对应这个DataSet需要有相应的服务端程序,我用的是3.0版,可以支持C#,VB,Java,据他们说很快要出支持PHP的版本了,不过我们是用C#,看了他们C#的例子,好像是后台要实现两个类,一个处理取数据包括查询数据,另外一个处理数据的提交,但我们觉得封装一下似乎更好,完全可以用一个类的两个方法来写嘛,然后做一个控制层来转发。通过他们的例子和代码向导,我们知道取数据包括分页的代码(demo/Simple_Query.aspx)是这样的:

using System;

using System.Data;

using System.Data.OleDb;

using System.Configuration;

using System.Collections;

using System.Web;

using System.Web.Security;

using System.Web.UI;

using System.Web.UI.WebControls;

using System.Web.UI.WebControls.WebParts;

using System.Web.UI.HtmlControls;

using joyistar.eip.util;

using joyistar.eip.vo;

 

 

public partial class Simple_Query : System.Web.UI.Page {

    private String connString = "provider=Microsoft.Jet.OLEDB.4.0;Data Source="+System.Web.HttpContext.Current.Server.MapPath(".")+"//demo.mdb";

    private String sql = "select * from product";

    protected void Page_Load(object sender, EventArgs e)

    {

        Response.ContentType = "text/xml";

        String xml = HttpParser.getXML(Request.InputStream);

        XmlRequest xmlRequest = new XmlRequest();

 

        try

        {

            xmlRequest.Open(xml);

 

            OleDbConnection conn = new OleDbConnection(connString);

            conn.Open();

            OleDbCommand cmd = new OleDbCommand(sql, conn);

            OleDbDataReader reader = cmd.ExecuteReader();

            DataTable metadata = reader.GetSchemaTable();

      

            int rowCount;//the row number of the table

            int maxRow;  //the row number displayed per page,which is one of the DataSet Propery

            int recNo;  

            maxRow = xmlRequest.MaxRows;

            recNo = xmlRequest.RecNo;

            //get rowCount

            string sqlCount = "select   count(*)   from   product";

            OleDbConnection MyConn = new OleDbConnection(connString);

            MyConn.Open();

            OleDbCommand MyComm = new OleDbCommand(sqlCount, MyConn);

            rowCount = (int)(MyComm.ExecuteScalar());

                     if(maxRow==-1) maxRow = rowCount;

            xmlRequest.SetRecordCount(rowCount);

           //fill fields

            foreach (DataRow row in metadata.Rows)

            {

                if (row["DataType"].Equals("STRING"))

                {

                    xmlRequest.AddField(System.Convert.ToString(row["ColumnName"]), System.Convert.ToString(row["DataType"]), System.Convert.ToInt32(row["ColumnSize"]));

                }

                else

                    xmlRequest.AddField(System.Convert.ToString(row["ColumnName"]), System.Convert.ToString(row["DataType"]));

            }

            //fill data  of the page    

            int count = -1;

            while (reader.Read())

            {

                count++;

                if (count >= recNo)

                {

                    if (count < (recNo + maxRow))

                    {

                        xmlRequest.Append();

 

                        foreach (DataRow row in metadata.Rows)

                        {

                            String fieldname = System.Convert.ToString(row["ColumnName"]);

                            String fieldvalue = reader[fieldname].ToString();

                            xmlRequest.SetValue(fieldname, fieldvalue);

 

                        }

                    }

                    else break;

                }

 

                else

                { continue; }

 

 

            }

 

 

            Response.Write(xmlRequest.GetXml());

            Response.Flush();

 

        }

        catch (Exception ex)

        {

            xmlRequest.SetError(ex.Message);

            Response.Write(xmlRequest.GetXml());

            Response.Flush();

        }

        finally {

 

        }

    }

}
 

然后这个文件在界面上是这样使用的,选择好DataSet后,输入OpenURL属性为demo/Simple_Query.aspx,设置好这个就可以点Fields然后刷出表结构啦,当然你必须启动webserver,在那个Run里面有start webserver。对了,要能正常启动它,你需要安装有.NET Framework 2.0并在工程属性中配置好.NET路径哦:


再看DataSet的其他属性,Async是设置异步还是同步模式取数据,Active是打开数据,这样页面一载入就会取数据过来,也可以在程序中调用DataSet1.Open();来打开数据,如果要做一个查询,还要先关闭数据,传入参数,再打开数据执行查询,代码类似:

function Button1onclick() {

    DataSet1.Close();

    DataSet1.Params.Clear();

    if(Edit1.value) {

        DataSet1.Params.Add(new Param('NAME',Edit1.value,'string'));

    }

    DataSet1.Open();

}
 

 

当然,做查询后台也有代码,是这样写的:

            // the data search code here

            Param param1 = xmlRequest.GetParam("NAME");//get the search information

            String sql_params = "";

            if (param1 != null)

 

            {

                sql_params = " where NAME='" + param1.Value+"' ";

                sql += sql_params;

            }
 

在使用Async=true的异步模式时,我们有时遇到很奇怪的问题,比如几个表同时打开总是出错,后来仔细一想才明白,原来是码表和主表同时打开,主表打开时码表数据还没有取到,所以就出错了,于是设置主表在码表的afteropen后打开就搞定了。

切换到DataSet的事件页,可以看到它的事件列表,双击进去加上这个控制代码:


 

function DataSet3OnAfterOpen(dataset) {

       DataSet1.Open();

}
 

 

另外,DataSet有一个MaxRows属性,是指定每页取多少数据的,默认是5,如果设置成-1,就会取所有的数据哦。

DataSet要实现分页,就是使用了MaxRows,还有在后台的编程实现,根据MaxRows和RecNo来取数据,RecNo就是起始记录号,还要设置总记录数以便知道有多少页,用的xmlRequest.SetRecordCount(xxx);

这里的XmlRequest是他们封装的请求对象,后台的参数映射和数据返回都是用的它,比如XmlRequest.MaxRows, XmlRequest.RecNo, XmlRequest.AddField, XmlRequest.Append, XmlRequest.SetValue,基本上常用的就这些了。

DataSet还有一个DataSource属性似乎是只有Java才会用得到,还有如果我们自己封装后台类控制层,也可以启用这个属性。

DataSet有记录移动的方法,包括First, Prev ,Next,Last,SetPos这些,然后通过DataSet.Fields.Field[“字段名”].Value, DataSet.Fields.Fieldx[“字段序号”].Value可以取或写当前记录字段的值,增加记录用Append,修改用Edit,确定用Post,提交保存用Apply,取消修改用Cancel,删除用Delete,哈哈,和resultset的操作是完全类似的。

我有些模块就是用普通Input Text,然后通过DataSet与后台交互,真是相当的方便哩,有些就直接用数据感应的Input Text和DBGrid什么的,拖拉起,设置好属性就搞定啦。

最后,DataSet的PostURL就是用来设置数据提交保存的服务路径,数据的提交比取数据要麻烦一些,涉及到增删改几种情况的处理,对了,这个DataSet来支持主从表的取数据和数据提交,这在我们的开发中是太有用了,不过编程处理也相对复杂一些,我要把这段时间的代码整理下了,好给项目组的其他人一起讲下,改天有空再写一些提交数据和主从表操作的经验。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/lazypen555/article/details/5679594

智能推荐

linux devkmem 源码,linux dev/mem dev/kmem实现访问物理/虚拟内存-程序员宅基地

文章浏览阅读451次。dev/mem: 物理内存的全镜像。可以用来访问物理内存。/dev/kmem: kernel看到的虚拟内存的全镜像。可以用来访问kernel的内容。调试嵌入式Linux内核时,可能需要查看某个内核变量的值。/dev/kmem正好提供了访问内核虚拟内存的途径。现在的内核大都默认禁用了/dev/kmem,打开的方法是在 make menuconfig中选中 device drivers --> ..._dev/mem 源码实现

vxe-table 小众但功能齐全的vue表格组件-程序员宅基地

文章浏览阅读7.1k次,点赞2次,收藏19次。vxe-table,一个小众但功能齐全并支持excel操作的vue表格组件_vxe-table

(开发)bable - es6转码-程序员宅基地

文章浏览阅读62次。参考:http://www.ruanyifeng.com/blog/2016/01/babel.htmlBabelBabel是一个广泛使用的转码器,可以将ES6代码转为ES5代码,从而在现有环境执行// 转码前input.map(item => item + 1);// 转码后input.map(function (item) { return item..._让开发环境支持bable

FPGA 视频处理 FIFO 的典型应用_fpga 频分复用 视频-程序员宅基地

文章浏览阅读2.8k次,点赞6次,收藏29次。摘要:FPGA视频处理FIFO的典型应用,视频输入FIFO的作用,视频输出FIFO的作用,视频数据跨时钟域FIFO,视频缩放FIFO的作用_fpga 频分复用 视频

R语言:设置工作路径为当前文件存储路径_r语言设置工作目录到目标文件夹-程序员宅基地

文章浏览阅读575次。【代码】R语言:设置工作路径为当前文件存储路径。_r语言设置工作目录到目标文件夹

background 线性渐变-程序员宅基地

文章浏览阅读452次。格式:background: linear-gradient(direction, color-stop1, color-stop2, ...);<linear-gradient> = linear-gradient([ [ <angle> | to <side-or-corner>] ,]? &l..._background线性渐变

随便推点

【蓝桥杯省赛真题39】python输出最大的数 中小学青少年组蓝桥杯比赛 算法思维python编程省赛真题解析-程序员宅基地

文章浏览阅读1k次,点赞26次,收藏8次。第十三届蓝桥杯青少年组python编程省赛真题一、题目要求(注:input()输入函数的括号中不允许添加任何信息)1、编程实现给定一个正整数N,输出正整数N中各数位最大的那个数字。例如:N=132,则输出3。2、输入输出输入描述:只有一行,输入一个正整数N输出描述:只有一行,输出正整数N中各数位最大的那个数字输入样例:

网络协议的三要素-程序员宅基地

文章浏览阅读2.2k次。一个网络协议主要由以下三个要素组成:1.语法数据与控制信息的结构或格式,包括数据的组织方式、编码方式、信号电平的表示方式等。2.语义即需要发出何种控制信息,完成何种动作,以及做出何种应答,以实现数据交换的协调和差错处理。3.时序即事件实现顺序的详细说明,以实现速率匹配和排序。不完整理解:语法表示长什么样,语义表示能干什么,时序表示排序。转载于:https://blog.51cto.com/98..._网络协议三要素csdn

The Log: What every software engineer should know about real-time data's unifying abstraction-程序员宅基地

文章浏览阅读153次。主要的思想,将所有的系统都可以看作两部分,真正的数据log系统和各种各样的query engine所有的一致性由log系统来保证,其他各种query engine不需要考虑一致性,安全性,只需要不停的从log系统来同步数据,如果数据丢失或crash可以从log系统replay来恢复可以看出kafka系统在linkedin中的重要地位,不光是d..._the log: what every software engineer should know about real-time data's uni

《伟大是熬出来的》冯仑与年轻人闲话人生之一-程序员宅基地

文章浏览阅读746次。伟大是熬出来的  目录  前言  引言 时间熬成伟大:领导者要像狼一样坚忍   第一章 内圣外王——领导者的心态修炼  1. 天纵英才的自信心  2. 上天揽月的企图心  3. 誓不回头的决心  4. 宠辱不惊的平常心  5. 换位思考的同理心  6. 激情四射的热心  第二章 日清日高——领导者的高效能修炼  7. 积极主动,想到做到  8. 合理掌控自己的时间和生命  9. 制定目标,马..._当狼拖着受伤的右腿逃生时,右腿会成为前进的阻碍,它会毫不犹豫撕咬断自己的腿, 以

有源光缆AOC知识百科汇总-程序员宅基地

文章浏览阅读285次。在当今的大数据时代,人们对高速度和高带宽的需求越来越大,迫切希望有一种新型产品来作为高性能计算和数据中心的主要传输媒质,所以有源光缆(AOC)在这种环境下诞生了。有源光缆究竟是什么呢?应用在哪些领域,有什么优势呢?易天将为您解答!有源光缆(Active Optical Cables,简称AOC)是两端装有光收发器件的光纤线缆,主要构成部件分为光路和电路两部分。作为一种高性能计..._aoc 光缆

浏览器代理服务器自动配置脚本设置方法-程序员宅基地

文章浏览阅读2.2k次。在“桌面”上按快捷键“Ctrl+R”,调出“运行”窗口。接着,在“打开”后的输入框中输入“Gpedit.msc”。并按“确定”按钮。如下图 找到“用户配置”下的“Windows设置”下的“Internet Explorer 维护”的“连接”,双击选择“自动浏览器配置”。如下图 选择“自动启动配置”,并在下面的“自动代理URL”中填写相应的PAC文件地址。如下..._設置proxy腳本