dzqlhh 发表于 2013-1-29 13:12:38

主从表的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>
            //填写该页的数据,默认的recNo为0,会填充第一页的数据<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.ToString();<o:p></o:p>
                                                                  if(fieldname=="SALE_DATE") {<o:p></o:p>
                                                                           fieldvalue = xmlRequest.getTime(((DateTime)reader));<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.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>
页: [1]
查看完整版本: 主从表的Ajax应用开发举例(第二页)