C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[4]: DBのデータ変化を通知


(過去ログ 135 を表示中)

[トピック内 12 記事 (1 - 12 表示)]  << 0 >>

■79737 / inTopicNo.1)  DBのデータ変化を通知
  
□投稿者/ 排他処理は苦手 (1回)-(2016/05/10(Tue) 23:06:25)

分類:[C#] 

MSのSQLServer(2008R2)のDBの中のデータを更新した際に(削除、挿入、更新等)
C#(.Net4.0)フォーム側で変化したテーブル名とテーブルデータを取得したいと考えています。

定期的にテーブルの更新フラグやカウンタをDBのどこかで参照する方法を考えたのですが、
短時間に何度もDBにクエリを送るのは負担が大きいと思うのでこの方法は避けたいです。

他に方法はあるでしょうか。
引用返信 編集キー/
■79739 / inTopicNo.2)  Re[1]: DBのデータ変化を通知
□投稿者/ ぶなっぷ (82回)-(2016/05/11(Wed) 10:00:00)
DB内のテーブルそのものの更新ではなく、
System.Data.DataTableに読み込んでおいて、
System.Data.DataTableの更新イベントを受け取ることなら
簡単にできます。

System.Data.DataTable.TableNewRow イベント
System.Data.DataTable.RowDeleted イベント
System.Data.DataTable.RowChanged イベント

引用返信 編集キー/
■79740 / inTopicNo.3)  Re[1]: DBのデータ変化を通知
□投稿者/ kiku (98回)-(2016/05/11(Wed) 10:25:27)
リアルタイムに更新されるDBの状態を、
アプリからDBに定期的な問い合わせをすることなく、
把握することは矛盾していると思います。

素直にアプリからDBに定期的に問い合わせた方が
良いのではないかと思いました。

まだ掲示板に書かれていない条件などありそうですが。。。
引用返信 編集キー/
■79741 / inTopicNo.4)  Re[1]: DBのデータ変化を通知
□投稿者/ WebSurfer (912回)-(2016/05/11(Wed) 10:54:12)
No79737 (排他処理は苦手 さん) に返信

> MSのSQLServer(2008R2)のDBの中のデータを更新した際に(削除、挿入、更新等)
> C#(.Net4.0)フォーム側で変化したテーブル名とテーブルデータを取得したいと考えています。

ASP.NET のキャッシュの機能として SQL キャッシュ依存関係というものがありますが、
それを設定する時に SQL Server に作られるテーブルとストアドプロシージャを利用す
るという方法はいかがですか?

SQL キャッシュ依存関係とは、ASP.NET のキャッシュと SQL Server DB のテーブルや
レコードとの間に依存関係を持たせ、当該テーブル/レコードが変更されたら ASP.NET
のキャッシュを削除し、次のリクエストでは新しいデータを DB から取得してユーザー
に提供するとともに、新しいデータをキャッシュできるようにするための機能です。

詳しくは以下の記事を見てください。

SQL キャッシュ依存関係
http://surferonwww.info/BlogEngine/post/2011/03/28/SQL-Cache-Dependency.aspx

上の記事に書きましたが、SQL キャッシュ依存関係で DB の変更の有無を知るために
以下の 2 つの方法があります。

(1) テーブルポーリング (table polling)
(2) クエリ通知 (query notification)

Windows Froms アプリでは未検証・未確認ですが、(1) の方なら Windows Forms アプリ
にポーリング機能を実装して、上の記事に書いてある SqlCachePollingStoredProcedure
を定期的に呼び出せばよさそうな気がします。


> 短時間に何度もDBにクエリを送るのは負担が大きいと思うのでこの方法は避けたいです。

その心配は確かにありますが、もともとポーリングに使うように考えられているので、負
担はほとんどないそうです。もっとも、ポーリング間隔によるのでしょうが・・・

検討してみてください。

引用返信 編集キー/
■79742 / inTopicNo.5)  Re[1]: DBのデータ変化を通知
□投稿者/ とくま (9回)-(2016/05/11(Wed) 11:22:32)
No79737 (排他処理は苦手 さん) に返信
私が設計するとしたら、
(1)更新情報を溜めておく新規テーブルを作成
(2)各テーブルに CREATE TRIGGER しておいて、更新のたびに更新情報を上記テーブルに格納
(3)クライアントからは定期的に上記テーブルにアクセス
といったものをまず考えますかねぇ。
引用返信 編集キー/
■79743 / inTopicNo.6)  Re[1]: DBのデータ変化を通知
□投稿者/ WebSurfer (913回)-(2016/05/11(Wed) 11:24:13)
【追伸】

No79737 (排他処理は苦手 さん) に返信

