该页代码及注释如下:<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>
分享到:
相关推荐
在Delphi编程环境中,主从表(Master-Detail)是一种常见的数据展示方式,它用于处理一对多的关系,例如一个订单可以...通过实践这个实例,开发者不仅可以提升Delphi编程技巧,还能深入理解数据库应用开发的关键环节。
利用TClientDataSet制作主从表是数据库应用设计中的常见方法,可以有效地管理和展示关联数据,类似于Access或SQL Server中的关系模型。下面我们将详细介绍如何使用Delphi的内存表来实现这一功能。 首先,了解主从表...
通过DataGridView简单应用,实现主从表数据行折叠展开,数据源行结构只要具有主从关系就行。详见代码中描述
在.NET框架中,C#是一种...这个过程涉及到数据库连接、数据查询、事件处理、数据绑定等多个方面的知识,是Windows桌面应用开发中的一个重要技能。在实践中,你可能还需要结合具体的业务需求,对代码进行调整和定制。
总结起来,这个示例将教给我们如何在C#的Windows应用程序中利用`DataGridView`展示主从表关系数据,通过用户交互动态更新从表数据,这对于理解和处理复杂数据关系的开发是非常重要的。在学习和实践中,务必注意代码...
cxGrid允许开发者在应用程序中构建主从表结构,这种结构通常用于显示和操作多层关联的数据。在本例中,我们将深入探讨如何从cxGrid组件中导出主从表记录,并获取从表的记录数。 首先,cxGrid的主表通常用于展示主要...
WinForm+Access主从表单据设计保存主表出错
Delphi作为一个强大的RAD(快速应用程序开发)工具,提供了丰富的组件和库来简化数据库交互,其中包括对主从表(Master-Detail)的支持。主从表是一种数据组织方式,通常用于展示一对多的关系,如订单与订单详情、...
在IT领域,尤其是在开发带有数据展示功能的软件应用时,组件如cxGrid是常见的用于创建主从表结构的工具。cxGrid是一款强大的Windows Forms控件,由Devart公司开发,适用于Visual Studio,它允许程序员创建复杂的网格...
在DevExpress的.NET开发工具集中,GridControl是一款强大的数据呈现控件,它提供了丰富的功能和高度定制性,使得在Windows Forms应用程序中实现主从表关系变得简单。主从表(Master-Detail)是一种常见的数据展示...
在IT行业中,主从表(Master-Detail)关系是一种常见的数据表示方式,特别是在数据库设计和Web应用程序开发中。本项目“Repeater实现主从表浏览”利用Visual Studio 2008(VS2008)和Northwind数据库,为我们展示了...
在IT领域,Silverlight是一种由微软开发的富互联网应用程序(RIA)平台,它允许开发者创建交互性强、用户体验丰富的Web应用。在本主题中,我们主要关注如何在Silverlight中使用主从表信息来显示数据,这通常涉及到...
2. **创建DataTable对象**:在主从表关系中,我们需要为每个表创建一个DataTable对象。主表DataTable将包含主键字段,而从表DataTable将包含外键字段,该外键指向主表的主键。 3. **定义DataRelation**:在DataSet...
在数据库应用开发中,主从表关系是一种常见的数据组织方式,主表通常存储关键信息,而从表则关联主表的某个字段,用于扩展主表的数据。`fastrepart`是一个可能的工具或方法,用于高效地处理这种关系。在这个场景下,...
一、使用视图meeting将多表关联整合在一起 二、通过Sql语句筛选数据 三、建立和主从表的关联 四、注意在CrystalReport1表中插入子报表的时候,一定要将主从表的关联字段设置好,否则出乱子
在ASP.NET开发中,"GridView无刷新主从表联动"是一种常见的数据展示方式,它能够提升用户体验,使得用户在查看和操作数据时无需等待页面完全刷新。这种技术通常用于显示两个相关联的数据表,其中一个是主表,另一个...
在.NET MVC框架中,开发一个主从表浏览的界面是一个常见的需求,这通常涉及到数据的层级展示和交互。本项目“嵌套Repeater实现主从表浏览(MVC)...通过理解和实践这些知识点,开发者可以更好地掌握Web应用开发的技巧。
DBGRIDEH 表中表 主表下拉明细表 主从表,选择一行记录,点击第一个单元格十字符号即可查询对应的明细表格。附源码!表格类型在实际使用中实用! 注意:数据库需自己按照实际情况配置一下, 应用的数据库控件 :...
Entity Framework(EF)是Microsoft开发的一个对象关系映射(ORM)框架,用于.NET应用程序,它允许开发者使用面向对象的编程语言来操作数据库,无需关注底层的SQL语句。在数据库领域,主从表是一个常见的概念,主表...
在.NET开发环境中,DevExpress是一款强大的UI控件集,它提供了丰富的功能来构建高效、美观的桌面和Web应用程序。本主题将深入探讨如何使用DevExpress控件实现主从表(Master-Detail)关系,这是一种常见的数据展示...