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

わんくま同盟

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

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

■102709 / 1階層)  sqldependencyの使用方法
□投稿者/ WebSurfer (2844回)-(2023/12/13(Wed) 10:39:58)
No102703 (初心者 さん) に返信

質問者さん、No102704 に返事をしないので何だかいろいろ不明ですが・・・

> コンソールアプリを作成していますが、

ということなので、とりあえずコンソールアプリで SQL Server のクエリ通知が確認できれ
ば良いということと理解して、動くコードを貼っておきます。

コードは C# ですが、読めなければ C# ⇒ VB.NET 変換サービスを使ってください。

Telerik Code Converter
https://converter.telerik.com/


using System;
using System.Data.SqlClient;

namespace ConsoleAppSqlDependency
{
    internal class Program
    {
        static void Main(string[] args)
        {
            string connstring = @"Data Source=lpc:(local)\sqlexpress;
                                  Initial Catalog=SqlDependency;
                                  Integrated Security=True";

            // SELECT クエリのテーブル名は dbo.Products とすること。
            // Products とか SqlDependency.dbo.Products ではクエリ通知の
            // サブスクリプションに失敗する。
            string query = "SELECT ProductID,Name,UnitPrice,Quantity " +
                           "FROM dbo.Products";

            SqlDependency.Start(connstring);

            using (SqlConnection conn = new SqlConnection(connstring))
            using (SqlCommand cmd = new SqlCommand(query, conn))
            {
                conn.Open();
                SqlDependency dependency = new SqlDependency(cmd);
                dependency.OnChange += Dependency_OnChange;

                using (SqlDataReader rdr = cmd.ExecuteReader())
                {
                    while (rdr.Read())
                    {
                        Console.WriteLine($"{rdr[0]}, {rdr[1]}, " +
                                          $"{rdr[2]}, {rdr[3]}");
                    }
                }
            }

            Console.WriteLine("Press Enter to continue");
            Console.ReadLine();
            SqlDependency.Stop(connstring);
        }

        private static void Dependency_OnChange(object sender,
                                          SqlNotificationEventArgs e)
        {
            Console.WriteLine("result has changed");
            Console.WriteLine("Source " + e.Source);
            Console.WriteLine("Type " + e.Type);
            Console.WriteLine("Info " + e.Info);
        }
    }
}

結果は以下のようになります。Press Enter to continue と表示されたら SMSS などを使っ
て当該テーブルを変更すると SqlDependency.OnChange イベントが発生し、上のコードのハ
ンドラでコンソールに result has changed 以降の行が書き込まれます。


1, Orange, 135.00, 20
9, Banana, 130.00, 15
10, Apple, 330.00, 20
13, Grape, 125.00, 35
Press Enter to continue
result has changed
Source Data
Type Change
Info Update


データベースとテーブルは以下の記事の「(1) サンプルデータベースとテーブルの作成」の
セクションに書いたものです。

SignalR と SqlDependency
http://surferonwww.info/BlogEngine/post/2021/12/26/signalr-and-sqldependency-on-aspnet-web-application.aspx

上の記事にも書きましたが、クエリ通知はサービスブローカを使用するため、データベース
に対して条件がありますので注意してください。


最終的には ASP.NET で使いたいのではないかと想像して、参考になりそうな記事を紹介し
ておきます。

ASP.NET Core で SqlDependency
http://surferonwww.info/BlogEngine/post/2022/01/01/use-of-sqldependency-in-aspnet-core-application.aspx

ASP.NET Core で SQL キャッシュ依存関係
http://surferonwww.info/BlogEngine/post/2022/01/06/sql-cache-dependency-in-aspnet-core-application.aspx

編集キー/

前の記事(元になった記事) 次の記事(この記事の返信)
←sqldependencyの使用方法 /初心者 →Re[2]: sqldependencyの使用方法 /初心者
 
上記関連ツリー

sqldependencyの使用方法 / 初心者 (23/12/12(Tue) 19:05) #102703
Re[1]: sqldependencyの使用方法 / WebSurfer (23/12/12(Tue) 20:56) #102704
Re[1]: sqldependencyの使用方法 / 魔界の仮面弁士 (23/12/12(Tue) 22:38) #102707
│└ Re[2]: sqldependencyの使用方法 / 初心者 (23/12/13(Wed) 12:03) #102711
│  └ Re[3]: sqldependencyの使用方法 / 魔界の仮面弁士 (23/12/13(Wed) 14:34) #102717
sqldependencyの使用方法 / WebSurfer (23/12/13(Wed) 10:39) #102709 ←Now
│└ Re[2]: sqldependencyの使用方法 / 初心者 (23/12/13(Wed) 13:11) #102714
│  └ Re[3]: sqldependencyの使用方法 / WebSurfer (23/12/13(Wed) 13:44) #102715
Re[1]: sqldependencyの使用方法 / WebSurfer (23/12/13(Wed) 11:13) #102710

上記ツリーを一括表示 / 上記ツリーをトピック表示
 
上記の記事へ返信