主从表的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>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值