質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

ASP.NET MVC Framework

ASP.NET MVC Frameworkは、MVCパターンをベースとした、マイクロソフトのウェブアプリケーション開発用のフレームワークです。

Q&A

解決済

1回答

307閲覧

HttpClient.PostAsyncを使用して、OracleConnectionとOracleTransactionを引数に持つAPIを作成したい

L_ito-

総合スコア1

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

ASP.NET MVC Framework

ASP.NET MVC Frameworkは、MVCパターンをベースとした、マイクロソフトのウェブアプリケーション開発用のフレームワークです。

0グッド

0クリップ

投稿2024/01/29 05:13

実現したいこと

タイトルの通り、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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

シリアライザでシリアライズ、復元できるのは単純な値のみで表現可能なオブジェクトだけで、
DB接続、ネットワーク接続のようなものはそもそもシリアライズ出来ません。

投稿2024/02/07 08:08

編集2024/02/07 08:11
nururi

総合スコア98

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

L_ito-

2024/02/10 08:35

ありがとうございます! 同クラス内にメソッド作成し、APIを使用しないで実装を行うことにしました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問