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

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

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

sqldependencyの使用方法

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

■102703 / inTopicNo.1)  sqldependencyの使用方法
  
□投稿者/ 初心者 (1回)-(2023/12/12(Tue) 19:05:55)

分類:[VB.NET/VB2005 以降] 

Visual stadio 2022+VBを使用して、sqldependencyを使ったアプリの開発をしようとしています。

下記サイトにあるサンプルコードを参考に、コンソールアプリを作成していますが、

「'OnChange'は'SqlDependency'のメンバーではありません。」というエラーがでます。
(Startメソッドも同様のエラー)

https://programmers.high-way.info/vb/sqldependency.html

NuGetパッケージマネジャーからSystem.Data.Sqlclient(4.8.5)のインストールはできているはずなのですが、

何がまずいのでしょうか。
引用返信 編集キー/
■102704 / inTopicNo.2)  Re[1]: sqldependencyの使用方法
□投稿者/ WebSurfer (2843回)-(2023/12/12(Tue) 20:56:19)
No102703 (初心者 さん) に返信

何を作っているか (WinForms? WPF? ASP.NET Web Forms? その他?) と開発環境 (OS, ターゲットフレームワーク) を書きましょう。

SqlDependency というと ASP.NET Web アプリのcキャッシュに使うことを想像しますが、そうなんですか?
引用返信 編集キー/
■102707 / inTopicNo.3)  Re[1]: sqldependencyの使用方法
□投稿者/ 魔界の仮面弁士 (3741回)-(2023/12/12(Tue) 22:38:21)
No102703 (初心者 さん) に返信
> コンソールアプリを作成していますが、
ターゲット フレームワークは .NET Framework 4.8 でしょうか、.NET 8 でしょうか。
あるいはその他のフレームワークでしょうか。

> 「'OnChange'は'SqlDependency'のメンバーではありません。」というエラーがでます。
> (Startメソッドも同様のエラー)
あるはずですね。
https://learn.microsoft.com/ja-jp/dotnet/api/system.data.sqlclient.sqldependency.onchange?WT.mc_id=DT-MVP-8907&view=dotnet-plat-ext-8.0
https://learn.microsoft.com/ja-jp/dotnet/api/system.data.sqlclient.sqldependency.start?WT.mc_id=DT-MVP-8907&view=dotnet-plat-ext-8.0


元のサンプルでは、
SqlDependency クラスのインスタンスを
SqlDependency という同名変数に入れているので、
どちらの指定なのか、エラーメッセージから判別しにくなっています。


変数名を型名と違うものに変更するか、明示的に名前空間を記述してみては如何でしょうか?
たとえば
 Global.System.Data.SqlClient.SqlDependency.Start(connectionString)
とか、
 Private WithEvents dependency As Global.System.Data.SqlClient.SqlDependency
といった具合にです。
引用返信 編集キー/
■102709 / inTopicNo.4)  Re[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

引用返信 編集キー/
■102710 / inTopicNo.5)  Re[1]: sqldependencyの使用方法
□投稿者/ WebSurfer (2845回)-(2023/12/13(Wed) 11:13:37)
No102703 (初心者 さん) に返信

【追伸】

> NuGetパッケージマネジャーからSystem.Data.Sqlclient(4.8.5)のインストールはできているはずなのですが、

ターゲットフレームワークが .NET Framework ならそれは不要です。(.NET Core / .NET
は必要)

Visual Studio 2022 でコンソールアプリを新規作成して、上のサンプルコードをそのまま
コピペすれば動くはずです。

ひょっとして、余計な NuGet パッケージを入れて衝突してるとか、参考にしてる記事のコ
ードは Windows Forms アプリのもののようですがそのあたりが理解されてなくて変なこと
になってるとかはないですか?
引用返信 編集キー/
■102711 / inTopicNo.6)  Re[2]: sqldependencyの使用方法
□投稿者/ 初心者 (3回)-(2023/12/13(Wed) 12:03:42)
No102707 (魔界の仮面弁士 さん) に返信
> ■No102703 (初心者 さん) に返信
>>コンソールアプリを作成していますが、
> ターゲット フレームワークは .NET Framework 4.8 でしょうか、.NET 8 でしょうか。
> あるいはその他のフレームワークでしょうか。

ターゲットフレームワークは.NET8です。

>
> 変数名を型名と違うものに変更するか、明示的に名前空間を記述してみては如何でしょうか?
> たとえば
>  Global.System.Data.SqlClient.SqlDependency.Start(connectionString)
> とか、
>  Private WithEvents dependency As Global.System.Data.SqlClient.SqlDependency
> といった具合にです。

