using System; using System.Data.OracleClient; using System.Runtime.CompilerServices; using NLog; namespace CCSTrace.CCS.Function { public class InitialEventData { private static readonly Logger Logger = LogManager.GetCurrentClassLogger(); private string _mAcceptNum = ""; private int _mCaseId = 0; private int _mYear = 0; private bool _mChangeYear = false; private string _mNowYear = string.Empty; private readonly string _mAcceptTime = ""; private readonly OracleConnection _connectionTpc; //New CaseID and New AcceptNum must be seen by others,so it need not controled by transaction [MethodImpl(MethodImplOptions.Synchronized)] public InitialEventData(OracleConnection conn) { _connectionTpc = conn; var sqlStmt = "SELECT ACCEPTNUM,CASEID,YEAR,TO_CHAR(SYSDATE,'YYYY/MM/DD') as ACCEPTTIME FROM EOS.EVENTNUM"; OracleCommand command = new OracleCommand(sqlStmt, _connectionTpc); OracleDataReader reader = command.ExecuteReader(); try { if (reader.Read()) { _mAcceptNum = reader["ACCEPTNUM"].ToString(); _mCaseId = Convert.ToInt32(reader["CASEID"].ToString()); _mYear = Convert.ToInt32(reader["YEAR"].ToString()); _mAcceptTime = reader["ACCEPTTIME"].ToString(); } else { Logger.Error("起始號碼資料遺失!"); return; } } catch (Exception e) { Logger.Error(e, "Problems occur when Initializing EventData: " + e.Message); Console.WriteLine(e.StackTrace); return; } finally { reader.Close(); command.Dispose(); } CheckAcceptNum(); while (!UpdateDataBase(_mChangeYear)) { RegetNumber(); CheckAcceptNum(); } } public int GetNewCaseId() { return _mCaseId; } public string GetNewAcceptNum() { return _mAcceptNum; } private bool UpdateDataBase(bool mChangeYear) { string sqlStmt; bool mResult = false; if (mChangeYear) sqlStmt = "UPDATE EOS.EVENTNUM SET ACCEPTNUM = '" + (Convert.ToInt32(_mAcceptNum) + 1).ToString() + "',CASEID = " + (_mCaseId + 1) + ",YEAR = " + _mNowYear + " WHERE CASEID = " + _mCaseId; else sqlStmt = "UPDATE EOS.EVENTNUM SET ACCEPTNUM = '" + (Convert.ToInt32(_mAcceptNum) + 1).ToString() + "',CASEID = " + (_mCaseId + 1) + " WHERE CASEID = " + _mCaseId + " AND ACCEPTNUM = '" + _mAcceptNum + "'"; OracleCommand command = new OracleCommand(sqlStmt, _connectionTpc); try { if (command.ExecuteNonQuery() > 0) mResult = true; } catch (Exception e) { Logger.Error(e, "Problems occur during EventNumCreating: " + e.Message); throw; } finally { command.Dispose(); } return mResult; } private void CheckAcceptNum() { int nowYear = Convert.ToInt32(_mAcceptTime.Substring(0, 4)) - 1911; int nowMonth = Convert.ToInt32(_mAcceptTime.Substring(5, 2)); string tmp = _mAcceptNum; if (Convert.ToInt32(tmp.Substring(0, 3)) == nowYear) { if (Convert.ToInt32(tmp.Substring(3, 2)) != nowMonth) { // 新月份 if (nowMonth < 10) _mAcceptNum = nowYear.ToString() + "0" + nowMonth.ToString() + "0001"; else _mAcceptNum = nowYear.ToString() + nowMonth.ToString() + "0001"; } } else { _mAcceptNum = nowYear.ToString() + "010001"; // 新年度 _mNowYear = nowYear.ToString(); _mChangeYear = true; } if (!_mChangeYear) { } } private void RegetNumber() { var sqlStmt = "SELECT ACCEPTNUM,CASEID,YEAR FROM EOS.EVENTNUM"; OracleCommand command = new OracleCommand(sqlStmt, _connectionTpc); OracleDataReader reader = command.ExecuteReader(); try { if (reader.Read()) { _mAcceptNum = reader["ACCEPTNUM"].ToString(); _mCaseId = Convert.ToInt32(reader["CASEID"].ToString()); _mYear = Convert.ToInt32(reader["YEAR"].ToString()); } } catch (Exception e) { Console.WriteLine(e.Message); Console.WriteLine(e.StackTrace); } finally { reader.Close(); command.Dispose(); } } } }