该页代码及注释如下:<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[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>