どういう目的で「フォーム側で変化したテーブル名とテーブルデータを取得」して、
その後何をするのかわかりませんが、もし楽観的同時実行制御に利用しようと考えて
いるなら、別の手段を取ることを考えた方がよさそうです。

引用返信 編集キー/
■79750 / inTopicNo.7)  Re[2]: DBのデータ変化を通知
□投稿者/ 排他処理は苦手 (2回)-(2016/05/12(Thu) 00:01:57)
回答ありがとうございます。

私の方も調べておりまして、
クエリ通知の類になると思うのですが、System.Data.SqlClient.SqlDependencyというものを
試していました。

こちらですと、DBの中のデータを更新した際にイベントが発生するらしいのですが、
今のところ通知イベントの発生を発見できておりません。

2008R2ではこの方法は使えないのでしょうか。
引用返信 編集キー/
■79751 / inTopicNo.8)  Re[3]: DBのデータ変化を通知
□投稿者/ 排他処理は苦手 (3回)-(2016/05/12(Thu) 00:02:02)
No79750 (排他処理は苦手 さん) に返信
> 回答ありがとうございます。
>
> 私の方も調べておりまして、
> クエリ通知の類になると思うのですが、System.Data.SqlClient.SqlDependencyというものを
> 試していました。
>
> こちらですと、DBの中のデータを更新した際にイベントが発生するらしいのですが、
> 今のところ通知イベントの発生を発見できておりません。
>
> 2008R2ではこの方法は使えないのでしょうか。
引用返信 編集キー/
■79752 / inTopicNo.9)  Re[4]: DBのデータ変化を通知
□投稿者/ kaina (8回)-(2016/05/12(Thu) 10:18:21)
SQL Server 2008以降よりデータ変更の追跡機能が追加されています。
その昨日を利用してみてはいかがでしょうか?
データ変更を追跡して、変更されたデータにのみアプリケーションからクエリを実行できるらしいです。
専用のストアドや関数等も用意されているようです。

https://msdn.microsoft.com/ja-jp/library/bb933994%28v=sql.105%29.aspx

私自身は、これらの技術を実際に使用した経験があるわけではありませんので、
紹介のみになってしまい、申し訳ありません。
引用返信 編集キー/
■79753 / inTopicNo.10)  Re[3]: DBのデータ変化を通知
□投稿者/ WebSurfer (914回)-(2016/05/12(Thu) 10:37:05)
No79750 (排他処理は苦手 さん) に返信

> クエリ通知の類になると思うのですが、System.Data.SqlClient.SqlDependencyというものを
> 試していました。

DB への定期的な問合せ(ポーリング)を kiku さん、とくまさん、私から提案しています
がそれは検討していただけたのでしょうか?

ポーリングでは質問者さんの目的に合わないのか、もしくはポーリングも選択肢の一つだが
他の方法も平行して模索中でクエリ通知を調べているのか、そのあたりを書いていただけれ
ばと思うのですが。(平たく言えば、質問に対するレスをもらっているのだがら、まずそれ
に答えていただくのが先では?・・・という意味です)

引用返信 編集キー/
■79754 / inTopicNo.11)  Re[3]: DBのデータ変化を通知
□投稿者/ みい (51回)-(2016/05/12(Thu) 11:02:28)
No79750 (排他処理は苦手 さん) に返信
> 回答ありがとうございます。
>
> 私の方も調べておりまして、
> クエリ通知の類になると思うのですが、System.Data.SqlClient.SqlDependencyというものを
> 試していました。
>
> こちらですと、DBの中のデータを更新した際にイベントが発生するらしいのですが、
> 今のところ通知イベントの発生を発見できておりません。
>
> 2008R2ではこの方法は使えないのでしょうか。
クエリ通知(System.Data.SqlClient.SqlDependency)は使用制限が厳しいようですが、
使用しているクエリはその条件をクリアしていますか。

https://msdn.microsoft.com/ja-jp/library/aewzkxxh(v=vs.80).aspx
引用返信 編集キー/
■79757 / inTopicNo.12)  Re[4]: DBのデータ変化を通知
□投稿者/ 排他処理は苦手 (4回)-(2016/05/12(Thu) 13:32:24)

>クエリ通知(System.Data.SqlClient.SqlDependency)は使用制限が厳しいようですが
Set使えないのですか。
これは厳しいですね。

>SQL Server 2008以降よりデータ変更の追跡機能が追加されています。
これはよさそうですね。
調べてみます。

>それは検討していただけたのでしょうか?
返答が遅れてすみません。

ポーリングのほうも並列に調べています。もし通知の方がうまくいかなければ
そちらの方も検討しています。

引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -