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

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

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

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

非同期処理

非同期処理とは一部のコードを別々のスレッドで実行させる手法です。アプリケーションのパフォーマンスを向上させる目的でこの手法を用います。

DB2

DB2(IBM Database2)は、IBMのリレーショナルデータベース管理システム製品です。 UNIXとWindows、IBM社のメインフレームOS用が用意されており、 幅広いプラットフォームに対応しています。

ADO.NET

ADO.NETは.NET Frameworkで各種データベースへの統一された接続機能を提供するソフトウェアコンポーネントの集合です。

Q&A

解決済

1回答

1689閲覧

IBM.Data.DB2 とTaskを利用して非同期のSQLの実行を行うには

boyon

総合スコア40

C#

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

非同期処理

非同期処理とは一部のコードを別々のスレッドで実行させる手法です。アプリケーションのパフォーマンスを向上させる目的でこの手法を用います。

DB2

DB2(IBM Database2)は、IBMのリレーショナルデータベース管理システム製品です。 UNIXとWindows、IBM社のメインフレームOS用が用意されており、 幅広いプラットフォームに対応しています。

ADO.NET

ADO.NETは.NET Frameworkで各種データベースへの統一された接続機能を提供するソフトウェアコンポーネントの集合です。

0グッド

0クリップ

投稿2020/07/24 16:58

編集2020/07/25 02:37

C# と IBM Data Server Provider for .NET を利用してちょっとしたプログラムを書いています。
※私はc#自体が不慣れです。
やりたいのは SQLを非同期で実行し、途中でキャンセルできるようなロジックです。
Task/async/await について調べてサンプルを真似しながら作ったのですが、非同期になりませんでした。

ExecuteReaderAsyncを実行することは可能ですが戻りの型が DB2DataReaderではなくSystem.Data.Common.DbDataReader でした。
DbDataReaderをDB2DataReaderにcastすると、以降の処理では正しく動きますが、非同期ではなく通常の同期処理でした。

var cmd = con.CreateCommand() var reader = await cmd.ExecuteReaderAsync(); //戻りはDbDataReader

どうもExecuteReaderAsync というメソッドがサポートされていないようです。
Db2のオンラインマニュアルにも記載がありませんでした。
https://www.ibm.com/support/knowledgecenter/ja/SSEPGG_11.5.0/com.ibm.swg.im.dbclient.adonet.ref.doc/doc/DB2CommandClass.html

Db2のオンラインマニュアルにはThreadによる実行のキャンセルのサンプルが記載されていました。
これはTask/async/awaitを利用して非同期処理を組めないということなんでしょうか?
もしくはExecuteReaderを実行するメソッドに何らかのロジックを組めば非同期を実現できるのでしょうか?

Visual Studio 2019 / .Net 4.7.2 を利用しています。

DB2Connection con; DB2DataReader reader = null; private async void ButtonSelectAsync_Click(object sender, EventArgs e) { using (var cmd = con.CreateCommand()) { cmd.CommandText = "SELECT文(省略)"; try { reader = await DB2ExecuteReaderAsync(cmd); DataReaderを参照し画面に出す処理をここに書く(); } catch (Exception ex) { MessageBox.Show(ex.Message); } } } private static async Task<DB2DataReader> DB2ExecuteReaderAsync(DB2Command cmd) { try { //非同期でSQLを実行 DB2DataReader readerAsync = null; readerAsync = (DB2DataReader)await cmd.ExecuteReaderAsync; return readerAsync; } catch (Exception ex) { MessageBox.Show(ex.Message); return null; } }

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2020/07/24 22:39 編集

目的はなんなのですか? (1) SQLを非同期で実行し、途中でキャンセル可にしたい (2) Task/async/await を使いたい 前者だけなら質問者さんが見つけたサンプルを使えばすむのではないですか? 両方なら、見つけたサンプルを提示するなどして、それを (2) で実現するにはどうするかという質問にできませんか?
boyon

2020/07/25 02:17 編集

1と2の両者です。Threadを利用するよりTaskのほうが書きやすいということなのでTaskで記述したいと考えています。 サンプルのリンクを探したのですが、なぜかみつかりません。 しかし、少し進展があり、非同期で実行することができました。 あとで、追記しておきます。
hihijiji

2020/07/25 02:07

コードは部分じゃなく現象が再現する最低限のコードを書いてください。 なんとなくですが var reader = await cmd.ExecuteReaderAsync(); で待機した後に cmd.Cancel(); している気がします。
boyon

2020/07/25 02:39

当時のコードを追加しました。 昨晩、ここに問い合わせたあとに修正してしまいましたので思い出しながら戻しました。 正確ではないかもしれません。
guest

回答1

0

自己解決

下記のように書いたら非同期で実行してくれました。

await Task.Run(() => { reader = cmd.ExecuteReader(); } );

投稿2020/07/25 02:20

boyon

総合スコア40

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問