>  Private WithEvents dependency As Global.System.Data.SqlClient.SqlDependency
で明示的に記述したところ、エラーがでなくなりました。

別の箇所になりますが、クエリ通知イベントの登録で「Public Sub New()の引数が多すぎます」
というエラーが出てしまいます。また別の問題なのでしょうか?
Me.sqlDependency = New SqlDependency(sqlCommand)

引用返信 編集キー/
■102714 / inTopicNo.7)  Re[2]: sqldependencyの使用方法
□投稿者/ 初心者 (4回)-(2023/12/13(Wed) 13:11:29)
No102709 (WebSurfer さん) に返信
> ■No102703 (初心者 さん) に返信
>
> 質問者さん、No102704 に返事をしないので何だかいろいろ不明ですが・・・
>
>>コンソールアプリを作成していますが、
>
> ということなので、とりあえずコンソールアプリで SQL Server のクエリ通知が確認できれ
> ば良いということと理解して、動くコードを貼っておきます。

仰られる通り、やりたいこととしてはSQL Server上のリンクテーブルに対してクエリ通知の確認ができればいいです。
(VBである必要はありません)

>ひょっとして、余計な NuGet パッケージを入れて衝突してるとか、参考にしてる記事のコ
>ードは Windows Forms アプリのもののようですがそのあたりが理解されてなくて変なこと
>になってるとかはないですか?

nugetはSystem.Data.Sqlclient(4.8.5)だけをインストールしました。
恥ずかしながら、windowsform/コンソール/wpfなど毎の書き方の違いもよくわかっていません、、

最終的にはWindowsformアプリでクエリ通知をトリガーにイベントドリブン的な動作を実装したいですが、
まずは手持ちのDBでうまく通知が受け取れるのかが確認したいと思っています。
引用返信 編集キー/
■102715 / inTopicNo.8)  Re[3]: sqldependencyの使用方法
□投稿者/ WebSurfer (2846回)-(2023/12/13(Wed) 13:44:49)
No102714 (初心者 さん) に返信

> やりたいこととしてはSQL Server上のリンクテーブルに対してクエリ通知の確認ができればいいです。
> (VBである必要はありません)

それならば、No102709 で紹介したコードをコピペして、接続文字列を質問者さんの環境に合わせて変更して
実行し、コンソールに Press Enter to continue と表示されたら SMSS などを使って当該テーブルを変更す
ると SqlDependency.OnChange イベントが発生し、イベントハンドラでコンソールに result has changed
以降の行が書き出されることで確認できるはずです。

試してみてください。その上で問題がありましたら聞いてもらえれば自分が分かることは回答しますので。

> まずは手持ちのDBでうまく通知が受け取れるのかが確認したいと思っています。

上にも書きましたが、クエリ通知はサービスブローカを使用するため、データベースに対して条件があり
ますので注意してください。
引用返信 編集キー/
■102717 / inTopicNo.9)  Re[3]: sqldependencyの使用方法
□投稿者/ 魔界の仮面弁士 (3742回)-(2023/12/13(Wed) 14:34:06)
No102711 (初心者 さん) に返信
>> Private WithEvents dependency As Global.System.Data.SqlClient.SqlDependency
> で明示的に記述したところ、エラーがでなくなりました。
>
> 別の箇所になりますが、クエリ通知イベントの登録で「Public Sub New()の引数が多すぎます」
> というエラーが出てしまいます。また別の問題なのでしょうか?
> Me.sqlDependency = New SqlDependency(sqlCommand)


= New SqlDependency(sqlCommand) では引数過多エラーとなるのですね。

ということは、
= New Global.System.Data.SqlClient.SqlDependency(sqlCommand)
あるいは
= New System.Data.SqlClient.SqlDependency(sqlCommand)
にすると、エラーが変化しませんか?


予想では、SqlDependency を参照する前の段階で、独自の
 Class SqlDependency
 End Class
が自前の名前空間上に生成されてしまっているものと予想しています。
No102707 で名前空間を明示するように提案したのもそれが理由。

仮に、自作クラスが優先されているとしたら、Start という名のメソッドは
インスタンス メソッドにも共有メソッドにも存在していないことになるので、
SqlDependency.Start が「メンバーではありません。」になるでしょうから。
引用返信 編集キー/

このトピックをツリーで一括表示


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

このトピックに書きこむ