zoukankan      html  css  js  c++  java
  • 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用來傳遞從表

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

  • 相关阅读:
    R语言:用简单的文本处理方法优化我们的读书体验
    R语言-用R眼看琅琊榜小说的正确姿势
    R语言-Kindle特价书爬榜示例 & 输出HTML小技巧
    Hadoop里的数据挖掘应用-Mahout——学习笔记<三>
    Hadoop-HBASE案例分析-Hadoop学习笔记<二>
    Hadoop概括——学习笔记<一>
    R语言——七月
    R语言:ggplot2精细化绘图——以实用商业化图表绘图为例
    R语言学习笔记之: 论如何正确把EXCEL文件喂给R处理
    R语言学习笔记-机器学习1-3章
  • 原文地址:https://www.cnblogs.com/conghuip/p/1614255.html
Copyright © 2011-2022 走看看