2024年5月28日 星期二

目的:V20304F – [批次工時匯入]鈕 – Transaction

目的:V20304F – [批次工時匯入]鈕 – Transaction

處理說明: 1> SQLStringList_A.Add(Tmp_Sql);
                  2> excuteSQLTran(SQLStringList_A);
                       --> 執行 SQLStringList_A 內的 SQL
                             若不成功,則自動 Rollback
                  3>若呼叫executeSqlTran()API函式名稱太長,
                       則會出現錯誤訊息    


1>*.cs

// Transaction SQL List - 存放  Transaction 的 SQL 
   List<string> SQLStringList_A = new List<string>();           

  Tmp_Sql = " DELETE   AMM_AR  "
                  + "  WHERE  FMNO=" + myfunc.AA(Tmp_FMNO);
  SQLStringList_A.Add(Tmp_Sql);

Tmp_Sql = "  UPDATE   AMM_AR  "
                +"   SET   RQHR=" + myfunc.AA(Tmp_PR04AR) 
                + "  WHERE FMNO = " + myfunc.AA(Tmp_FMNO) 
                + "  AND    AMINO=" + myfunc.AA("0400");
SQLStringList_A.Add(Tmp_Sql);

excuteSQLTran(SQLStringList_A);




2>BaseAPIController.cs
public int excuteSQLTran(List<string> SQLStringList, bool sysException = true)
        {
            setActionName();
            int rows = 0;
            OracleConnection conn = new OracleConnection(DBService.ConnectionString(DBLINK));
            conn.Open();
            conn.ClientInfo = User.Identity.Name;
            conn.ModuleName = BaseSYS + "_" + BaseMODID;
            conn.ActionName = ActionName;  //ActionName=API函式名稱 ,不可太長,否則會Error
            OracleTransaction trn = conn.BeginTransaction();
            OracleCommand cmd = new OracleCommand();
            cmd.Connection = conn;
            cmd.Transaction = trn;
            try
            {
                excMsg = "";
                for (int n = 0; n < SQLStringList.Count; n++)
                {
                    string strsql = SQLStringList[n].ToString();
                    cmd.CommandText = strsql;                    
                    //rows += cmd.ExecuteNonQuery();
                    cmd.ExecuteNonQuery();
                    rows = 1;
                }
                trn.Commit();
            }
            catch (Exception ex)
            {
                trn.Rollback();
                rows = -1;
                //Console.WriteLine("error : " + ex.Message);
                excMsg = ex.Message;
                if (sysException)
                {
                    throw ex; //如果沒有另外寫例外訊息的話,以此為主
                }
            }
            finally
            {
                cmd.Cancel();
                conn.Close();
            }
            return rows;
        }

PS: API函式名稱不可太長,否則會出現錯誤訊息



沒有留言:

張貼留言