asp.net 中的 主从 新增,修改,删除。

在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用來傳遞從表

要注意的地方是從表必須有主鍵