2012-04-18 1 views
3

Я пытаюсь получить объект SqlDependency, чтобы дать мне уведомления, но до сих пор я не могу заставить его работать.Запрос запроса простого запроса SqlDependency всегда возвращает «Недействительный»

SQL-запрос, который я посылаю это:

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

Я пробовал ж/и без скобок, имеющие полное имя, имея только имя переменной, и все между.

Идентификатор типа Guid, который я не видел ни одного упоминания, что они не работают с объектами SqlDependency в Creating a Query for Notification статье

Я также попытался отправки нескольких столбцов, чтобы увидеть, если это будет работать.

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(); 
} 

I 'm вызывал SqlDependency.Start(ConfigurationManager.ConnectionStrings["ApplicationServices"].ConnectionString); ранее в программе.

Я что-то упустил? Я чувствую, что мне не хватает чего-то очевидного ...

+0

Возможно попробовать не располагая объект SqlCommand? – yamen

+0

Что означает «не работает»? вы можете отправить сообщение об ошибке? – usr

+0

Вы выполнили всю необходимую настройку на стороне сервера? (включение интеграции clr и сервис-брокера, установление разрешений и т. д.) – paul

ответ

8

Я нашел SqlDependency очень хрупким. Иногда, если вы делаете что-то недействительное, вы всегда получаете уведомление немедленно. Нет сообщения об ошибке.

Попробуйте удалить квалификацию имени базы данных из запроса. Справочная таблица так: dbo.Items

+1

usr правильно - имена должны быть 2 части (не 1, 3 или 4). – EBarr

2

Похоже, что вы используете три названия элементов, т.е.

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

В документации четко сказано, что вам нужно использовать два названия деталей, так что изменится

[SocialMedia].[Items].[Id]

1

ответ Майкла является отличным источником, но есть одна вещь, которую Microsoft не упомянул:

SQL Broker отклонит инструкции SELECT в таблице , которая имеет вычисляемый столбец

Если вы попробуете, вы получите SqlNotificationEventArgs с информацией = Запрос, тип = Subscribe, и, как мне вы будете тратить часы, пытаясь выяснить, что случилось с утверждением, когда это вычисленный столбец, который является виновником.

+0

Ург кто-нибудь знает об этом? Я попытался заменить вид, но это тоже не так. – MBulava

0

Выполнить в вашем Sql Server

ALTER DATABASE имя_базы_данных SET ENABLE_BROKER С ROLLBACK IMMEDIATE