/// <summary>DoBusinessLogicメソッドの非同期バージョン</summary> /// <param name="parameterValue">引数クラス</param> /// <param name="iso">分離レベル(DBMS毎の分離レベルの違いを理解して設定すること)</param> /// <returns>戻り値クラス</returns> /// <remarks>画面コード クラスから利用する。</remarks> public Task <BaseReturnValue> DoBusinessLogicAsync( BaseParameterValue parameterValue, DbEnum.IsolationLevelEnum iso) { return(Task <BaseReturnValue> .Factory.StartNew(() => { return this.DoBusinessLogic(parameterValue, iso); })); }
/// <summary> /// Inserts asynchronous task information to the database /// </summary> /// <returns></returns> public AsyncProcessingServiceParameterValue InsertData() { // Create array data to serilize. byte[] arrayData = { 1, 2, 3, 4, 5 }; // Sets parameters of AsyncProcessingServiceParameterValue to insert asynchronous task information. AsyncProcessingServiceParameterValue asyncParameterValue = new AsyncProcessingServiceParameterValue("AsyncProcessingService", "InsertTask", "InsertTask", "SQL", new MyUserInfo("AsyncProcessingService", "AsyncProcessingService")); asyncParameterValue.UserId = "A"; asyncParameterValue.ProcessName = "AAA"; asyncParameterValue.Data = AsyncSvc_sample.LayerB.SerializeToBase64String(arrayData); asyncParameterValue.ExecutionStartDateTime = DateTime.Now; asyncParameterValue.RegistrationDateTime = DateTime.Now; asyncParameterValue.NumberOfRetries = 0; asyncParameterValue.ProgressRate = 0; asyncParameterValue.CompletionDateTime = DateTime.Now; asyncParameterValue.StatusId = (int)(AsyncProcessingServiceParameterValue.AsyncStatus.Register); asyncParameterValue.CommandId = 0; asyncParameterValue.ReservedArea = "xxxxxx"; DbEnum.IsolationLevelEnum iso = DbEnum.IsolationLevelEnum.DefaultTransaction; AsyncProcessingServiceReturnValue asyncReturnValue; // Execute do business logic method. LayerB layerB = new LayerB(); asyncReturnValue = (AsyncProcessingServiceReturnValue)layerB.DoBusinessLogic((AsyncProcessingServiceParameterValue)asyncParameterValue, iso); return(asyncParameterValue); }
/// <summary>トランザクション開始</summary> /// <param name="iso">分離レベル(DB2に同じ) /// </param> public override void BeginTransaction(DbEnum.IsolationLevelEnum iso) { // 分離レベル設定のチェック if (iso == DbEnum.IsolationLevelEnum.NoTransaction) { // トランザクションを開始しない(nullのまま)。 } else if (iso == DbEnum.IsolationLevelEnum.DefaultTransaction) { // 規定の分離レベルでトランザクションを開始する。 this._tx = this._cnn.BeginTransaction(); } else if (iso == DbEnum.IsolationLevelEnum.ReadUncommitted) { // 非コミット読み取りの分離レベルでトランザクションを開始する。 this._tx = this._cnn.BeginTransaction(IsolationLevel.ReadUncommitted); } else if (iso == DbEnum.IsolationLevelEnum.ReadCommitted) { // コミット済み読み取りの分離レベルでトランザクションを開始する。 this._tx = this._cnn.BeginTransaction(IsolationLevel.ReadCommitted); } else if (iso == DbEnum.IsolationLevelEnum.RepeatableRead) { // 反復可能読み取りの分離レベルでトランザクションを開始する。 this._tx = this._cnn.BeginTransaction(IsolationLevel.RepeatableRead); } else if (iso == DbEnum.IsolationLevelEnum.Serializable) { // 直列化可能の分離レベルでトランザクションを開始する。 this._tx = this._cnn.BeginTransaction(IsolationLevel.Serializable); } else if (iso == DbEnum.IsolationLevelEnum.Snapshot) { // 無効な分離レベル(スナップ ショット分離レベル)。 throw new ArgumentException(String.Format( PublicExceptionMessage.DB_ISO_LEVEL_PARAM_ERROR_SS, "HiRDB")); } else if (iso == DbEnum.IsolationLevelEnum.User) { // 無効な分離レベル(ユーザ指定)。 throw new ArgumentException( PublicExceptionMessage.DB_ISO_LEVEL_PARAM_ERROR_USR); } else if (iso == DbEnum.IsolationLevelEnum.NotConnect) { // 2009/03/29 -- 追加したNotConnectの対応(このコードブロック)。 // 無効な分離レベル(NotConnect指定)。 throw new ArgumentException( PublicExceptionMessage.DB_ISO_LEVEL_PARAM_ERROR_NC); } else { // 通らない予定 } // 分離レベル(iso)をメンバ変数に保存 _iso = iso; }
/// <summary> /// Inserts data to database /// </summary> /// <returns></returns> public AsyncProcessingServiceParameterValue InsertData() { AsyncProcessingServiceParameterValue asyncParameterValue; byte[] arr = { 1, 2, 3, 4, 5 }; asyncParameterValue = new AsyncProcessingServiceParameterValue("AsyncProcessingService", "Start", "Start", "SQL", new MyUserInfo("AsyncProcessingService", "AsyncProcessingService")); asyncParameterValue.UserId = "A"; asyncParameterValue.ProcessName = "AAA"; asyncParameterValue.Data = CustomEncode.ToBase64String(arr); asyncParameterValue.ExecutionStartDateTime = DateTime.Now; asyncParameterValue.RegistrationDateTime = DateTime.Now; asyncParameterValue.NumberOfRetries = 0; asyncParameterValue.ProgressRate = 0; asyncParameterValue.CompletionDateTime = DateTime.Now; asyncParameterValue.StatusId = (int)(AsyncProcessingServiceParameterValue.AsyncStatus.Register); asyncParameterValue.CommandId = 0; asyncParameterValue.ReservedArea = "xxxxxx"; DbEnum.IsolationLevelEnum iso = DbEnum.IsolationLevelEnum.DefaultTransaction; AsyncProcessingServiceReturnValue asyncReturnValue; AsyncSvc_sample.LayerB layerB = new AsyncSvc_sample.LayerB(); asyncReturnValue = (AsyncProcessingServiceReturnValue)layerB.DoBusinessLogic((AsyncProcessingServiceParameterValue)asyncParameterValue, iso); return(asyncParameterValue); }
/// <summary> /// To Delete database records /// </summary> /// <param name="shardMap"></param> /// <param name="credentialsConnectionString"></param> public static void ExecuteDataDependentRoutingQueryForDelete(RangeShardMap <int> shardMap) { TestParameterValue testParameterValue = new TestParameterValue( "DataDependentRouting", "ExecuteDataDependentRouting", "Delete", "SqlDbWithDataDependent" + "%" + "individual" + "%" + "-", new MyUserInfo("DataDependentRouting", "DataDependentRouting")); // 情報の設定 testParameterValue.CustomerId = MultiShardConfiguration.customerId; // 分離レベルの設定 DbEnum.IsolationLevelEnum iso = DbEnum.IsolationLevelEnum.DefaultTransaction; // B層を生成 LayerB myBusiness = new LayerB(); // 業務処理を実行 TestReturnValue testReturnValue = (TestReturnValue)myBusiness.DoBusinessLogic( (BaseParameterValue)testParameterValue, iso); Console.WriteLine("Deleted order for customer ID: {0}", testParameterValue.CustomerId); }
/// <summary> /// ExecuteMultiShardQuery method to get the database records using MultiShardConnection, /// MultiShardCommand,multiShardDataReader class /// </summary> /// <param name="shardMap"></param> /// <param name="credentialsConnectionString"></param> public static void ExecuteMultiShardQuery(RangeShardMap <int> shardMap) { // Get the Shards from Shard Map manager MultiShardConfiguration.Shards = shardMap.GetShards(); TestParameterValue testParameterValue = new TestParameterValue( "MultiShard", "ExecMultiShard", "SelectAll_DR", "SqlDbWithMultiShard" + "%" + "individual" + "%" + "-", new MyUserInfo("MultiShard", "MultiShard")); // 分離レベルの設定 DbEnum.IsolationLevelEnum iso = DbEnum.IsolationLevelEnum.NoTransaction; // B層を生成 LayerB myBusiness = new LayerB(); // 業務処理を実行 TestReturnValue testReturnValue = (TestReturnValue)myBusiness.DoBusinessLogic( (BaseParameterValue)testParameterValue, iso); string strErrorMsg = ""; if (testReturnValue.ErrorFlag == true) { // 結果(業務続行可能なエラー) strErrorMsg = "ErrorMessageID:" + testReturnValue.ErrorMessageID + "\r\n"; strErrorMsg += "ErrorMessage:" + testReturnValue.ErrorMessage + "\r\n"; strErrorMsg += "ErrorInfo:" + testReturnValue.ErrorInfo + "\r\n"; Console.WriteLine("Inserted failed for Error message : {0}", strErrorMsg); } else { //Converts Return value object to dataTable data to display the data in screen DataTable dtTable = (DataTable)testReturnValue.Obj; int rows = 0; // Get the column names TableFormatter formatter = new TableFormatter(ShardManagementUtils.GetColumnNames(dtTable).ToArray()); foreach (DataRow dr in dtTable.Rows) { // Extract just database name from the $ShardLocation pseudocolumn to make the output formater cleaner. // Note that the $ShardLocation pseudocolumn is always the last column int shardLocationOrdinal = dr.ItemArray.Length - 1; dr.ItemArray[shardLocationOrdinal] = ShardManagementUtils.ExtractDatabaseName(dr.ItemArray[shardLocationOrdinal].ToString()); // Add values to output formatter formatter.AddRow(dr.ItemArray); rows++; } Console.WriteLine(formatter.ToString()); Console.WriteLine("({0} rows returned)", rows); } }
// POST api/SelectDSQL public HttpResponseMessage Post(WebApiParams param) { // 引数クラスを生成 // 下位(B・D層)は、テスト クラスを流用する TestParameterValue testParameterValue = new TestParameterValue( "CrudMu", "button1", "SelectAll_DSQL", param.ddlDap + "%" + param.ddlMode1 + "%" + param.ddlMode2 + "%" + param.ddlExRollback, new MyUserInfo("aaa", "192.168.1.1")); testParameterValue.OrderColumn = param.OrderColumn; testParameterValue.OrderSequence = param.OrderSequence; // 戻り値 TestReturnValue testReturnValue; // 分離レベルの設定 DbEnum.IsolationLevelEnum iso = DbEnum.IsolationLevelEnum.DefaultTransaction; // B層呼出し+都度コミット LayerB layerB = new LayerB(); testReturnValue = (TestReturnValue)layerB.DoBusinessLogic(testParameterValue, iso); // 結果表示するメッセージ string message = ""; if (testReturnValue.ErrorFlag == true) { // 結果(業務続行可能なエラー) message = "ErrorMessageID:" + testReturnValue.ErrorMessageID + ";"; message += "ErrorMessage:" + testReturnValue.ErrorMessage + ";"; message += "ErrorInfo:" + testReturnValue.ErrorInfo; Dictionary <string, string> dic = new Dictionary <string, string>(); dic.Add("Error", message); return(Request.CreateResponse(HttpStatusCode.OK, dic)); } else { // 結果(正常系) DataTable dt = (DataTable)testReturnValue.Obj; List <Dictionary <string, string> > list = new List <Dictionary <string, string> >(); foreach (DataRow row in dt.Rows) { Dictionary <string, string> dic = new Dictionary <string, string>(); dic.Add(dt.Columns[0].ColumnName, row[0].ToString()); dic.Add(dt.Columns[1].ColumnName, row[1].ToString()); dic.Add(dt.Columns[2].ColumnName, row[2].ToString()); list.Add(dic); } return(Request.CreateResponse(HttpStatusCode.OK, list)); } }
/// <summary> /// Shippers テーブルのレコード全件を DataReader として取得する /// </summary> /// <param name="ddlDap">データプロバイダ</param> /// <param name="ddlMode1">静的、動的のクエリ モード(共通Dao選択時)</param> /// <param name="ddlMode2">静的、動的のクエリ モード</param> /// <param name="ddlExRollback">コミット、ロールバック</param> /// <param name="form">入力フォームの情報</param> /// <returns>再描画(ViewResult)</returns> public ActionResult SelectAll_DR(string ddlDap, string ddlMode1, string ddlMode2, string ddlExRollback, FormCollection form) { // 引数クラスを生成 // 下位(B・D層)は、テスト クラスを流用する TestParameterValue testParameterValue = new TestParameterValue( "CrudMu", "button4", "SelectAll_DR", ddlDap + "%" + ddlMode1 + "%" + ddlMode2 + "%" + ddlExRollback, new MyUserInfo("aaa", "192.168.1.1")); // 戻り値 TestReturnValue testReturnValue; // 分離レベルの設定 DbEnum.IsolationLevelEnum iso = DbEnum.IsolationLevelEnum.DefaultTransaction; // B層呼出し+都度コミット LayerB layerB = new LayerB(); testReturnValue = (TestReturnValue)layerB.DoBusinessLogic(testParameterValue, iso); // 結果表示するメッセージ string message = ""; CrudModel model = new CrudModel(); // 値の復元のため、CopyInputValuesを呼び出す。 model.CopyInputValues(form); if (testReturnValue.ErrorFlag == true) { // 結果(業務続行可能なエラー) message = "ErrorMessageID:" + testReturnValue.ErrorMessageID + ";"; message += "ErrorMessage:" + testReturnValue.ErrorMessage + ";"; message += "ErrorInfo:" + testReturnValue.ErrorInfo; // メッセージを設定。 model.Message = message; } else { // 結果(正常系) model.shippers = new DataSets.DsNorthwind.ShippersDataTable(); DataTable dt = (DataTable)testReturnValue.Obj; foreach (DataRow row in dt.Rows) { DataSets.DsNorthwind.ShippersRow srow = model.shippers.NewShippersRow(); srow.ShipperID = int.Parse(row[0].ToString()); srow.CompanyName = row[1].ToString(); srow.Phone = row[2].ToString(); model.shippers.Rows.Add(srow); } } // Html.BeginFormでは、全体更新。 return(View("Index", model)); }
/// <summary> /// Shippers テーブルのレコード全件を DataReader として取得する /// </summary> /// <param name="ddlDap">データプロバイダ</param> /// <param name="ddlMode1">静的、動的のクエリ モード(共通Dao選択時)</param> /// <param name="ddlMode2">静的、動的のクエリ モード</param> /// <param name="ddlExRollback">コミット、ロールバック</param> /// <returns>Shippers テーブルのレコードを表示するPartialViewResult</returns> public ActionResult SelectAll_DR(string ddlDap, string ddlMode1, string ddlMode2, string ddlExRollback) { // 引数クラスを生成 // 下位(B・D層)は、テスト クラスを流用する TestParameterValue testParameterValue = new TestParameterValue( "CrudMu", "button4", "SelectAll_DR", ddlDap + "%" + ddlMode1 + "%" + ddlMode2 + "%" + ddlExRollback, new MyUserInfo("aaa", "192.168.1.1")); // 戻り値 TestReturnValue testReturnValue; // 分離レベルの設定 DbEnum.IsolationLevelEnum iso = DbEnum.IsolationLevelEnum.DefaultTransaction; // B層呼出し+都度コミット LayerB layerB = new LayerB(); testReturnValue = (TestReturnValue)layerB.DoBusinessLogic(testParameterValue, iso); // 結果表示するメッセージ string message = ""; if (testReturnValue.ErrorFlag == true) { // 結果(業務続行可能なエラー) message = "ErrorMessageID:" + testReturnValue.ErrorMessageID + ";"; message += "ErrorMessage:" + testReturnValue.ErrorMessage + ";"; message += "ErrorInfo:" + testReturnValue.ErrorInfo; // Ajax.BeginFormでは、UpdateTargetIdで指定した // ターゲット以外を更新する場合、JavaScriptでの対応が必要。 // #ここではjQueryを使用している。 string scriptText = "$('#lblMessage').text('" + message + "');"; return(JavaScript(scriptText)); } else { // 結果(正常系) CrudModel model = new CrudModel(); model.shippers = new DataSets.DsNorthwind.ShippersDataTable(); DataTable dt = (DataTable)testReturnValue.Obj; foreach (DataRow row in dt.Rows) { DataSets.DsNorthwind.ShippersRow srow = model.shippers.NewShippersRow(); srow.ShipperID = int.Parse(row[0].ToString()); srow.CompanyName = row[1].ToString(); srow.Phone = row[2].ToString(); model.shippers.Rows.Add(srow); } // Ajax.BeginFormでは、以下のように記述することで部分更新が可能。 return(PartialView("_ChartView", model)); } }
/// <summary> /// ShipperId をキーにして Shippers テーブルのレコードを取得する /// </summary> /// <param name="ddlDap">データプロバイダ</param> /// <param name="ddlMode1">静的、動的のクエリ モード(共通Dao選択時)</param> /// <param name="ddlMode2">静的、動的のクエリ モード</param> /// <param name="ddlExRollback">コミット、ロールバック</param> /// <param name="textBox1">ShipperId</param> /// <returns>Shippers テーブルのレコードを表示するJavaScriptResult</returns> public ActionResult Select(string ddlDap, string ddlMode1, string ddlMode2, string ddlExRollback, string textBox1) { // 引数クラスを生成 // 下位(B・D層)は、テスト クラスを流用する TestParameterValue testParameterValue = new TestParameterValue( "CrudMu", "button6", "Select", ddlDap + "%" + ddlMode1 + "%" + ddlMode2 + "%" + ddlExRollback, new MyUserInfo("aaa", "192.168.1.1")); // 動的SQLの要素を設定 testParameterValue.ShipperID = int.Parse(textBox1); // 戻り値 TestReturnValue testReturnValue; // 分離レベルの設定 DbEnum.IsolationLevelEnum iso = DbEnum.IsolationLevelEnum.DefaultTransaction; // B層呼出し+都度コミット LayerB layerB = new LayerB(); testReturnValue = (TestReturnValue)layerB.DoBusinessLogic(testParameterValue, iso); // 結果表示するメッセージ string message = ""; if (testReturnValue.ErrorFlag == true) { // 結果(業務続行可能なエラー) message = "ErrorMessageID:" + testReturnValue.ErrorMessageID + ";"; message += "ErrorMessage:" + testReturnValue.ErrorMessage + ";"; message += "ErrorInfo:" + testReturnValue.ErrorInfo; CrudModel model = new CrudModel() { Message = message }; // Ajax.BeginFormでは、以下のように記述することで部分更新が可能。 return(PartialView("_MessageView", model)); } else { // 結果(正常系) // Ajax.BeginFormでは、UpdateTargetIdで指定した // ターゲット以外を更新する場合、JavaScriptでの対応が必要。 // #ここではjQueryを使用している。 string scriptText = string.Format("$('#textBox1').val('{0}');$('#textBox2').val('{1}');$('#textBox3').val('{2}');", testReturnValue.ShipperID, testReturnValue.CompanyName, testReturnValue.Phone); return(JavaScript(scriptText)); } }
/// <summary>トランザクション開始</summary> /// <param name="iso"> /// 分離レベル /// 1. NoTransaction:トランザクションを開始しない。 /// 2. DefaultTransaction:規定の分離レベルでトランザクションを開始する。 /// 3. ReadUncommitted:非コミット読み取りの分離レベルでトランザクションを開始する。 /// 4. ReadCommitted:コミット済み読み取りの分離レベルでトランザクションを開始する。 /// 5. RepeatableRead:反復可能読み取りの分離レベルでトランザクションを開始する。 /// 6. Serializable:直列化可能の分離レベルでトランザクションを開始する。 /// 7. Snapshot:スナップショット分離レベルでトランザクションを開始する(SQL Server2005からの機能)。 /// </param> /// <remarks> /// ○ 基本的に「ReadCommitted」で良い。 /// ○ 参照データしたデータが、Tx中に変更されては困る場合のみ、次の分離レベルを使用する。 /// 1. 「RepeatableRead」:Tx中、参照したデータの共有ロックが持続され、変更されない。 /// 2. 「Serializable」:Tx中、検索したキー範囲のロックが持続され、変更されない。 /// 3. 「Snapshot」:上記1.、2.の分離レベルでは同時実効性に問題がある時に使用する。 /// ※ SQL Server2005からの機能であり、DBの設定でSnapshotを有効にする必要がある。 /// ※ 上記(3.)の方式は、悲観排他方式(ホールドロック)を使用できないので注意する。 /// ○ ノートランザクションは、通常、デフォルトの分離レベルの「ReadCommitted」の自動コミットになる。 /// ○ デッドロックになりかねないとき、参照時、更新ロックを使用する。 /// ○「ReadUncommitted」はダーティーリードのため、基本的に使用しない。 /// 必要に応じて利用する。 /// </remarks> public override void BeginTransaction(DbEnum.IsolationLevelEnum iso) { // 分離レベル設定のチェック if (iso == DbEnum.IsolationLevelEnum.NoTransaction) { // トランザクションを開始しない(nullのまま)。 } else if (iso == DbEnum.IsolationLevelEnum.DefaultTransaction) { LogIF.DebugLog("ACCESS", "Transaction not supported (BeginTransaction)"); } else if (iso == DbEnum.IsolationLevelEnum.ReadUncommitted) { LogIF.DebugLog("ACCESS", "Transaction not supported (BeginTransaction)"); } else if (iso == DbEnum.IsolationLevelEnum.ReadCommitted) { LogIF.DebugLog("ACCESS", "Transaction not supported (BeginTransaction)"); } else if (iso == DbEnum.IsolationLevelEnum.RepeatableRead) { LogIF.DebugLog("ACCESS", "Transaction not supported (BeginTransaction)"); } else if (iso == DbEnum.IsolationLevelEnum.Serializable) { LogIF.DebugLog("ACCESS", "Transaction not supported (BeginTransaction)"); } else if (iso == DbEnum.IsolationLevelEnum.Snapshot) { LogIF.DebugLog("ACCESS", "Transaction not supported (BeginTransaction)"); } else if (iso == DbEnum.IsolationLevelEnum.User) { // 無効な分離レベル(ユーザ指定)。 throw new ArgumentException( PublicExceptionMessage.DB_ISO_LEVEL_PARAM_ERROR_USR); } else if (iso == DbEnum.IsolationLevelEnum.NotConnect) { // 2009/03/29 -- 追加したNotConnectの対応(このコードブロック)。 // 無効な分離レベル(NotConnect指定)。 throw new ArgumentException( PublicExceptionMessage.DB_ISO_LEVEL_PARAM_ERROR_NC); } else { // 通らない予定 } // 分離レベル(iso)をメンバ変数に保存 _iso = iso; }
/// <summary> /// ShipperId をキーにして Shippers テーブルのレコードを取得する /// </summary> /// <param name="ddlDap">データプロバイダ</param> /// <param name="ddlMode1">静的、動的のクエリ モード(共通Dao選択時)</param> /// <param name="ddlMode2">静的、動的のクエリ モード</param> /// <param name="ddlExRollback">コミット、ロールバック</param> /// <param name="textBox1">ShipperId</param> /// <param name="form">入力フォームの情報</param> /// <returns>再描画(ViewResult)</returns> public ActionResult Select(string ddlDap, string ddlMode1, string ddlMode2, string ddlExRollback, string textBox1, FormCollection form) { // 引数クラスを生成 // 下位(B・D層)は、テスト クラスを流用する TestParameterValue testParameterValue = new TestParameterValue( "CrudMu", "button6", "Select", ddlDap + "%" + ddlMode1 + "%" + ddlMode2 + "%" + ddlExRollback, new MyUserInfo("aaa", "192.168.1.1")); // 動的SQLの要素を設定 testParameterValue.ShipperID = int.Parse(textBox1); // 戻り値 TestReturnValue testReturnValue; // 分離レベルの設定 DbEnum.IsolationLevelEnum iso = DbEnum.IsolationLevelEnum.DefaultTransaction; // B層呼出し+都度コミット LayerB layerB = new LayerB(); testReturnValue = (TestReturnValue)layerB.DoBusinessLogic(testParameterValue, iso); // 結果表示するメッセージ string message = ""; CrudModel model = new CrudModel(); // 値の復元のため、CopyInputValuesを呼び出す。 model.CopyInputValues(form); if (testReturnValue.ErrorFlag == true) { // 結果(業務続行可能なエラー) message = "ErrorMessageID:" + testReturnValue.ErrorMessageID + ";"; message += "ErrorMessage:" + testReturnValue.ErrorMessage + ";"; message += "ErrorInfo:" + testReturnValue.ErrorInfo; // メッセージを設定。 model.Message = message; } else { // 結果(正常系) // 入力フォームの復元値を更新する場合は、model.InputValuesを更新する。 model.InputValues["textBox1"] = testReturnValue.ShipperID.ToString(); model.InputValues["textBox2"] = testReturnValue.CompanyName; model.InputValues["textBox3"] = testReturnValue.Phone; } // Html.BeginFormでは、全体更新。 return(View("Index", model)); }
/// <summary> /// To create database records /// </summary> /// <param name="shardMap"></param> /// <param name="credentialsConnectionString"></param> public static void ExecuteDataDependentRoutingQuery(RangeShardMap <int> shardMap) { // we just choose a random key out of the range that is mapped. Here we assume that the ranges // start at 0, are contiguous, and are bounded (i.e. there is no range where HighIsMax == true) int currentMaxHighKey = shardMap.GetMappings().Max(m => m.Value.High); MultiShardConfiguration.customerId = GetCustomerId(currentMaxHighKey); string customerName = shardCustomerNames[randCustomer.Next(shardCustomerNames.Length)]; int regionId = 0; int productId = 0; TestParameterValue testParameterValue = new TestParameterValue( "DataDependentRouting", "ExecuteDataDependentRouting", "Insert", "SqlDbWithDataDependent" + "%" + "individual" + "%" + "-", new MyUserInfo("DataDependentRouting", "DataDependentRouting")); // 情報の設定 testParameterValue.CustomerId = MultiShardConfiguration.customerId; testParameterValue.Name = customerName; testParameterValue.RegionId = regionId; testParameterValue.ProductId = productId; // 分離レベルの設定 DbEnum.IsolationLevelEnum iso = DbEnum.IsolationLevelEnum.DefaultTransaction; // B層を生成 LayerB myBusiness = new LayerB(); // 業務処理を実行 TestReturnValue testReturnValue = (TestReturnValue)myBusiness.DoBusinessLogic( (BaseParameterValue)testParameterValue, iso); string strErrorMsg = ""; if (testReturnValue.ErrorFlag == true) { // 結果(業務続行可能なエラー) strErrorMsg = "ErrorMessageID:" + testReturnValue.ErrorMessageID + "\r\n"; strErrorMsg += "ErrorMessage:" + testReturnValue.ErrorMessage + "\r\n"; strErrorMsg += "ErrorInfo:" + testReturnValue.ErrorInfo + "\r\n"; Console.WriteLine("Inserted failed for customer ID: {0},{1}", testParameterValue.CustomerId, strErrorMsg); } else { // 結果(正常系) Console.WriteLine("Inserted order for customer ID: {0}", testParameterValue.CustomerId); } }
/// <summary> /// btnMButton5のClickイベント(一覧取得(動的sql)) /// </summary> /// <param name="fxEventArgs">Event Handlerの共通引数</param> /// <returns>URL</returns> protected string UOC_sampleScreen_btnMButton5_Click(FxEventArgs fxEventArgs) { // 引数クラスを生成 // 下位(B・D層)は、テスト クラスを流用する TestParameterValue testParameterValue = new TestParameterValue( this.ContentPageFileNoEx, fxEventArgs.ButtonID, "SelectAll_DSQL", this.ddlDap.SelectedValue + "%" + this.ddlMode1.SelectedValue + "%" + this.ddlMode2.SelectedValue + "%" + this.ddlExRollback.SelectedValue, this.UserInfo); // 動的SQLの要素を設定 testParameterValue.OrderColumn = this.ddlOrderColumn.SelectedValue; testParameterValue.OrderSequence = this.ddlOrderSequence.SelectedValue; // 分離レベルの設定 DbEnum.IsolationLevelEnum iso = this.SelectIsolationLevel(); // B層を生成 LayerB myBusiness = new LayerB(); // 業務処理を実行 TestReturnValue testReturnValue = (TestReturnValue)myBusiness.DoBusinessLogic( (BaseParameterValue)testParameterValue, iso); // 結果表示するMessage エリア Label label = (Label)this.GetMasterWebControl("Label1"); label.Text = ""; if (testReturnValue.ErrorFlag == true) { // 結果(業務続行可能なエラー) label.Text = "ErrorMessageID:" + testReturnValue.ErrorMessageID + "\r\n"; label.Text += "ErrorMessage:" + testReturnValue.ErrorMessage + "\r\n"; label.Text += "ErrorInfo:" + testReturnValue.ErrorInfo + "\r\n"; } else { // 結果(正常系) this.GridView1.DataSource = testReturnValue.Obj; this.GridView1.DataBind(); } // 画面遷移しないPost Backの場合は、urlを空文字列に設定する return(""); }
/// <summary> /// Shippers テーブルに新規レコードを更新する /// </summary> /// <param name="ddlDap">データプロバイダ</param> /// <param name="ddlMode1">静的、動的のクエリ モード(共通Dao選択時)</param> /// <param name="ddlMode2">静的、動的のクエリ モード</param> /// <param name="ddlExRollback">コミット、ロールバック</param> /// <param name="textBox1">ShipperId</param> /// <param name="textBox2">CompanyName</param> /// <param name="textBox3">Phone</param> /// <returns>Shippers テーブルのレコードを表示するPartialViewResult</returns> public ActionResult Update(string ddlDap, string ddlMode1, string ddlMode2, string ddlExRollback, string textBox1, string textBox2, string textBox3) { // 引数クラスを生成 // 下位(B・D層)は、テスト クラスを流用する TestParameterValue testParameterValue = new TestParameterValue( "CrudMu", "button8", "Update", ddlDap + "%" + ddlMode1 + "%" + ddlMode2 + "%" + ddlExRollback, new MyUserInfo("aaa", "192.168.1.1")); // 動的SQLの要素を設定 testParameterValue.ShipperID = int.Parse(textBox1); testParameterValue.CompanyName = textBox2; testParameterValue.Phone = textBox3; // 戻り値 TestReturnValue testReturnValue; // 分離レベルの設定 DbEnum.IsolationLevelEnum iso = DbEnum.IsolationLevelEnum.DefaultTransaction; // B層呼出し+都度コミット LayerB layerB = new LayerB(); testReturnValue = (TestReturnValue)layerB.DoBusinessLogic(testParameterValue, iso); // 結果表示するメッセージ string message = ""; if (testReturnValue.ErrorFlag == true) { // 結果(業務続行可能なエラー) message = "ErrorMessageID:" + testReturnValue.ErrorMessageID + ";"; message += "ErrorMessage:" + testReturnValue.ErrorMessage + ";"; message += "ErrorInfo:" + testReturnValue.ErrorInfo; } else { // 結果(正常系) message = testReturnValue.Obj.ToString() + "件更新"; } CrudModel model = new CrudModel() { Message = message }; // Ajax.BeginFormでは、以下のように記述することで部分更新が可能。 return(PartialView("_MessageView", model)); }
/// <summary> /// btnMButton8のClickイベント(更新処理) /// </summary> /// <param name="fxEventArgs">Event Handlerの共通引数</param> /// <returns>URL</returns> protected string UOC_sampleScreen_btnMButton8_Click(FxEventArgs fxEventArgs) { // 引数クラスを生成 // 下位(B・D層)は、テスト クラスを流用する TestParameterValue testParameterValue = new TestParameterValue( this.ContentPageFileNoEx, fxEventArgs.ButtonID, "Update", this.ddlDap.SelectedValue + "%" + this.ddlMode1.SelectedValue + "%" + this.ddlMode2.SelectedValue + "%" + this.ddlExRollback.SelectedValue, this.UserInfo); // 情報の設定 testParameterValue.ShipperID = int.Parse(this.TextBox1.Text); testParameterValue.CompanyName = this.TextBox2.Text; testParameterValue.Phone = this.TextBox3.Text; // 分離レベルの設定 DbEnum.IsolationLevelEnum iso = this.SelectIsolationLevel(); // B層を生成 LayerB myBusiness = new LayerB(); // 業務処理を実行 TestReturnValue testReturnValue = (TestReturnValue)myBusiness.DoBusinessLogic( (BaseParameterValue)testParameterValue, iso); // 結果表示するMessage エリア Label label = (Label)this.GetMasterWebControl("Label1"); label.Text = ""; if (testReturnValue.ErrorFlag == true) { // 結果(業務続行可能なエラー) label.Text = "ErrorMessageID:" + testReturnValue.ErrorMessageID + "\r\n"; label.Text += "ErrorMessage:" + testReturnValue.ErrorMessage + "\r\n"; label.Text += "ErrorInfo:" + testReturnValue.ErrorInfo + "\r\n"; } else { // 結果(正常系) label.Text = testReturnValue.Obj.ToString() + "件更新"; } // 画面遷移しないPost Backの場合は、urlを空文字列に設定する return(""); }
// POST api/Update public HttpResponseMessage Post(WebApiParams param) { // 引数クラスを生成 // 下位(B・D層)は、テスト クラスを流用する TestParameterValue testParameterValue = new TestParameterValue( "CrudMu", "button1", "Update", param.ddlDap + "%" + param.ddlMode1 + "%" + param.ddlMode2 + "%" + param.ddlExRollback, new MyUserInfo("aaa", "192.168.1.1")); testParameterValue.ShipperID = param.ShipperId; testParameterValue.CompanyName = param.CompanyName; testParameterValue.Phone = param.Phone; // 戻り値 TestReturnValue testReturnValue; // 分離レベルの設定 DbEnum.IsolationLevelEnum iso = DbEnum.IsolationLevelEnum.DefaultTransaction; // B層呼出し+都度コミット LayerB layerB = new LayerB(); testReturnValue = (TestReturnValue)layerB.DoBusinessLogic(testParameterValue, iso); // 結果表示するメッセージ string message = ""; Dictionary <string, string> dic = new Dictionary <string, string>(); if (testReturnValue.ErrorFlag == true) { // 結果(業務続行可能なエラー) message = "ErrorMessageID:" + testReturnValue.ErrorMessageID + ";"; message += "ErrorMessage:" + testReturnValue.ErrorMessage + ";"; message += "ErrorInfo:" + testReturnValue.ErrorInfo; dic.Add("Error", message); } else { // 結果(正常系) message = testReturnValue.Obj.ToString() + "件更新"; dic.Add("Message", message); } return(Request.CreateResponse(HttpStatusCode.OK, dic)); }
/// <summary> /// Shippers テーブルのレコード数をカウントする /// </summary> /// <param name="ddlDap">データプロバイダ</param> /// <param name="ddlMode1">静的、動的のクエリ モード(共通Dao選択時)</param> /// <param name="ddlMode2">静的、動的のクエリ モード</param> /// <param name="ddlExRollback">コミット、ロールバック</param> /// <param name="form">入力フォームの情報</param> /// <returns>再描画(ViewResult)</returns> public ActionResult GetCount(string ddlDap, string ddlMode1, string ddlMode2, string ddlExRollback, FormCollection form) { // 引数クラスを生成 // 下位(B・D層)は、テスト クラスを流用する TestParameterValue testParameterValue = new TestParameterValue( "CrudMu", "button1", "SelectCount", ddlDap + "%" + ddlMode1 + "%" + ddlMode2 + "%" + ddlExRollback, new MyUserInfo("aaa", "192.168.1.1")); // 戻り値 TestReturnValue testReturnValue; // 分離レベルの設定 DbEnum.IsolationLevelEnum iso = DbEnum.IsolationLevelEnum.DefaultTransaction; // B層呼出し+都度コミット LayerB layerB = new LayerB(); testReturnValue = (TestReturnValue)layerB.DoBusinessLogic(testParameterValue, iso); // 結果表示するメッセージ string message = ""; CrudModel model = new CrudModel(); // 値の復元のため、CopyInputValuesを呼び出す。 model.CopyInputValues(form); if (testReturnValue.ErrorFlag == true) { // 結果(業務続行可能なエラー) message = "ErrorMessageID:" + testReturnValue.ErrorMessageID + ";"; message += "ErrorMessage:" + testReturnValue.ErrorMessage + ";"; message += "ErrorInfo:" + testReturnValue.ErrorInfo; } else { // 結果(正常系) message = testReturnValue.Obj.ToString() + "件のデータがあります"; } // メッセージを設定。 model.Message = message; // Html.BeginFormでは、全体更新。 return(View("Index", model)); }
/// <summary>更新処理</summary> /// <param name="rcFxEventArgs">イベントハンドラの共通引数</param> protected void UOC_btnButton8_Click(RcFxEventArgs rcFxEventArgs) { // 引数クラスを生成 // 下位(B・D層)は、テスト クラスを流用する TestParameterValue testParameterValue = new TestParameterValue( this.Name, rcFxEventArgs.ControlName, "Update", ((ComboBoxItem)this.ddlDap.SelectedItem).Value + "%" + ((ComboBoxItem)this.ddlMode1.SelectedItem).Value + "%" + ((ComboBoxItem)this.ddlMode2.SelectedItem).Value + "%" + ((ComboBoxItem)this.ddlExRollback.SelectedItem).Value, MyBaseControllerWin.UserInfo); // 情報の設定 testParameterValue.ShipperID = int.Parse(this.textBox1.Text); testParameterValue.CompanyName = this.textBox2.Text; testParameterValue.Phone = this.textBox3.Text; // 戻り値 TestReturnValue testReturnValue; // 分離レベルの設定 DbEnum.IsolationLevelEnum iso = this.SelectIsolationLevel(); // B層呼出し+都度コミット LayerB layerB = new LayerB(); testReturnValue = (TestReturnValue)layerB.DoBusinessLogic(testParameterValue, iso); LayerB.CommitAndClose(); // 結果表示するメッセージ エリア this.labelMessage.Text = ""; if (testReturnValue.ErrorFlag == true) { // 結果(業務続行可能なエラー) labelMessage.Text = "ErrorMessageID:" + testReturnValue.ErrorMessageID + "\r\n"; labelMessage.Text += "ErrorMessage:" + testReturnValue.ErrorMessage + "\r\n"; labelMessage.Text += "ErrorInfo:" + testReturnValue.ErrorInfo + "\r\n"; } else { // 結果(正常系) labelMessage.Text = testReturnValue.Obj.ToString() + "件更新"; } }
/// <summary>一覧取得(動的sql)</summary> private void button5_Click(object sender, RoutedEventArgs e) { // 引数クラスを生成 // 下位(B・D層)は、テスト クラスを流用する TestParameterValue testParameterValue = new TestParameterValue( this.Name, ((Button)sender).Name, "SelectAll_DSQL", ((ComboBoxItem)this.ddlDap.SelectedItem).Value + "%" + ((ComboBoxItem)this.ddlMode1.SelectedItem).Value + "%" + ((ComboBoxItem)this.ddlMode2.SelectedItem).Value + "%" + ((ComboBoxItem)this.ddlExRollback.SelectedItem).Value, this.myUserInfo); // 動的SQLの要素を設定 testParameterValue.OrderColumn = ((ComboBoxItem)this.ddlOrderColumn.SelectedItem).Value; testParameterValue.OrderSequence = ((ComboBoxItem)this.ddlOrderSequence.SelectedItem).Value; // 戻り値 TestReturnValue testReturnValue; // 分離レベルの設定 DbEnum.IsolationLevelEnum iso = this.SelectIsolationLevel(); // B層呼出し+都度コミット LayerB layerB = new LayerB(); testReturnValue = (TestReturnValue)layerB.DoBusinessLogic(testParameterValue, iso); LayerB.CommitAndClose(); // 結果表示するメッセージ エリア this.labelMessage.Content = ""; if (testReturnValue.ErrorFlag == true) { // 結果(業務続行可能なエラー) labelMessage.Content = "ErrorMessageID:" + testReturnValue.ErrorMessageID + "\r\n"; labelMessage.Content += "ErrorMessage:" + testReturnValue.ErrorMessage + "\r\n"; labelMessage.Content += "ErrorInfo:" + testReturnValue.ErrorInfo + "\r\n"; } else { // 結果(正常系) this.dataGridControl1.Columns.Clear(); this.dataGridControl1.DataContext = testReturnValue.Obj; } }
/// <summary>参照処理</summary> private void button6_Click(object sender, RoutedEventArgs e) { // 引数クラスを生成 // 下位(B・D層)は、テスト クラスを流用する TestParameterValue testParameterValue = new TestParameterValue( this.Name, ((Button)sender).Name, "Select", ((ComboBoxItem)this.ddlDap.SelectedItem).Value + "%" + ((ComboBoxItem)this.ddlMode1.SelectedItem).Value + "%" + ((ComboBoxItem)this.ddlMode2.SelectedItem).Value + "%" + ((ComboBoxItem)this.ddlExRollback.SelectedItem).Value, this.myUserInfo); // 情報の設定 testParameterValue.ShipperID = int.Parse(this.textBox1.Text); // 戻り値 TestReturnValue testReturnValue; // 分離レベルの設定 DbEnum.IsolationLevelEnum iso = this.SelectIsolationLevel(); // B層呼出し+都度コミット LayerB layerB = new LayerB(); testReturnValue = (TestReturnValue)layerB.DoBusinessLogic(testParameterValue, iso); LayerB.CommitAndClose(); // 結果表示するメッセージ エリア this.labelMessage.Content = ""; if (testReturnValue.ErrorFlag == true) { // 結果(業務続行可能なエラー) labelMessage.Content = "ErrorMessageID:" + testReturnValue.ErrorMessageID + "\r\n"; labelMessage.Content += "ErrorMessage:" + testReturnValue.ErrorMessage + "\r\n"; labelMessage.Content += "ErrorInfo:" + testReturnValue.ErrorInfo + "\r\n"; } else { // 結果(正常系) this.textBox1.Text = testReturnValue.ShipperID.ToString(); this.textBox2.Text = testReturnValue.CompanyName; this.textBox3.Text = testReturnValue.Phone; } }
/// <summary>一覧取得(動的sql)</summary> /// <param name="rcFxEventArgs">イベントハンドラの共通引数</param> protected void UOC_btnButton5_Click(RcFxEventArgs rcFxEventArgs) { // 引数クラスを生成 // 下位(B・D層)は、テスト クラスを流用する TestParameterValue testParameterValue = new TestParameterValue( this.Name, rcFxEventArgs.ControlName, "SelectAll_DSQL", ((ComboBoxItem)this.ddlDap.SelectedItem).Value + "%" + ((ComboBoxItem)this.ddlMode1.SelectedItem).Value + "%" + ((ComboBoxItem)this.ddlMode2.SelectedItem).Value + "%" + ((ComboBoxItem)this.ddlExRollback.SelectedItem).Value, MyBaseControllerWin.UserInfo); // 動的SQLの要素を設定 testParameterValue.OrderColumn = ((ComboBoxItem)this.ddlOrderColumn.SelectedItem).Value; testParameterValue.OrderSequence = ((ComboBoxItem)this.ddlOrderSequence.SelectedItem).Value; // 戻り値 TestReturnValue testReturnValue; // 分離レベルの設定 DbEnum.IsolationLevelEnum iso = this.SelectIsolationLevel(); // B層呼出し+都度コミット LayerB layerB = new LayerB(); testReturnValue = (TestReturnValue)layerB.DoBusinessLogic(testParameterValue, iso); LayerB.CommitAndClose(); // 結果表示するメッセージ エリア this.labelMessage.Text = ""; if (testReturnValue.ErrorFlag == true) { // 結果(業務続行可能なエラー) labelMessage.Text = "ErrorMessageID:" + testReturnValue.ErrorMessageID + "\r\n"; labelMessage.Text += "ErrorMessage:" + testReturnValue.ErrorMessage + "\r\n"; labelMessage.Text += "ErrorInfo:" + testReturnValue.ErrorInfo + "\r\n"; } else { // 結果(正常系) this.dataGridView1.DataSource = testReturnValue.Obj; } }
/// <summary>トランザクション開始</summary> /// <param name="iso">分離レベル(Oracleに同じ)</param> public override void BeginTransaction(DbEnum.IsolationLevelEnum iso) { // 分離レベル設定のチェック if (iso == DbEnum.IsolationLevelEnum.NoTransaction) { // トランザクションを開始しない(nullのまま)。 } else if (iso == DbEnum.IsolationLevelEnum.DefaultTransaction) { // 規定の分離レベルでトランザクションを開始する。 this._tx = this._cnn.BeginTransaction(); } else if (iso == DbEnum.IsolationLevelEnum.ReadUncommitted) { // 無効な分離レベル throw new ArgumentException(String.Format( PublicExceptionMessage.DB_ISO_LEVEL_PARAM_ERROR_UC, "PostgreSQL")); } else if (iso == DbEnum.IsolationLevelEnum.ReadCommitted) { // コミット済み読み取りの分離レベルでトランザクションを開始する。 this._tx = this._cnn.BeginTransaction(IsolationLevel.ReadCommitted); } else if (iso == DbEnum.IsolationLevelEnum.RepeatableRead) { // 無効な分離レベル throw new ArgumentException(String.Format( PublicExceptionMessage.DB_ISO_LEVEL_PARAM_ERROR_RR, "PostgreSQL")); } else if (iso == DbEnum.IsolationLevelEnum.Serializable) { // 直列化可能の分離レベルでトランザクションを開始する。 this._tx = this._cnn.BeginTransaction(IsolationLevel.Serializable); } else if (iso == DbEnum.IsolationLevelEnum.Snapshot) { //// スナップショット分離レベルでトランザクションを開始する。 //this._tx = this._cnn.BeginTransaction(IsolationLevel.Snapshot); // 無効な分離レベル(スナップショット分離レベル) throw new ArgumentException(String.Format( PublicExceptionMessage.DB_ISO_LEVEL_PARAM_ERROR_SS, "PostgreSQL")); } else if (iso == DbEnum.IsolationLevelEnum.User) { // 無効な分離レベル(ユーザ指定)。 throw new ArgumentException(PublicExceptionMessage.DB_ISO_LEVEL_PARAM_ERROR_USR); } else if (iso == DbEnum.IsolationLevelEnum.NotConnect) { // 無効な分離レベル(NotConnect指定)。 throw new ArgumentException(PublicExceptionMessage.DB_ISO_LEVEL_PARAM_ERROR_NC); } else { // 通らない予定 } // 分離レベル(iso)をメンバ変数に保存 _iso = iso; }
/// <summary>データアクセス制御クラス(DAM)の生成し、コネクションを確立、トランザクションを開始する処理を実装</summary> /// <param name="parameterValue">引数クラス</param> /// <param name="iso">分離レベル(DBMS毎の分離レベルの違いを理解して設定すること)</param> /// <remarks>業務コード親クラス1から利用される派生の末端</remarks> protected override void UOC_ConnectionOpen( BaseParameterValue parameterValue, DbEnum.IsolationLevelEnum iso) { #region トランザクション属性取得例 //// クラスの属性、メソッドの属性から調査 //MyAttribute[] aryMCA; //MyAttribute[] aryMMA; //// クラスの属性を取得 //MyAttribute.GetAttr(this, out aryMCA); //foreach (MyAttribute mca in aryMCA) //{ // Debug.WriteLine(this.GetType().ToString() + ".MyAttributeA = " + mca.MyAttributeA); // Debug.WriteLine(this.GetType().ToString() + ".MyAttributeB = " + mca.MyAttributeB); // Debug.WriteLine(this.GetType().ToString() + ".MyAttributeC = " + mca.MyAttributeC); // Debug.WriteLine("+------------------+"); //} //// メソッドの属性を取得 //MethodInfo[] aryMtdInfo = this.GetType().GetMethods(); //foreach (MethodInfo mtdInfo in aryMtdInfo) //{ // MyAttribute.GetAttr(mtdInfo, out aryMMA); // foreach (MyAttribute mma in aryMMA) // { // Debug.WriteLine(mtdInfo.Name + ".MyAttributeA = " + mma.MyAttributeA); // Debug.WriteLine(mtdInfo.Name + ".MyAttributeB = " + mma.MyAttributeB); // Debug.WriteLine(mtdInfo.Name + ".MyAttributeC = " + mma.MyAttributeC); // Debug.WriteLine("+------------------+"); // } //} #endregion // データアクセス制御クラス(DAM) BaseDam dam = null; #region 接続 if (iso == DbEnum.IsolationLevelEnum.NotConnect) { // 接続しない } else { // 接続する string connstring = ""; #region データ プロバイダ選択 if (parameterValue.ActionType.Split('%')[0] == "SQL") { // SQL Server / SQL Client用のDamを生成 dam = new DamSqlSvr(); // 接続文字列をロード connstring = GetConfigParameter.GetConnectionString("ConnectionString_SQL"); } else if (parameterValue.ActionType.Split('%')[0] == "OLE") { // OLEDB.NET用のDamを生成 dam = new DamOLEDB(); // 接続文字列をロード connstring = GetConfigParameter.GetConnectionString("ConnectionString_OLE"); } else if (parameterValue.ActionType.Split('%')[0] == "ODB") { // ODBC.NET用のDamを生成 dam = new DamODBC(); // 接続文字列をロード connstring = GetConfigParameter.GetConnectionString("ConnectionString_ODBC"); } else if (parameterValue.ActionType.Split('%')[0] == "ORA") { // Oracle / Oracle Client用のDamを生成 dam = new DamOraClient(); // 接続文字列をロード connstring = GetConfigParameter.GetConnectionString("ConnectionString_ORA"); } else if (parameterValue.ActionType.Split('%')[0] == "ODP") { // Oracle / ODP.NET用のDamを生成 dam = new DamOraOdp(); // 接続文字列をロード(ODP2:Instant Client) connstring = GetConfigParameter.GetConnectionString("ConnectionString_ODP2"); } else if (parameterValue.ActionType.Split('%')[0] == "DB2") { // DB2.NET用のDamを生成 dam = new DamDB2(); // 接続文字列をロード connstring = GetConfigParameter.GetConnectionString("ConnectionString_DB2"); } //else if (parameterValue.ActionType.Split('%')[0] == "HIR") //{ // // HiRDBデータプロバイダ用のDamを生成 // dam = new DamHiRDB(); // // 接続文字列をロード // connstring = GetConfigParameter.GetConnectionString("ConnectionString_HIR"); //} else if (parameterValue.ActionType.Split('%')[0] == "MCN") { // MySQL Cnn/NET用のDamを生成 dam = new DamMySQL(); // 接続文字列をロード connstring = GetConfigParameter.GetConnectionString("ConnectionString_MCN"); } else if (parameterValue.ActionType.Split('%')[0] == "NPS") { // PostgreSQL / Npgsql用のDamを生成 dam = new DamPstGrS(); // 接続文字列をロード connstring = GetConfigParameter.GetConnectionString("ConnectionString_NPS"); } else { // ここは通らない } #endregion if (dam != null) { // コネクションをオープンする。 dam.ConnectionOpen(connstring); #region トランザクションを開始する。 if (iso == DbEnum.IsolationLevelEnum.User) { // 自動トランザクション(規定の分離レベル) dam.BeginTransaction(DbEnum.IsolationLevelEnum.ReadCommitted); } else { // 自動トランザクション(指定の分離レベル) dam.BeginTransaction(iso); } #endregion // ユーザ情報を格納する(ログ出力で利用)。 dam.Obj = ((MyParameterValue)parameterValue).User; // damを設定する。 this.SetDam(dam); } } #endregion }
/// <summary>トランザクション開始</summary> /// <param name="iso">分離レベル(内部プロバイダによるので全てサポート)</param> public override void BeginTransaction(DbEnum.IsolationLevelEnum iso) { // 分離レベル設定のチェック if (iso == DbEnum.IsolationLevelEnum.NoTransaction) { // トランザクションを開始しない(nullのまま)。 } else if (iso == DbEnum.IsolationLevelEnum.DefaultTransaction) { // 規定の分離レベルでトランザクションを開始する。 this._tx = this._cnn.BeginTransaction(); } else if (iso == DbEnum.IsolationLevelEnum.ReadUncommitted) { // 非コミット読み取りの分離レベルでトランザクションを開始する。 this._tx = this._cnn.BeginTransaction(IsolationLevel.ReadUncommitted); } else if (iso == DbEnum.IsolationLevelEnum.ReadCommitted) { // コミット済み読み取りの分離レベルでトランザクションを開始する。 this._tx = this._cnn.BeginTransaction(IsolationLevel.ReadCommitted); } else if (iso == DbEnum.IsolationLevelEnum.RepeatableRead) { // 反復可能読み取りの分離レベルでトランザクションを開始する。 this._tx = this._cnn.BeginTransaction(IsolationLevel.RepeatableRead); } else if (iso == DbEnum.IsolationLevelEnum.Serializable) { // 直列化可能の分離レベルでトランザクションを開始する。 this._tx = this._cnn.BeginTransaction(IsolationLevel.Serializable); } else if (iso == DbEnum.IsolationLevelEnum.Snapshot) { // スナップショット分離レベルでトランザクションを開始する。 this._tx = this._cnn.BeginTransaction(IsolationLevel.Snapshot); } else if (iso == DbEnum.IsolationLevelEnum.User) { // 無効な分離レベル(ユーザ指定)。 throw new ArgumentException( PublicExceptionMessage.DB_ISO_LEVEL_PARAM_ERROR_USR); } else if (iso == DbEnum.IsolationLevelEnum.NotConnect) { // 2009/03/29 -- 追加したNotConnectの対応(このコードブロック)。 // 無効な分離レベル(NotConnect指定)。 throw new ArgumentException( PublicExceptionMessage.DB_ISO_LEVEL_PARAM_ERROR_NC); } else { // 通らない予定 } // 分離レベル(iso)をメンバ変数に保存 _iso = iso; }
/// <summary> /// 業務コード呼び出しメソッド(業務ロジックの入り口) /// </summary> /// <param name="parameterValue">引数クラス</param> /// <param name="iso">分離レベル(DBMS毎の分離レベルの違いを理解して設定すること)</param> /// <returns>戻り値クラス</returns> /// <remarks> /// クライアント側(2層C/S)用 /// 画面コード クラスから利用する。 /// </remarks> public BaseReturnValue DoBusinessLogic( BaseParameterValue parameterValue, DbEnum.IsolationLevelEnum iso) { // 戻り値クラス BaseReturnValue returnValue = null; // オリジナルのスタックトレース値のクリア this.OriginalStackTrace = ""; // データアクセス制御クラス(DAM)がグローバルなので、全てロックする。 lock (BaseLogic2CS._lock) { if (BaseLogic2CS._dam == null) { // データアクセス制御クラス(DAM)が無い場合 // ★データアクセス制御クラス(DAM)の生成し、コネクションを確立、 // トランザクションを開始する処理(業務フレームワークに、UOCで実装する) this.UOC_ConnectionOpen(parameterValue, iso); } else { // データアクセス制御クラス(DAM)が有る場合 } try { // 自動振り分け対応 this.WasCalledFromDoBusinessLogic = true; // ★前処理(業務フレームワークに、UOCで実装する) this.UOC_PreAction(parameterValue); // ★業務ロジックの実行(業務処理の派生クラスに、UOCで実装する) this.UOC_DoAction(parameterValue, ref returnValue); // ★後処理(業務フレームワークに、UOCで実装する) this.UOC_AfterAction(parameterValue, returnValue); //// トランザクション終了 //BaseLogic2CS._dam.CommitTransaction(); //// ★トランザクション完了後の後処理(業務フレームワークに、UOCで実装する) //this.UOC_AfterTransaction(parameterValue, returnValue); } catch (BusinessApplicationException baEx)// 業務例外 { // ★★業務例外時のロールバックは自動にしない。 // 業務例外の場合、エラーフラグをセットする。 // 戻り値がnullの場合は、生成する。 if (returnValue == null) { returnValue = new BaseReturnValue(); } returnValue.ErrorFlag = true; // メッセージを戻す(戻り値クラスに設定)。 returnValue.ErrorMessageID = baEx.messageID; returnValue.ErrorMessage = baEx.Message; returnValue.ErrorInfo = baEx.Information; // ★異常系の後処理(業務フレームワークに、UOCで実装する) this.UOC_ABEND(parameterValue, returnValue, baEx); // 正常系の戻り値にして戻すため、リスローしない。 } catch (BusinessSystemException bsEx)// システム例外 { // ★システム例外時は、自動的にロールバック。 // 2009/03/13---B層内:トランザクション手動制御を可能に(ここから) // トランザクションをロールバック if (BaseLogic2CS._dam == null) { // nullの場合はロールバックしない(何もしない)。 } else { // 例外対策(例外は潰さない) try { // nullでない場合はロールバックする。 BaseLogic2CS._dam.RollbackTransaction(); // コネクション クローズ BaseLogic2CS._dam.ConnectionClose(); } finally { // nullクリア(次回、再接続される。) BaseLogic2CS._dam = null; } } // 2009/03/13---B層内:トランザクション手動制御を可能に(ここまで) // 戻り値がnullの場合は、生成する。 if (returnValue == null) { returnValue = new BaseReturnValue(); } // ★異常系の後処理(業務フレームワークに、UOCで実装する) this.UOC_ABEND(parameterValue, returnValue, bsEx); // リスロー throw; } catch (Exception Ex)// その他、一般的な例外 { // ★その他、一般的な例外は、自動的にロールバック。 // 2009/03/13---B層内:トランザクション手動制御を可能に(ここから) // トランザクションをロールバック if (BaseLogic2CS._dam == null) { // nullの場合はロールバックしない(何もしない)。 } else { // 例外対策(例外は潰さない) try { // nullでない場合はロールバックする。 BaseLogic2CS._dam.RollbackTransaction(); // コネクション クローズ BaseLogic2CS._dam.ConnectionClose(); } finally { // nullクリア(次回、再接続される。) BaseLogic2CS._dam = null; } } // 2009/03/13---B層内:トランザクション手動制御を可能に(ここまで) // 戻り値がnullの場合は、生成する。 if (returnValue == null) { returnValue = new BaseReturnValue(); } // ★異常系の後処理(業務フレームワークに、UOCで実装する) this.UOC_ABEND(parameterValue, ref returnValue, Ex); // リスローしない(上記のUOC_ABENDで必要に応じてリスロー) // throw; } finally { // 自動振り分け対応 this.WasCalledFromDoBusinessLogic = false; // クライアント側(2層C/S)用では、マニュアル操作だが、 // ノートランザクションの時は、都度コネクションを閉じる。 // Damオブジェクトの存在チェック if (BaseLogic2CS._dam == null) { // nullのためなにもしない。 } else { // ノートランザクションの時は、都度コネクションを閉じる。 if (iso == DbEnum.IsolationLevelEnum.NoTransaction) { // 例外対策(例外は潰さない) try { // コネクション クローズ BaseLogic2CS._dam.ConnectionClose(); } finally { // nullクリア(次回の「DoBusinessLogic_2CS」で再接続される。) BaseLogic2CS._dam = null; } } } } } // 戻り値を戻す。 return(returnValue); }
/// <summary>トランザクション制御情報を取得する。</summary> /// <param name="TransactionPatternID">トランザクション パターンID</param> /// <param name="connectionString">接続文字列(out)</param> /// <param name="isolevel">分離レベル(out)</param> private void GetTCInfo(string TransactionPatternID, out string connectionString, out DbEnum.IsolationLevelEnum isolevel) { connectionString = ""; isolevel = DbEnum.IsolationLevelEnum.NotConnect; // 属性チェック用 XmlNode xmlNode = null; // TransactionPatternタグを取得する。 XmlElement xmlElement = this.XMLTCD.GetElementById(TransactionPatternID); if (xmlElement == null) { // TransactionPatternタグがない場合 // 例外を発生させる。 throw new FrameworkException( FrameworkExceptionMessage.TRANSACTION_CONTROL_XML_FORMAT_ERROR[0], String.Format(FrameworkExceptionMessage.TRANSACTION_CONTROL_XML_FORMAT_ERROR[1], String.Format(FrameworkExceptionMessage.TRANSACTION_CONTROL_XML_FORMAT_ERROR_tp, TransactionPatternID))); } else { // TransactionPatternタグがある場合 // connkey属性 xmlNode = xmlElement.Attributes[FxLiteral.XML_TX_ATTR_CONNKEY]; if (xmlNode == null) { // connkey属性なしの場合 } else { // connkey属性ありの場合 connectionString = GetConfigParameter.GetConnectionString(xmlNode.Value); } // isolevel属性 xmlNode = xmlElement.Attributes[FxLiteral.XML_TX_ATTR_ISOLEVEL]; if (xmlNode == null) { // isolevel属性なしの場合 // 例外を発生させる。 throw new FrameworkException( FrameworkExceptionMessage.TRANSACTION_CONTROL_XML_FORMAT_ERROR[0], String.Format(FrameworkExceptionMessage.TRANSACTION_CONTROL_XML_FORMAT_ERROR[1], String.Format(FrameworkExceptionMessage.TRANSACTION_CONTROL_XML_FORMAT_ERROR_iso1, TransactionPatternID))); } else { // isolevel属性ありの場合 // 分離level string isolevelString = xmlNode.Value; switch (isolevelString.ToUpper()) { case FxLiteral.ISO_LEVEL_NOT_CONNECT: isolevel = DbEnum.IsolationLevelEnum.NotConnect; break; case FxLiteral.ISO_LEVEL_NO_TRANSACTION: isolevel = DbEnum.IsolationLevelEnum.NoTransaction; break; case FxLiteral.ISO_LEVEL_READ_UNCOMMITTED: isolevel = DbEnum.IsolationLevelEnum.ReadUncommitted; break; case FxLiteral.ISO_LEVEL_READ_COMMIT: isolevel = DbEnum.IsolationLevelEnum.ReadCommitted; break; case FxLiteral.ISO_LEVEL_REPEATABLE_READ: isolevel = DbEnum.IsolationLevelEnum.RepeatableRead; break; case FxLiteral.ISO_LEVEL_SERIALIZABLE: isolevel = DbEnum.IsolationLevelEnum.Serializable; break; case FxLiteral.ISO_LEVEL_SNAPSHOT: isolevel = DbEnum.IsolationLevelEnum.Snapshot; break; case FxLiteral.ISO_LEVEL_DEFAULT: isolevel = DbEnum.IsolationLevelEnum.DefaultTransaction; break; default: // 定義(分離level)が間違っている。 // 例外を発生させる。 throw new FrameworkException( FrameworkExceptionMessage.TRANSACTION_CONTROL_XML_FORMAT_ERROR[0], String.Format(FrameworkExceptionMessage.TRANSACTION_CONTROL_XML_FORMAT_ERROR[1], String.Format(FrameworkExceptionMessage.TRANSACTION_CONTROL_XML_FORMAT_ERROR_iso2, isolevelString, TransactionPatternID))); } } } }
// 2009/03/28---データアクセス制御クラスを配列化(ここまで) #endregion #region 業務コード親クラス2でオーバーライドするメソッド /// <summary> /// データアクセス制御クラス(DAM)の生成し、 /// コネクションを確立、トランザクションを開始する処理を実装 /// </summary> /// <param name="parameterValue">引数クラス</param> /// <param name="iso">分離レベル(DBMS毎の分離レベルの違いを理解して設定すること)</param> /// <remarks>派生の業務コード親クラス2でオーバーライドする。</remarks> protected virtual void UOC_ConnectionOpen( BaseParameterValue parameterValue, DbEnum.IsolationLevelEnum iso) { return; }
/// <summary> /// 業務コード呼び出しメソッド(業務ロジックの入り口) /// </summary> /// <param name="parameterValue">引数クラス</param> /// <param name="iso">分離レベル(DBMS毎の分離レベルの違いを理解して設定すること)</param> /// <returns>戻り値クラス</returns> /// <remarks>画面コード クラスから利用する。</remarks> public BaseReturnValue DoBusinessLogic( BaseParameterValue parameterValue, DbEnum.IsolationLevelEnum iso) { // 戻り値クラス BaseReturnValue returnValue = null; // オリジナルのスタックトレース値のクリア this.OriginalStackTrace = ""; // ★データアクセス制御クラス(DAM)の生成し、コネクションを確立、 // トランザクションを開始する処理(業務フレームワークに、UOCで実装する) // this._dam = this.UOC_ConnectionOpen(parameterValue, iso); this.UOC_ConnectionOpen(parameterValue, iso); try { // 自動振り分け対応 this.WasCalledFromDoBusinessLogic = true; // ★前処理(業務フレームワークに、UOCで実装する) this.UOC_PreAction(parameterValue); // ★業務ロジックの実行(業務処理の派生クラスに、UOCで実装する) this.UOC_DoAction(parameterValue, ref returnValue); // ★後処理(業務フレームワークに、UOCで実装する) this.UOC_AfterAction(parameterValue, returnValue); #region トランザクションをコミット // 2009/03/13---B層内:トランザクション手動制御を可能に(ここから) if (this._dam == null) { // nullの場合はコミットしない(何もしない)。 } else { // nullでない場合はコミットする。 this._dam.CommitTransaction(); } // 2009/03/13---B層内:トランザクション手動制御を可能に(ここまで) // 2009/03/28---データアクセス制御クラスを配列化(ここから) foreach (string key in this._dams.Keys) { // ここはforeachで取るので「キーなし」にならない if (this._dams[key] == null) { // nullの場合はコミットしない(何もしない)。 } else { // nullでない場合はコミットする。 ((BaseDam)this._dams[key]).CommitTransaction(); } } // 2009/03/28---データアクセス制御クラスを配列化(ここまで) #endregion // ★トランザクション完了後の後処理(業務フレームワークに、UOCで実装する) this.UOC_AfterTransaction(parameterValue, returnValue); } catch (BusinessApplicationException baEx)// 業務例外 { #region トランザクションをロールバック // 2009/03/13---B層内:トランザクション手動制御を可能に(ここから) if (this._dam == null) { // nullの場合はロールバックしない(何もしない)。 } else { // nullでない場合はロールバックする。 this._dam.RollbackTransaction(); } // 2009/03/13---B層内:トランザクション手動制御を可能に(ここまで) // 2009/03/28---データアクセス制御クラスを配列化(ここから) foreach (string key in this._dams.Keys) { // ここはforeachで取るので「キーなし」にならない if (this._dams[key] == null) { // nullの場合はロールバックしない(何もしない)。 } else { // nullでない場合はロールバックする。 ((BaseDam)this._dams[key]).RollbackTransaction(); } } // 2009/03/28---データアクセス制御クラスを配列化(ここまで) #endregion // 業務例外の場合、エラーフラグをセットする。 // 戻り値がnullの場合は、生成する。 if (returnValue == null) { returnValue = new BaseReturnValue(); } returnValue.ErrorFlag = true; // メッセージを戻す(戻り値クラスに設定)。 returnValue.ErrorMessageID = baEx.messageID; returnValue.ErrorMessage = baEx.Message; returnValue.ErrorInfo = baEx.Information; // ★異常系の後処理(業務フレームワークに、UOCで実装する) this.UOC_ABEND(parameterValue, returnValue, baEx); // 正常系の戻り値にして戻すため、リスローしない。 } catch (BusinessSystemException bsEx)// システム例外 { #region トランザクションをロールバック // 2009/03/13---B層内:トランザクション手動制御を可能に(ここから) if (this._dam == null) { // nullの場合はロールバックしない(何もしない)。 } else { // nullでない場合はロールバックする。 this._dam.RollbackTransaction(); } // 2009/03/13---B層内:トランザクション手動制御を可能に(ここまで) // 2009/03/28---データアクセス制御クラスを配列化(ここから) foreach (string key in this._dams.Keys) { // ここはforeachで取るので「キーなし」にならない if (this._dams[key] == null) { // nullの場合はロールバックしない(何もしない)。 } else { // nullでない場合はロールバックする。 ((BaseDam)this._dams[key]).RollbackTransaction(); } } // 2009/03/28---データアクセス制御クラスを配列化(ここまで) #endregion // 戻り値がnullの場合は、生成する。 if (returnValue == null) { returnValue = new BaseReturnValue(); } // ★異常系の後処理(業務フレームワークに、UOCで実装する) this.UOC_ABEND(parameterValue, returnValue, bsEx); // リスロー throw; } catch (Exception Ex)// その他、一般的な例外 { #region トランザクションをロールバック // 2009/03/13---B層内:トランザクション手動制御を可能に(ここから) if (this._dam == null) { // nullの場合はロールバックしない(何もしない)。 } else { // nullでない場合はロールバックする。 this._dam.RollbackTransaction(); } // 2009/03/13---B層内:トランザクション手動制御を可能に(ここまで) // 2009/03/28---データアクセス制御クラスを配列化(ここから) foreach (string key in this._dams.Keys) { // ここはforeachで取るので「キーなし」にならない if (this._dams[key] == null) { // nullの場合はロールバックしない(何もしない)。 } else { // nullでない場合はロールバックする。 ((BaseDam)this._dams[key]).RollbackTransaction(); } } // 2009/03/28---データアクセス制御クラスを配列化(ここまで) #endregion // 戻り値がnullの場合は、生成する。 if (returnValue == null) { returnValue = new BaseReturnValue(); } // ★異常系の後処理(業務フレームワークに、UOCで実装する) this.UOC_ABEND(parameterValue, ref returnValue, Ex); // リスローしない(上記のUOC_ABENDで必要に応じてリスロー) // throw; } finally { // 自動振り分け対応 this.WasCalledFromDoBusinessLogic = false; #region コネクションを閉じる // 2009/03/13---B層内:トランザクション手動制御を可能に(ここから) if (this._dam == null) { // nullのためなにもしない。 } else { // コネクションを閉じる。 this._dam.ConnectionClose(); } // 2009/03/13---B層内:トランザクション手動制御を可能に(ここまで) // 2009/03/28---データアクセス制御クラスを配列化(ここから) foreach (string key in this._dams.Keys) { // ここはforeachで取るので「キーなし」にならない if (this._dams[key] == null) { // nullのためなにもしない。 } else { // コネクションを閉じる。 ((BaseDam)this._dams[key]).ConnectionClose(); } } // 2009/03/28---データアクセス制御クラスを配列化(ここまで) #endregion } // 戻り値を戻す。 return(returnValue); }