在asp.net中關於主從新增問題,網絡上很多朋友問起,很多解決的辦法不是很好,關鍵是同步問題,下面是我的做法,
歡迎大家提出更好的辦法。
在主從新增中,主表一筆,從表多筆,在新增,,修改,刪除從表時必須和主表一起保存,並且主表和從表都會有新增,修改,刪除。所以必須用到以下技術:
1.首先必須用到事務來確保一致性。
2.需要用到ado.net的批量更新。
3.從表數據必須在內存中處理,然後在批量更新到數據庫中
下面是部分代碼
private DataSet ds { get { object o = ViewState["ds"]; return o == null ? null : (DataSet)o; } set { ViewState["ds"] = value; } }
定義一個dataset屬性,用來在內存中操作從表數據,也可以保存在Session中
public bool SaveData(Model.Budget_Mdl mdl, DataSet ds, string tableName, string EditMethod, out string ret) { //保存主表 SqlConnection conn = new SqlConnection(SQLHelper.strCONN); lock (this) { conn.Open(); SqlCommand cmd = new SqlCommand(); SqlTransaction tran; tran = conn.BeginTransaction(); cmd.Connection = conn; cmd.Transaction = tran; try { cmd.CommandType = CommandType.StoredProcedure; cmd.CommandText = "SPC_Bud"; cmd.Parameters.Add("@EditMethod", SqlDbType.NChar).Value = EditMethod; cmd.Parameters.Add("@CHANFORM_ID", SqlDbType.NChar).Value = mdl.CHANFORM_ID; cmd.Parameters.Add("@Bill_Character", SqlDbType.NChar).Value = mdl.Bill_Character; cmd.Parameters.Add("@BUD_YEAR", SqlDbType.Int).Value = mdl.BUD_YEAR; cmd.Parameters.Add("@APPLICANT", SqlDbType.NVarChar).Value = mdl.APPLICANT; cmd.Parameters.Add("@APPLYDATE", SqlDbType.NChar).Value = mdl.APPLYDATE.ToString("yyyy-MM-dd"); cmd.Parameters.Add("@FORMTYPE", SqlDbType.NChar).Value = mdl.FORMTYPE;
cmd.Parameters.Add("@REMARKS", SqlDbType.NVarChar).Value = mdl.REMARKS; cmd.Parameters.Add("@C_USER", SqlDbType.NVarChar).Value = mdl.C_USER; cmd.Parameters.Add("@M_USER", SqlDbType.NVarChar).Value = mdl.M_USER;
cmd.Parameters.Add("@ret", SqlDbType.NVarChar); cmd.Parameters["@ret"].Size = 10; cmd.Parameters["@ret"].Direction = ParameterDirection.Output; cmd.ExecuteNonQuery(); ret = Convert.ToString(cmd.Parameters["@ret"].Value); foreach (DataRow row in ds.Tables["budDtl"].Rows) { if (row.RowState == DataRowState.Added) row["CHANFORM_ID"] = ret; } //保存細表 if (EditMethod == "I" || EditMethod == "U") { string strSql = "Select * from TB_BUDGET_DETAIL"; Helper.BatchUpdate(ds, conn, tableName, strSql, tran); } tran.Commit(); return true;
} catch (Exception err) { tran.Rollback(); throw err; } finally { conn.Close(); } } }
Model用來傳遞主表,DataSet用來傳遞從表
要注意的地方是從表必須有主鍵
|
请发表评论