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

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

posted @ 2009-12-01 09:28  潘聪辉  阅读(688)  评论(1编辑  收藏  举报