逻辑层: using System; using System.Data; using TransactionStudy.BaseTier; using TransactionStudy.Entity; using System.EnterpriseServices; namespace TransactionStudy.Logic { /// <summary> /// Summary description for TransactionLogic. /// </summary>
//Begin a new Transaction [Transaction(TransactionOption.RequiresNew)] public class TransactionLogic:LogicBase {
public TransactionLogic() { // // TODO: Add constructor logic here // } private string _DocNo,_DocDescription; private DataTable _ItemList; public DataTable ItemList { set { this._ItemList=value; } } public string DocNo { set { _DocNo=value; } get { return this._DocNo; } } public string DocDescription { set { _DocDescription=value; } } public void Submit() { try { //Insert Head TransHead_Interface objHead=new TransHead_Interface(); objHead.DocNo=this._DocNo; objHead.Description=this._DocDescription; objHead.Add(); //Insert Detial TransDetail_Interface objDetail=new TransDetail_Interface(); if(this._ItemList.Rows.Count>0) { for(int i=0;i<this._ItemList.Rows.Count;i++) { objDetail.ItemNo=_ItemList.Rows[i]["ItemNo"].ToString().Trim(); objDetail.ItemDescription=_ItemList.Rows[i]["ItemDescription"].ToString().Trim(); objDetail.Quantity=int.Parse(_ItemList.Rows[i]["Quantity"].ToString().Trim()); objDetail.DocumentNo=this._DocNo; objDetail.Add(); } ContextUtil.SetComplete();//Transaction Complete } else { throw new Exception("The Detial is Null,Please add Detial!"); } } catch(Exception er) { ContextUtil.SetAbort();//Transaction filed,roll back throw er; } } } }
页面: using System; using System.Collections; using System.ComponentModel; using System.Data; using System.Drawing; using System.Web; using System.Web.SessionState; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.HtmlControls;using TransactionStudy.Logic;namespace TransactionDemo_Web { /// <summary> /// Summary description for TransactionDemo. /// </summary> public class TransactionDemo : PageBase { protected System.Web.UI.WebControls.DataGrid DataGridItemList; protected System.Web.UI.WebControls.Label LabelDocumentNo; protected System.Web.UI.WebControls.Label LabelExample; protected System.Web.UI.WebControls.Label LabelDescription; protected System.Web.UI.WebControls.TextBox TextboxDescription; protected System.Web.UI.WebControls.Label LabelItemNo; protected System.Web.UI.WebControls.TextBox TextboxItemNo; protected System.Web.UI.WebControls.Label LabelItemDescription; protected System.Web.UI.WebControls.TextBox TextboxItemDescription; protected System.Web.UI.WebControls.Label LabelQuantity; protected System.Web.UI.WebControls.TextBox TextboxQuantity; protected System.Web.UI.WebControls.Button ButtonAddItem; protected System.Web.UI.WebControls.Button ButtonSubmit; protected System.Web.UI.WebControls.Label LabelItemExample; protected System.Web.UI.WebControls.TextBox TextBoxDocumentNo; protected System.Web.UI.WebControls.Button ButtonReset; private DataTable dtItemList; private void Page_Load(object sender, System.EventArgs e) { // Put user code to initialize the page here //when first load the page,excute following code if(!Page.IsPostBack) { dtItemList = new DataTable(); dtItemList.Columns.Add("ItemNo"); dtItemList.Columns.Add("ItemDescription"); dtItemList.Columns.Add("Quantity"); DataGridItemList.DataSource=dtItemList; DataGridItemList.DataBind(); ViewState.Add("ItemList",dtItemList); } //PostBack excute following code else { if(ViewState["ItemList"]!=null) { dtItemList=(DataTable)ViewState["ItemList"]; } } } private void ClearAll() { this.TextBoxDocumentNo.Text=""; this.TextboxDescription.Text=""; this.TextboxItemNo.Text=""; this.TextboxItemDescription.Text=""; this.TextboxQuantity.Text=""; dtItemList.Rows.Clear(); DataGridItemList.DataSource=dtItemList; DataGridItemList.DataBind(); ViewState["ItemList"]=dtItemList; } #region Web Form Designer generated code override protected void OnInit(EventArgs e) { // // CODEGEN: This call is required by the ASP.NET Web Form Designer. // InitializeComponent(); base.OnInit(e); }
/// <summary> /// Required method for Designer support - do not modify /// the contents of this method with the code editor. /// </summary> private void InitializeComponent() { this.ButtonAddItem.Click += new System.EventHandler(this.ButtonAddItem_Click); this.ButtonReset.Click += new System.EventHandler(this.ButtonReset_Click); this.ButtonSubmit.Click += new System.EventHandler(this.ButtonSubmit_Click); this.Load += new System.EventHandler(this.Page_Load); } #endregion private void ButtonAddItem_Click(object sender, System.EventArgs e) { try { DataRow dr=dtItemList.NewRow(); dr["ItemNo"]=this.TextboxItemNo.Text.Trim(); dr["ItemDescription"]=this.TextboxItemDescription.Text.Trim(); dr["Quantity"]=this.TextboxQuantity.Text.Trim(); dtItemList.Rows.Add(dr); DataGridItemList.DataSource=dtItemList; DataGridItemList.DataBind(); ViewState["ItemList"]=dtItemList; } catch(Exception er) { throw er; } } private void ButtonSubmit_Click(object sender, System.EventArgs e) { try { TransactionLogic objTrans=new TransactionLogic(); objTrans.DocNo=this.TextBoxDocumentNo.Text.Trim(); objTrans.DocDescription=this.TextboxDescription.Text.Trim(); objTrans.ItemList=this.dtItemList; objTrans.Submit(); this.ClearAll(); this.TextboxDescription.Text = objTrans.DocNo;//这句话执行后没有值 this.ShowMessage("Trans Success!"); } catch(Exception er) { this.ShowMessage(er.Message); } } private void ButtonReset_Click(object sender, System.EventArgs e) { this.ClearAll(); } } }
using System;
using System.Data;
using TransactionStudy.BaseTier;
using TransactionStudy.Entity;
using System.EnterpriseServices;
namespace TransactionStudy.Logic
{
/// <summary>
/// Summary description for TransactionLogic.
/// </summary>
//Begin a new Transaction
[Transaction(TransactionOption.RequiresNew)] public class TransactionLogic:LogicBase
{
public TransactionLogic()
{
//
// TODO: Add constructor logic here
//
} private string _DocNo,_DocDescription;
private DataTable _ItemList; public DataTable ItemList
{
set
{
this._ItemList=value;
}
} public string DocNo
{
set
{
_DocNo=value;
}
get
{
return this._DocNo;
}
} public string DocDescription
{
set
{
_DocDescription=value;
}
} public void Submit()
{
try
{
//Insert Head
TransHead_Interface objHead=new TransHead_Interface();
objHead.DocNo=this._DocNo;
objHead.Description=this._DocDescription;
objHead.Add();
//Insert Detial
TransDetail_Interface objDetail=new TransDetail_Interface();
if(this._ItemList.Rows.Count>0)
{
for(int i=0;i<this._ItemList.Rows.Count;i++)
{
objDetail.ItemNo=_ItemList.Rows[i]["ItemNo"].ToString().Trim();
objDetail.ItemDescription=_ItemList.Rows[i]["ItemDescription"].ToString().Trim();
objDetail.Quantity=int.Parse(_ItemList.Rows[i]["Quantity"].ToString().Trim());
objDetail.DocumentNo=this._DocNo;
objDetail.Add();
}
ContextUtil.SetComplete();//Transaction Complete
}
else
{
throw new Exception("The Detial is Null,Please add Detial!");
}
}
catch(Exception er)
{
ContextUtil.SetAbort();//Transaction filed,roll back
throw er;
}
}
}
}
using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Web;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;using TransactionStudy.Logic;namespace TransactionDemo_Web
{
/// <summary>
/// Summary description for TransactionDemo.
/// </summary>
public class TransactionDemo : PageBase
{
protected System.Web.UI.WebControls.DataGrid DataGridItemList;
protected System.Web.UI.WebControls.Label LabelDocumentNo;
protected System.Web.UI.WebControls.Label LabelExample;
protected System.Web.UI.WebControls.Label LabelDescription;
protected System.Web.UI.WebControls.TextBox TextboxDescription;
protected System.Web.UI.WebControls.Label LabelItemNo;
protected System.Web.UI.WebControls.TextBox TextboxItemNo;
protected System.Web.UI.WebControls.Label LabelItemDescription;
protected System.Web.UI.WebControls.TextBox TextboxItemDescription;
protected System.Web.UI.WebControls.Label LabelQuantity;
protected System.Web.UI.WebControls.TextBox TextboxQuantity;
protected System.Web.UI.WebControls.Button ButtonAddItem;
protected System.Web.UI.WebControls.Button ButtonSubmit;
protected System.Web.UI.WebControls.Label LabelItemExample;
protected System.Web.UI.WebControls.TextBox TextBoxDocumentNo;
protected System.Web.UI.WebControls.Button ButtonReset; private DataTable dtItemList; private void Page_Load(object sender, System.EventArgs e)
{
// Put user code to initialize the page here //when first load the page,excute following code
if(!Page.IsPostBack)
{
dtItemList = new DataTable();
dtItemList.Columns.Add("ItemNo");
dtItemList.Columns.Add("ItemDescription");
dtItemList.Columns.Add("Quantity"); DataGridItemList.DataSource=dtItemList;
DataGridItemList.DataBind();
ViewState.Add("ItemList",dtItemList);
}
//PostBack excute following code
else
{
if(ViewState["ItemList"]!=null)
{
dtItemList=(DataTable)ViewState["ItemList"];
}
}
}
private void ClearAll()
{
this.TextBoxDocumentNo.Text="";
this.TextboxDescription.Text="";
this.TextboxItemNo.Text="";
this.TextboxItemDescription.Text="";
this.TextboxQuantity.Text=""; dtItemList.Rows.Clear();
DataGridItemList.DataSource=dtItemList;
DataGridItemList.DataBind();
ViewState["ItemList"]=dtItemList;
} #region Web Form Designer generated code
override protected void OnInit(EventArgs e)
{
//
// CODEGEN: This call is required by the ASP.NET Web Form Designer.
//
InitializeComponent();
base.OnInit(e);
}
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.ButtonAddItem.Click += new System.EventHandler(this.ButtonAddItem_Click);
this.ButtonReset.Click += new System.EventHandler(this.ButtonReset_Click);
this.ButtonSubmit.Click += new System.EventHandler(this.ButtonSubmit_Click);
this.Load += new System.EventHandler(this.Page_Load); }
#endregion private void ButtonAddItem_Click(object sender, System.EventArgs e)
{
try
{
DataRow dr=dtItemList.NewRow();
dr["ItemNo"]=this.TextboxItemNo.Text.Trim();
dr["ItemDescription"]=this.TextboxItemDescription.Text.Trim();
dr["Quantity"]=this.TextboxQuantity.Text.Trim();
dtItemList.Rows.Add(dr);
DataGridItemList.DataSource=dtItemList;
DataGridItemList.DataBind();
ViewState["ItemList"]=dtItemList;
}
catch(Exception er)
{
throw er;
}
} private void ButtonSubmit_Click(object sender, System.EventArgs e)
{
try
{
TransactionLogic objTrans=new TransactionLogic();
objTrans.DocNo=this.TextBoxDocumentNo.Text.Trim();
objTrans.DocDescription=this.TextboxDescription.Text.Trim();
objTrans.ItemList=this.dtItemList;
objTrans.Submit();
this.ClearAll();
this.TextboxDescription.Text = objTrans.DocNo;//这句话执行后没有值
this.ShowMessage("Trans Success!");
}
catch(Exception er)
{
this.ShowMessage(er.Message);
}
} private void ButtonReset_Click(object sender, System.EventArgs e)
{
this.ClearAll();
}
}
}
楼主,刚才你回答了我一个问题,我找不到你,只好在这里提问了
http://community.csdn.net/Expert/topic/3248/3248889.xml?temp=.2782404我按照你说的,把
[Transaction(TransactionOption.Required)]
和
ContextUtil.SetComplete();
Console.Read();都去掉了,
果然好使,不过这样的话,我的两个事务就不同步了,那我应该怎么办,我想可能是我的组件注册不正确,除了没把它添加到全局程序集高速缓存,其他的都做了,希望能得到你的指教谢谢
JIT每次调用后就释放,两次调用之间是不能保持状态的。所以_A不能保持。
要保持状态,可以联合JIT和对象池。