`
dzqlhh
  • 浏览: 62084 次
社区版块
存档分类
最新评论

主从表的Ajax应用开发举例(第二页)

阅读更多

该页代码及注释如下:<o:p></o:p>

/**<o:p></o:p>

 * <p>Title: DBQuery</p><o:p></o:p>

 * <p>Description:To get the data from the database as demand </p><o:p></o:p>

 * <p>Copyright: Copyright (c) </p><o:p></o:p>

 * <p>Company:joyistar </p><o:p></o:p>

 * @author:pxy<o:p></o:p>

 * @version <o:p></o:p>

 */<o:p></o:p>

using System;<o:p></o:p>

using System.Data;<o:p></o:p>

using System.Data.OleDb;<o:p></o:p>

using System.Configuration;<o:p></o:p>

using System.Collections;<o:p></o:p>

using System.Web;<o:p></o:p>

using System.Web.Security;<o:p></o:p>

using System.Web.UI;<o:p></o:p>

using System.Web.UI.WebControls;<o:p></o:p>

using System.Web.UI.WebControls.WebParts;<o:p></o:p>

using System.Web.UI.HtmlControls;<o:p></o:p>

//两个包为WebShop自定义的包,已经编译成动态连库文件eip.dll;这个文件在新建project的时候便会自动产生在相应的目录下,不需要大家做额外的操作。<o:p></o:p>

using joyistar.eip.util; <o:p></o:p>

using joyistar.eip.vo;<o:p></o:p>

// 下面的基本代码是WebShop根据预先定义好的模板自动生成的(大家新建一个.net Service就可以看到这些自动生成的代码了),我们只需要针对具体的应用作出具体的修改。<o:p></o:p>

<o:p> </o:p>

public partial class MasterDetail_Query : System.Web.UI.Page {   <o:p></o:p>

//定义数据库连接和基本查询的sql语句,此处示例用的是acess数据库<o:p></o:p>

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

    private String sql = "select * from sale";<o:p></o:p>

    private String sql_detail = "select * from item";<o:p></o:p>

  <o:p></o:p>

    //页面加载时执行的函数         <o:p></o:p>

    protected void Page_Load(object sender, EventArgs e)<o:p></o:p>

    {<o:p></o:p>

        Response.ContentType = "text/xml";<o:p></o:p>

        String xml = HttpParser.getXML(Request.InputStream);//http请求转换为xml<o:p></o:p>

        XmlRequest xmlRequest = new XmlRequest();//构造XmlRequest对象<o:p></o:p>

                   try<o:p></o:p>

        {<o:p></o:p>

            xmlRequest.Open(xml);//xml格式化<o:p></o:p>

            XmlRequest detail = xmlRequest.GetDetail("DataSet2");//取得DataSet2的信息<o:p></o:p>

            <o:p></o:p>

            // 根据输入的SALE_ID来构造新的sql,以方便后面的查询。<o:p></o:p>

            Param param1 = xmlRequest.GetParam("SALE_ID");//取得查询的信心<o:p></o:p>

            String sql_params = "";<o:p></o:p>

            if (param1 != null)<o:p></o:p>

<o:p> </o:p>

            {<o:p></o:p>

                sql_params = " where SALE_ID=" + param1.Value;<o:p></o:p>

                sql += sql_params;<o:p></o:p>

            }<o:p></o:p>

            //连接数据库,执行sql<o:p></o:p>

            OleDbConnection conn = new OleDbConnection(connString);<o:p></o:p>

            conn.Open();<o:p></o:p>

            OleDbCommand cmd = new OleDbCommand(sql, conn);<o:p></o:p>

            OleDbDataReader reader = cmd.ExecuteReader();<o:p></o:p>

            DataTable metadata = reader.GetSchemaTable();<o:p></o:p>

         <o:p></o:p>

            int rowCount;//用来表示这个表一共有多少条数据<o:p></o:p>

            int maxRow;//Grid中每一页显示的数据条数,也就是行数.<o:p></o:p>

            int recNo; //当前行的序号.每一页会默认指向第一行.<o:p></o:p>

            maxRow = xmlRequest.MaxRows;<o:p></o:p>

            recNo = xmlRequest.RecNo;<o:p></o:p>

           //这个数据库操作用来算出主表一共有多少条数据rowCount,以方便后面的分页。<o:p></o:p>

            string strCount = "select   count(*)   from   sale " + sql_params;<o:p></o:p>

            OleDbConnection MyConn = new OleDbConnection(connString);<o:p></o:p>

            MyConn.Open();<o:p></o:p>

            OleDbCommand MyComm    = new OleDbCommand(strCount, MyConn);<o:p></o:p>

            rowCount               = (int)(MyComm.ExecuteScalar());<o:p></o:p>

            xmlRequest.SetRecordCount(rowCount);<o:p></o:p>

            MyConn.Close();<o:p></o:p>

            //这一段用来填充主表的字段<o:p></o:p>

            foreach (DataRow row in metadata.Rows)<o:p></o:p>

            {<o:p></o:p>

                if (row["DataType"].Equals("STRING"))<o:p></o:p>

                {<o:p></o:p>

                    xmlRequest.AddField(System.Convert.ToString(row["ColumnName"]), System.Convert.ToString(row["DataType"]), System.Convert.ToInt32(row["ColumnSize"]));<o:p></o:p>

                }<o:p></o:p>

                else<o:p></o:p>

                    xmlRequest.AddField(System.Convert.ToString(row["ColumnName"]), System.Convert.ToString(row["DataType"]));<o:p></o:p>

            }<o:p></o:p>

            //填写该页的数据,默认的recNo0,会填充第一页的数据<o:p></o:p>

            <o:p></o:p>

            int count = -1;//count 用来表示reader.Read()执行的次数,也就是表示读到第count条数据.<o:p></o:p>

            int i = 0;<o:p></o:p>

            while (reader.Read())<o:p></o:p>

            {<o:p></o:p>

                i++;<o:p></o:p>

                int id = 0;<o:p></o:p>

                id = reader.GetInt32(0);<o:p></o:p>

                count++;<o:p></o:p>

                if (count >= recNo)<o:p></o:p>

                {<o:p></o:p>

                   if (count < (recNo + maxRow))<o:p></o:p>

                    {<o:p></o:p>

                        xmlRequest.Append();<o:p></o:p>

<o:p> </o:p>

                        foreach (DataRow row in metadata.Rows)<o:p></o:p>

                        {<o:p></o:p>

                            String fieldname = System.Convert.ToString(row["ColumnName"]);<o:p></o:p>

                            String fieldvalue = reader[fieldname].ToString();<o:p></o:p>

                                                                  if(fieldname=="SALE_DATE") {<o:p></o:p>

                                                                           fieldvalue = xmlRequest.getTime(((DateTime)reader[fieldname]));<o:p></o:p>

                                                                  }<o:p></o:p>

                            xmlRequest.SetValue(fieldname, fieldvalue);<o:p></o:p>

<o:p> </o:p>

                        }<o:p></o:p>

                       <o:p></o:p>

                        processDetail(id, detail,i);//这个函数用来填充从表的数据.从表字段的填充机制是这样的:主表逐条读取当前页的所有记录,读取一条,从表就填充一次.<o:p></o:p>

                    }<o:p></o:p>

                    else break;<o:p></o:p>

                }<o:p></o:p>

<o:p> </o:p>

               else{ continue; }<o:p></o:p>

           }<o:p></o:p>

            Response.Write(xmlRequest.GetXml());<o:p></o:p>

            Response.Flush();<o:p></o:p>

<o:p> </o:p>

        }<o:p></o:p>

       catch (Exception ex)<o:p></o:p>

        {<o:p></o:p>

            xmlRequest.SetError(ex.Message);<o:p></o:p>

            System.Console.WriteLine(ex.StackTrace);<o:p></o:p>

            Response.Write(xmlRequest.GetXml());<o:p></o:p>

            Response.Flush();<o:p></o:p>

        }<o:p></o:p>

      <o:p></o:p>

        finally<o:p></o:p>

        {<o:p></o:p>

           <o:p></o:p>

        }<o:p></o:p>

    }<o:p></o:p>

<o:p> </o:p>

    /**<o:p></o:p>

      * process detail table,fill fields and fill data. <o:p></o:p>

      * <o:p></o:p>

      * @Param id:master keyfield value<o:p></o:p>

      * @Param detail:  XmlRequest object<o:p></o:p>

      * @Param i: the number controls the data read times<o:p></o:p>

      * <o:p></o:p>

      * @return<o:p></o:p>

      */<o:p></o:p>

            //这个函数用来填充从表数据<o:p></o:p>

    private void processDetail(int id, XmlRequest detail, int i)<o:p></o:p>

    {<o:p></o:p>

        //从表填充的时候需要先构造其sql,然后执行sql, 返回数据.<o:p></o:p>

                   String sql_detail_id = "";<o:p></o:p>

        sql_detail_id = sql_detail + " where ITEM_ID=" + id;//构造sql,主从表的数据是通过主外键关联的.<o:p></o:p>

        OleDbConnection coon_detail = new OleDbConnection(connString);<o:p></o:p>

        coon_detail.Open();<o:p></o:p>

        OleDbCommand cmd2 = new OleDbCommand(sql_detail_id, coon_detail);<o:p></o:p>

        OleDbDataReader reader2 = cmd2.ExecuteReader();<o:p></o:p>

        DataTable metadata2 = reader2.GetSchemaTable();<o:p></o:p>

        if (i == 1)<o:p></o:p>

        {<o:p></o:p>

<o:p> </o:p>

<o:p> </o:p>

            //填充从表字段<o:p></o:p>

            foreach (DataRow row in metadata2.Rows)<o:p></o:p>

            {<o:p></o:p>

                if (row["DataType"].Equals("STRING"))<o:p></o:p>

                {<o:p></o:p>

                    detail.AddField(System.Convert.ToString(row["ColumnName"]), System.Convert.ToString(row["DataType"]), System.Convert.ToInt32(row["ColumnSize"]));<o:p></o:p>

<o:p> </o:p>

                }<o:p></o:p>

                else<o:p></o:p>

                    detail.AddField(System.Convert.ToString(row["ColumnName"]), System.Convert.ToString(row["DataType"]));<o:p></o:p>

            }<o:p></o:p>

        }<o:p></o:p>

        //填充从表的值<o:p></o:p>

        while (reader2.Read())<o:p></o:p>

        {<o:p></o:p>

            detail.Append();<o:p></o:p>

<o:p> </o:p>

            foreach (DataRow row in metadata2.Rows)<o:p></o:p>

            {<o:p></o:p>

<o:p> </o:p>

                String fieldname = System.Convert.ToString(row["ColumnName"]);<o:p></o:p>

                String fieldvalue = reader2[fieldname].ToString();<o:p></o:p>

<o:p> </o:p>

                detail.SetValue(fieldname, fieldvalue);<o:p></o:p>

<o:p> </o:p>

            }<o:p></o:p>

分享到:
评论

相关推荐

    Delphi主从表自创实例

    在Delphi编程环境中,主从表(Master-Detail)是一种常见的数据展示方式,它用于处理一对多的关系,例如一个订单可以...通过实践这个实例,开发者不仅可以提升Delphi编程技巧,还能深入理解数据库应用开发的关键环节。

    利用delphi中的内存表来制作主从表

    利用TClientDataSet制作主从表是数据库应用设计中的常见方法,可以有效地管理和展示关联数据,类似于Access或SQL Server中的关系模型。下面我们将详细介绍如何使用Delphi的内存表来实现这一功能。 首先,了解主从表...

    主从表折叠应用(DataGridView),图标可换

    通过DataGridView简单应用,实现主从表数据行折叠展开,数据源行结构只要具有主从关系就行。详见代码中描述

    使用DataGridView控件实现主从表

    在.NET框架中,C#是一种...这个过程涉及到数据库连接、数据查询、事件处理、数据绑定等多个方面的知识,是Windows桌面应用开发中的一个重要技能。在实践中,你可能还需要结合具体的业务需求,对代码进行调整和定制。

    C#中DataGridView主从表例子

    总结起来,这个示例将教给我们如何在C#的Windows应用程序中利用`DataGridView`展示主从表关系数据,通过用户交互动态更新从表数据,这对于理解和处理复杂数据关系的开发是非常重要的。在学习和实践中,务必注意代码...

    导出cxGrid主从表记录

    cxGrid允许开发者在应用程序中构建主从表结构,这种结构通常用于显示和操作多层关联的数据。在本例中,我们将深入探讨如何从cxGrid组件中导出主从表记录,并获取从表的记录数。 首先,cxGrid的主表通常用于展示主要...

    WinForm主从表单据设计

    WinForm+Access主从表单据设计保存主表出错

    DELPHI 主从表控制

    Delphi作为一个强大的RAD(快速应用程序开发)工具,提供了丰富的组件和库来简化数据库交互,其中包括对主从表(Master-Detail)的支持。主从表是一种数据组织方式,通常用于展示一对多的关系,如订单与订单详情、...

    cxGrid主从表从表二次新增记录不显示

    在IT领域,尤其是在开发带有数据展示功能的软件应用时,组件如cxGrid是常见的用于创建主从表结构的工具。cxGrid是一款强大的Windows Forms控件,由Devart公司开发,适用于Visual Studio,它允许程序员创建复杂的网格...

    DevExpress中GridControl 主从表如何实现

    在DevExpress的.NET开发工具集中,GridControl是一款强大的数据呈现控件,它提供了丰富的功能和高度定制性,使得在Windows Forms应用程序中实现主从表关系变得简单。主从表(Master-Detail)是一种常见的数据展示...

    Repeater 实现主从表浏览

    在IT行业中,主从表(Master-Detail)关系是一种常见的数据表示方式,特别是在数据库设计和Web应用程序开发中。本项目“Repeater实现主从表浏览”利用Visual Studio 2008(VS2008)和Northwind数据库,为我们展示了...

    silverlight使用主从表信息显示datagrid

    在IT领域,Silverlight是一种由微软开发的富互联网应用程序(RIA)平台,它允许开发者创建交互性强、用户体验丰富的Web应用。在本主题中,我们主要关注如何在Silverlight中使用主从表信息来显示数据,这通常涉及到...

    简单学习主从表

    2. **创建DataTable对象**:在主从表关系中,我们需要为每个表创建一个DataTable对象。主表DataTable将包含主键字段,而从表DataTable将包含外键字段,该外键指向主表的主键。 3. **定义DataRelation**:在DataSet...

    fastrepart实现主从表

    在数据库应用开发中,主从表关系是一种常见的数据组织方式,主表通常存储关键信息,而从表则关联主表的某个字段,用于扩展主表的数据。`fastrepart`是一个可能的工具或方法,用于高效地处理这种关系。在这个场景下,...

    主从表关联问题

    一、使用视图meeting将多表关联整合在一起 二、通过Sql语句筛选数据 三、建立和主从表的关联 四、注意在CrystalReport1表中插入子报表的时候,一定要将主从表的关联字段设置好,否则出乱子

    GridView无刷新主从表联动

    在ASP.NET开发中,"GridView无刷新主从表联动"是一种常见的数据展示方式,它能够提升用户体验,使得用户在查看和操作数据时无需等待页面完全刷新。这种技术通常用于显示两个相关联的数据表,其中一个是主表,另一个...

    嵌套 Repeater 实现主从表浏览(MVC)

    在.NET MVC框架中,开发一个主从表浏览的界面是一个常见的需求,这通常涉及到数据的层级展示和交互。本项目“嵌套Repeater实现主从表浏览(MVC)...通过理解和实践这些知识点,开发者可以更好地掌握Web应用开发的技巧。

    DBGRIDEH 表中表 主表下拉明细表 主从表

    DBGRIDEH 表中表 主表下拉明细表 主从表,选择一行记录,点击第一个单元格十字符号即可查询对应的明细表格。附源码!表格类型在实际使用中实用! 注意:数据库需自己按照实际情况配置一下, 应用的数据库控件 :...

    Entity Framework主从表使用

    Entity Framework(EF)是Microsoft开发的一个对象关系映射(ORM)框架,用于.NET应用程序,它允许开发者使用面向对象的编程语言来操作数据库,无需关注底层的SQL语句。在数据库领域,主从表是一个常见的概念,主表...

    devexpress主从表实现

    在.NET开发环境中,DevExpress是一款强大的UI控件集,它提供了丰富的功能来构建高效、美观的桌面和Web应用程序。本主题将深入探讨如何使用DevExpress控件实现主从表(Master-Detail)关系,这是一种常见的数据展示...

Global site tag (gtag.js) - Google Analytics