6

SqlDependency オブジェクトに通知を送信しようとしていますが、これまでのところ動作させることができません。

私が送信しているSQLクエリは次のとおりです。

SELECT [SocialMedia].[dbo].[Items].[Id]
  FROM [SocialMedia].[dbo].[Items]

私は、完全修飾名を持ち、変数名のみを持ち、その間のすべてを持ち、中かっこの有無にかかわらずそれを試しました。

Id は、 Creating a Query for Notification の記事Guidで、それらが SqlDependency オブジェクトで機能しないという言及を見なかったタイプです。

また、複数の列を送信して、それが機能するかどうかを確認しました。

  SELECT SocialMedia.dbo.Items.Id, 
         SocialMedia.dbo.Items.DateTimeCreated, 
         SocialMedia.dbo.Items.AuthorId
  FROM   SocialMedia.dbo.Items

そして、それもうまくいきませんでした。


これが私のテーブルSQLです:

USE [SocialMedia]

SET ANSI_NULLS ON
SET QUOTED_IDENTIFIER ON
SET ANSI_PADDING ON

CREATE TABLE [dbo].[Items](
    [Id] [uniqueidentifier] NOT NULL,
    [DateTimeCreated] [datetimeoffset](7) NOT NULL,
    [AuthorId] [uniqueidentifier] NOT NULL,
    [Source] [varchar](max) NOT NULL,
    [PlaceId] [uniqueidentifier] NULL,
    [FullText] [varchar](max) NOT NULL,
    [Geography] [geography] NULL,
    [DateTimeAdded] [datetime] NULL,
 CONSTRAINT [PK_Items] PRIMARY KEY CLUSTERED ( [Id] ASC ) 
                 WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, 
                 IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, 
                 ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

GO

ALTER TABLE [dbo].[Items]  WITH CHECK ADD  CONSTRAINT [FK_Items_Places] 
FOREIGN KEY([PlaceId]) REFERENCES [dbo].[Places] ([Id])

ALTER TABLE [dbo].[Items] CHECK CONSTRAINT [FK_Items_Places]

GO
ALTER TABLE [dbo].[Items]  WITH CHECK ADD  CONSTRAINT [FK_Items_Users] 
FOREIGN KEY([AuthorId]) REFERENCES [dbo].[Users] ([Id])

ALTER TABLE [dbo].[Items] CHECK CONSTRAINT [FK_Items_Users]

そして私のDB:

USE [master]
GO

CREATE DATABASE [SocialMedia]
 CONTAINMENT = NONE
 ON  PRIMARY 
 ( NAME = N'SocialMedia', 
   FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL11.DENALI\MSSQL\DATA\SocialMedia.mdf' , 
    SIZE = 1110016KB , MAXSIZE = UNLIMITED, FILEGROWTH = 1024KB )
 LOG ON 
( NAME = N'SocialMedia_log', 
  FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL11.DENALI\MSSQL\DATA\SocialMedia_log.ldf' , 
  SIZE = 123648KB , MAXSIZE = 2048GB , FILEGROWTH = 10%)
GO

ALTER DATABASE [SocialMedia] SET COMPATIBILITY_LEVEL = 110
GO

IF (1 = FULLTEXTSERVICEPROPERTY('IsFullTextInstalled')) BEGIN
  EXEC [SocialMedia].[dbo].[sp_fulltext_database] @action = 'enable'
END
GO

ALTER DATABASE [SocialMedia] SET ANSI_NULL_DEFAULT OFF 
ALTER DATABASE [SocialMedia] SET ANSI_NULLS ON 
ALTER DATABASE [SocialMedia] SET ANSI_PADDING ON 
ALTER DATABASE [SocialMedia] SET ANSI_WARNINGS ON 
ALTER DATABASE [SocialMedia] SET ARITHABORT ON 
ALTER DATABASE [SocialMedia] SET AUTO_CLOSE OFF 
ALTER DATABASE [SocialMedia] SET AUTO_CREATE_STATISTICS ON 
ALTER DATABASE [SocialMedia] SET AUTO_SHRINK OFF 
ALTER DATABASE [SocialMedia] SET AUTO_UPDATE_STATISTICS ON 
ALTER DATABASE [SocialMedia] SET CURSOR_CLOSE_ON_COMMIT OFF 
ALTER DATABASE [SocialMedia] SET CURSOR_DEFAULT  GLOBAL 
ALTER DATABASE [SocialMedia] SET CONCAT_NULL_YIELDS_NULL ON 
ALTER DATABASE [SocialMedia] SET NUMERIC_ROUNDABORT OFF 
ALTER DATABASE [SocialMedia] SET QUOTED_IDENTIFIER ON 
ALTER DATABASE [SocialMedia] SET RECURSIVE_TRIGGERS OFF 
ALTER DATABASE [SocialMedia] SET  ENABLE_BROKER 
ALTER DATABASE [SocialMedia] SET AUTO_UPDATE_STATISTICS_ASYNC OFF 
ALTER DATABASE [SocialMedia] SET DATE_CORRELATION_OPTIMIZATION OFF 
ALTER DATABASE [SocialMedia] SET TRUSTWORTHY OFF 
ALTER DATABASE [SocialMedia] SET ALLOW_SNAPSHOT_ISOLATION OFF 
ALTER DATABASE [SocialMedia] SET PARAMETERIZATION SIMPLE 
ALTER DATABASE [SocialMedia] SET READ_COMMITTED_SNAPSHOT OFF 
ALTER DATABASE [SocialMedia] SET HONOR_BROKER_PRIORITY OFF 
ALTER DATABASE [SocialMedia] SET RECOVERY FULL 
ALTER DATABASE [SocialMedia] SET  MULTI_USER 
ALTER DATABASE [SocialMedia] SET PAGE_VERIFY CHECKSUM  
ALTER DATABASE [SocialMedia] SET DB_CHAINING OFF 
ALTER DATABASE [SocialMedia] SET FILESTREAM( NON_TRANSACTED_ACCESS = OFF ) 
ALTER DATABASE [SocialMedia] SET TARGET_RECOVERY_TIME = 0 SECONDS 
ALTER DATABASE [SocialMedia] SET  READ_WRITE 

そして、私がそれを実行するために使用しているコード:

string connString = ConfigurationManager.ConnectionStrings["ApplicationServices"].ConnectionString;
conn = new SqlConnection(connString);
conn.Open(); // open new connection and create command to notify about all new Chat-Messages in -ROOM_NUMBER- const
using (var sqlCommand = new SqlCommand(GetSearchQueryString(searchItems), conn))
{
    var sqlDependency = new SqlDependency(sqlCommand
    //handle onChange event - this will be fired whenever there is a change in database that affacts our query
    sqlDependency.OnChange += (sender, e) =>
    {
        //change detected - get all messages...
        try
        {

            var sql = GetSearchQueryString(searchItems);
            int count = _entities.ExecuteStoreQuery<Guid>(sql).Count();

            AsyncManager.Parameters["count"] = count;
        }
        finally
        {
            AsyncManager.OutstandingOperations.Decrement();
        }
    };
    sqlCommand.ExecuteNonQuery();
}

SqlDependency.Start(ConfigurationManager.ConnectionStrings["ApplicationServices"].ConnectionString);プログラムの早い段階で呼び出しています。

何か不足していますか?明らかな何かが欠けているように感じます...

4

5 に答える 5

11

SqlDependency は非常に脆弱であることがわかりました。無効なことをすると、すぐに通知が届くことがあります。エラー メッセージはありません。

クエリからデータベース名の修飾を削除してみてください。次のようにテーブルを参照します。dbo.Items

于 2012-04-18T23:45:06.037 に答える
2

3つのパーツ名を使用しているようです。

[SocialMedia].[dbo].[Items].[Id]

ドキュメントには、2つのパーツ名を使用する必要があることが明確に記載されているため、次のように変更します。

[SocialMedia].[Items].[Id]

于 2012-07-18T14:44:12.453 に答える
2

http://dimarzionist.wordpress.com/2009/04/01/how-to-make-sql-server-notifications-work/に記載されている手順に従いました。

于 2012-04-19T13:49:46.137 に答える
1

Michael の回答は優れた情報源ですが、Microsoft が言及を省略したことが 1 つあります。

SQL Brokerは、計算列を持つテーブルに対する SELECT ステートメントを拒否します

試してみると、info=Query、type=Subscribe の SqlNotificationEventArgs が返されます。私のように、原因が計算列である場合、ステートメントの何が問題なのかを突き止めるのに何時間も費やすことになります。

于 2012-08-30T11:12:27.993 に答える