C# SqlDependency简单选择查询始终返回“0”;“无效”;

C# SqlDependency简单选择查询始终返回“0”;“无效”;,c#,sql,service-broker,sqldependency,C#,Sql,Service Broker,Sqldependency,我试图让SqlDependency对象给我通知,但到目前为止,我无法让它工作 我发送的sql查询如下: SELECT [SocialMedia].[dbo].[Items].[Id] FROM [SocialMedia].[dbo].[Items] 我已经试过了,没有大括号,有完全限定名,只有变量名,以及中间的所有内容 Id的类型为Guid,我在文章中没有提到它们不适用于SqlDependency对象 我还尝试发送多个专栏,看看这是否可行 SELECT SocialMedia.dbo.

我试图让SqlDependency对象给我通知,但到目前为止,我无法让它工作

我发送的sql查询如下:

SELECT [SocialMedia].[dbo].[Items].[Id]
  FROM [SocialMedia].[dbo].[Items]
我已经试过了,没有大括号,有完全限定名,只有变量名,以及中间的所有内容

Id的类型为
Guid
,我在文章中没有提到它们不适用于SqlDependency对象

我还尝试发送多个专栏,看看这是否可行

  SELECT SocialMedia.dbo.Items.Id, 
         SocialMedia.dbo.Items.DateTimeCreated, 
         SocialMedia.dbo.Items.AuthorId
  FROM   SocialMedia.dbo.Items
这也没用


这是我的SQL表: 和我的数据库: 我用来运行它的代码是:
string connString=ConfigurationManager.ConnectionStrings[“ApplicationServices”]。ConnectionString;
conn=新的SqlConnection(connString);
连接打开();//打开新连接并创建命令,以通知-ROOM_NUMBER-const中的所有新聊天信息
使用(var sqlCommand=newsqlcommand(GetSearchQueryString(searchItems),conn))
{
var sqlDependency=新的sqlDependency(sqlCommand
//handle onChange事件-每当数据库中发生影响查询的更改时,就会触发此事件
sqlDependency.OnChange+=(发送方,e)=>
{
//检测到更改-获取所有消息。。。
尝试
{
var sql=GetSearchQueryString(searchItems);
int count=_entities.ExecuteStoreQuery(sql).count();
AsyncManager.Parameters[“count”]=count;
}
最后
{
AsyncManager.OutstandingOperations.Decrement();
}
};
sqlCommand.ExecuteNonQuery();
}
我正在调用程序前面的
SqlDependency.Start(ConfigurationManager.ConnectionString[“ApplicationServices”].ConnectionString);


我遗漏了什么吗?我觉得我遗漏了一些明显的东西…

我发现SqlDependency非常脆弱。有时,如果你做了一些无效的事情,你总是会立即收到通知。没有错误消息


尝试从查询中删除数据库名称限定符。如下所示引用表:
dbo.Items

我们按照中描述的步骤操作,看起来您使用的是三部分名称,即

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

文档清楚地说明了您需要使用两个部件名称,因此更改为


[SocialMedia].[Items].[Id]

迈克尔的答案是一个很好的来源,但有一点微软没有提到:

SQL代理将拒绝具有 计算列


如果您尝试,您将得到一个info=Query、type=Subscribe的SqlNotificationEventArgs,并且像我一样,您将花费数小时试图找出该语句的错误,而计算列才是罪魁祸首。

在SQl Server中执行

ALTER DATABASE YOURDBNAME SET启用即时回滚的_代理


可能尝试不处理SqlCommand对象?什么是“不工作”意思?您可以发布错误吗?您是否在服务器端完成了所有必要的设置?(启用clr集成和service broker,设置权限等)@usr-不工作意味着我得到了一个即时响应,EventArgs的状态成员变量设置为“无效”。:/没有错误消息,没有任何内容。我一步一步地浏览了文档,并确定了我没有完成的步骤,但现在它工作了!感谢指南:)有人知道这方面的工作吗?我尝试用视图替换,但也不行。
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]
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();
}