在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用來傳遞從表
要注意的地方是從表必須有主鍵