実現したいこと
タイトルの通り、HttpClient.PostAsyncを使用して、OracleConnectionとOracleTransactionを引数に持つAPIを作成したいと考えています。
発生している問題・分からないこと
OracleConnection
・JsonConvert.DeserializeObject<OracleConnection>(connection);を行った際、connectionを確認すると、「ServerVersion」が「conn.ServerVersion' は型 'System.InvalidOperationException' の例外をスローしました」となってしまう。
・上記の状態で、SQLの実行を行うと、「この操作用に接続がオープンしている必要があります」とcatchされる。
・再度Open()を行うと、「ServiceNameプロパティが設定されている場合、PDBNameプロパティを設定する必要があります」となる。(PDBNameプロパティはSerializeObjectを行う前からnull)
OracleTransaction
・JsonConvert.DeserializeObject<OracleTransaction>(connection);を行うと例外が発生する。
該当のソースコード
C#
1private HttpClient _client = null; 2 3//メイン処理 4void Main(HttpClient httpClient) 5{ 6 this._client = httpClient; 7 8 //DB接続 9 //作成した接続用のメソッドを使用して接続 10 OracleConnection conn = this.OpenDB(); 11 12 //接続できた場合 13 if(conn != null) 14 { 15 try 16 { 17 //行ロック・情報取得を行うための情報を取得 18 //長くなるので省略(dataに値をセット) 19 20 //トランザクション開始 21 using(OracleTransaction transaction = conn.BeginTransaction(IsolationLevel.ReadCommitted)) 22 { 23 bool error = false; 24 25 //行ロック・情報取得 26 //今回質問したい部分 27 if(this.RowLock(conn, transaction, data) != true) 28 { 29 //ログ出力 30 } 31 32 //取得した情報を使用した処理 33 //長くなるので省略(エラーが発生した場合、error = true) 34 35 //エラーでない場合、更新し、コミット 36 if(error == false) 37 { 38 //更新 39 if(this.UpdateData(conn, transaction, data) != true) 40 { 41 //ログ出力 42 } 43 44 //Commit 45 transaction.Commit(); 46 } 47 } 48 } 49 catch(Exception e) 50 { 51 //ログ出力 52 } 53 finally 54 { 55 //DBを閉じる 56 this.CloseDB(conn); 57 } 58 } 59 //DB接続できなかった場合 60 else 61 { 62 //ログ出力 63 } 64}
C#
1//行ロック・情報取得 2private bool RowLock(OracleConnection conn, OracleTransaction transaction, SyukkoDenpyoData data) 3{ 4 try 5 { 6 DateTime hizuke = (DateTime)data.datetime; 7 8 var parameters = new Dictionary<string, string>() 9 { 10 { "connection", JsonConvert.SerializeObject(conn) }, 11 { "transaction", transaction.ToString() }, 12 { "no", data.no.ToString() }, 13 { "datetime", hizuke.ToString("yyyy/MM/dd HH:mm:ss") }, 14 }; 15 16 var content = new FormUrlEncodedContent(parameters); 17 18 var response = this._client.PostAsync(”実際のURL/RowLockApi”, content).Result; 19 20 //以下省略 21 22 } 23 catch(Exception e) 24 { 25 throw e; 26 } 27}
C#
1//API 2[HttpPost] 3public ActionResult RowLockApi(string connection, OracleTransaction transaction, Item item) 4{ 5 OracleConnection conn = JsonConvert.DeserializeObject<OracleConnection>(connection); 6 7 try 8 { 9 //行ロック・情報取得 10 if(this.RowLock(conn, transaction, item) == false) 11 { 12 throw new Exception("error"); 13 } 14 15 //戻り値を生成 16 object obj = new 17 { 18 status = 0, 19 message = "ok" 20 }; 21 22 return Json(obj, JsonRequestBehavior.AllowGet); 23 } 24 catch(Exception e) 25 { 26 //ログ出力 27 28 object obj = new 29 { 30 status = -1, 31 message = "error" 32 }; 33 34 return Json(obj, JsonRequestBehavior.AllowGet); 35 } 36}
試したこと・調べたこと
- teratailやGoogle等で検索した
- ソースコードを自分なりに変更した
- 知人に聞いた
- その他
上記の詳細・結果
・行ロック・情報取得内で{ "transaction", JsonConvert.SerializeObject(transaction) },、APIでJsonConvert.DeserializeObject<OracleTransaction>(transaction);も試したが、正しい形に戻すことができなかった。
・OracleConnection, OracleTransactionを必要とする処理を、APIではなく同クラス内のメソッドにしたところ、理想通りの動きをした。
補足
Visual Studio 2019
.NET Framework 4.7.2
Newtonsoft.Json 12.0.2
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2024/02/10 08:35