MsaterDetail_Update.aspx.cs文件主要用于将前端页面的增删改操作产生的xml消息解析成对应的sql语句,并且执行之。<o:p></o:p>
该页的代码及注释如下:<o:p></o:p>
/**<o:p></o:p>
* <p>Title: DBUpdate</p><o:p></o:p>
* <p>Description:To update the data to 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>
using joyistar.eip.util;<o:p></o:p>
using joyistar.eip.vo;<o:p></o:p>
<o:p> </o:p>
public partial class MasterDetail_Update : System.Web.UI.Page<o:p></o:p>
{<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>
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>
XmlPost xmlPost = new XmlPost(); //构造一个XmlPost<o:p></o:p>
String acttype = null;//动作类型,通常有old,insert,delete等值,表示前段操作的类型是增,删,还是改,以方便后面构造sql语句.<o:p></o:p>
XmlAction action = null;//定义了一个动作对象action<o:p></o:p>
String sql = null;<o:p></o:p>
String where = null;<o:p></o:p>
OleDbConnection conn = null;<o:p></o:p>
String old_item_id = null;<o:p></o:p>
String new_item_id = null;<o:p></o:p>
try<o:p></o:p>
{<o:p></o:p>
xmlPost.Open(xml);//格式化xml<o:p></o:p>
conn = new OleDbConnection(connString);<o:p></o:p>
conn.Open();<o:p></o:p>
OleDbCommand oledbCommand = new OleDbCommand();<o:p></o:p>
oledbCommand.Connection = conn;<o:p></o:p>
for (int i = 0; i < xmlPost.Actions.Count; i++)//这个循环用于遍历所有的动作.<o:p></o:p>
{<o:p></o:p>
<o:p></o:p>
action = xmlPost.GetAction(i); //取得某一个操作的action对象,其中QueryName属性用来表示当前的操作来自于那一个DataSet,ActionType属性用来表示操作的类型。<o:p></o:p>
acttype = action.ActionType;<o:p></o:p>
//judges which table to be update<o:p></o:p>
if (action.QueryName.Equals("DataSet1")) //判断这个动作是否来自于DataSet1<o:p></o:p>
{<o:p></o:p>
if (acttype.Equals("old"))//动作类型为old表示操作有更新和删除两种可能,下一步再具体判断. <o:p></o:p>
{<o:p></o:p>
where = " where ";<o:p></o:p>
where = where + "SALE_ID=" + action.getField("SALE_ID").Value ;<o:p></o:p>
old_item_id = action.getField("SALE_ID").Value;<o:p></o:p>
}<o:p></o:p>
if (acttype.Equals("update"))//判断动作是否为更新<o:p></o:p>
<o:p> </o:p>
{<o:p></o:p>
String set = " set ";<o:p></o:p>
<o:p></o:p>
//更新的 sql语句<o:p></o:p>
for (int j = 0; j < action.FieldCount; j++)<o:p></o:p>
{<o:p></o:p>
if (action.getField(j).Name.Equals("SALE_ID"))<o:p></o:p>
{<o:p></o:p>
set = set + action.getField(j).Name + "=" + action.getField(j).Value;<o:p></o:p>
new_item_id = action.getField(j).Value.ToString();//取得当前行修改后的的主键值<o:p></o:p>
}<o:p></o:p>
else if(action.getField(j).Name.Equals("SALE_DATE"))//对输入的时间值进行格式化<o:p></o:p>
{<o:p></o:p>
DateTime theDate = xmlPost.timeToDateTime(action.getField(j).Value);<o:p></o:p>
set = set + action.getField(j).Name + "=#" + theDate.ToString("yyyy-M-d HH:mm:ss") + "#";<o:p></o:p>
}<o:p></o:p>
else <o:p></o:p>
{<o:p></o:p>
set = set + action.getField(j).Name + "='" + action.getField(j).Value + "'";<o:p></o:p>
}<o:p></o:p>
if (j < action.FieldCount - 1)<o:p></o:p>
{<o:p></o:p>
set = set + ",";<o:p></o:p>
}<o:p></o:p>
}<o:p></o:p>
sql = "update sale" + set + where;<o:p></o:p>
oledbCommand.CommandText = sql;<o:p></o:p>
oledbCommand.ExecuteNonQuery();<o:p></o:p>
<o:p> </o:p>
//主表的主键值变化时,从表对应的主键也需要修改.<o:p></o:p>
if (new_item_id!=old_item_id && new_item_id != null)<o:p></o:p>
{<o:p></o:p>
sql = "update item set ITEM_ID=" + new_item_id + " where ITEM_ID=" + old_item_id ;<o:p></o:p>
oledbCommand.CommandText = sql;<o:p></o:p>
oledbCommand.ExecuteNonQuery();<o:p></o:p>
}<o:p></o:p>
<o:p> </o:p>
}<o:p></o:p>
//删除的sql语句<o:p></o:p>
if (acttype.Equals("delete"))<o:p></o:p>
{<o:p></o:p>
where = " where ";<o:p></o:p>
where = where + action.getField("SALE_ID").Name + "=" + action.getField("SALE_ID").Value + "";<o:p></o:p>
sql = "delete from sale" + where;<o:p></o:p>
oledbCommand.CommandText = sql;<o:p></o:p>
oledbCommand.ExecuteNonQuery();<o:p></o:p>
} //插入的sql语句<o:p></o:p>
if (acttype.Equals("insert"))<o:p></o:p>
{<o:p></o:p>
String field = "";<o:p></o:p>
String value = "";<o:p></o:p>
for (int j = 0; j < action.FieldCount; j++)<o:p></o:p>
{<o:p></o:p>
field = field + action.getField(j).Name;<o:p></o:p>
if(action.getField(j).Name.Equals("SALE_ID")) <o:p></o:p>
{<o:p></o:p>
value = value+action.getField(j).Value;<o:p></o:p>
}<o:p></o:p>
else if(action.getField(j).Name.Equals("SALE_DATE")) <o:p></o:p>
{<o:p></o:p>
DateTime theDate = xmlPost.timeToDateTime(action.getField(j).Value);<o:p></o:p>
value = value +"#" + theDate.ToString("yyyy-M-d HH:mm:ss") + "#";<o:p></o:p>
}<o:p></o:p>
else {<o:p></o:p>
value=value+"'"+action.getField(j).Value+"'";<o:p></o:p>
}<o:p></o:p>
if (j < action.FieldCount - 1)<o:p></o:p>
{<o:p></o:p>
field = field + ",";<o:p></o:p>
value = value + ",";<o:p></o:p>
}<o:p></o:p>
}<o:p></o:p>
sql = "insert into sale (" + field + ") values (" + value + ")";<o:p></o:p>
oledbCommand.CommandText = sql;<o:p></o:p>
oledbCommand.ExecuteNonQuery();<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>
else if (action.QueryName.Equals("DataSet2"))//表示操作发生在DataSet2相关的那个Grid即从表的Grid<o:p></o:p>
<o:p></o:p>
{<o:p></o:p>
if (acttype.Equals("old"))<o:p></o:p>
{<o:p></o:p>
//where <st1:city w:st="on"><st1:place w:st="on">acton</st1:place></st1:city>, then update or delete action after it;<o:p></o:p>
where = " where ";<o:p></o:p>
where = where + "ITEM_ID=" + action.getField("ITEM_ID").Value + " and ITEM_PRODUCT_ID='" + action.getField("ITEM_PRODUCT_ID").Value + "'";<o:p></o:p>
}<o:p></o:p>
if (acttype.Equals("update"))<o:p></o:p>
{<o:p></o:p>
String set = " set ";<o:p></o:p>
//Here is update sql<o:p></o:p>
for (int j = 0; j < action.FieldCount; j++)<o:p></o:p>
{<o:p></o:p>
if (!action.getField(j).Name.Equals("ITEM_PRODUCT_ID"))<o:p></o:p>