Сервер Sql не создает подписку для простого запроса выбора с использованием SqlCacheDependency

Я пытался реализовать простой SQLCacheDependency для кэширования объектов в моем приложении asp.net.

После долгой поломки головы я, кажется, зашел в тупик и подумал, что взгляд со стороны поможет.

SqlCommand cmd = new SqlCommand("SELECT UserID,FirstName,MiddleName,LastName,Mobile#,EmailID,FriendlyName,Phone#,AboutMe,Scrap#,JobPosting#,Testimonial#,Blog#,Views#,LastVisitedOn,CurrentAddress,City,State,Country,PermanentAddress,HomeTown,Occupation,CurrentEmployer,LanguageSpeak,LanguageWrite,CreatedOn,NeedJob,ProfileRank,Status,CurrentEmployerID,PictureID,ReferredBy,lat,Long,Zoom,Gender,PinCode,PersonalStatus,DOB,PreferredLanguage,EmploymentHistory,AboutFamily,LastSchoolName,HasCertificate,CertificateMonthLength,CertificateDescription,CertificateSchoolUserId,CallTimes,CertificateType,CertificateTypes,Skills FROM mydb.dbo.UserInfo where UserID=10277",con);
System.Web.Caching.SqlCacheDependency dependency = new System.Web.Caching.SqlCacheDependency(cmd);
con.Open();
try
{
       SqlDataReader reader = cmd.ExecuteReader();
       while (reader.Read())
       {
             seUserInfo = new UserInfo(reader, false);
             this.Context.Cache.Add("Sean", seanUserInfo, dependency, System.Web.Caching.Cache.NoAbsoluteExpiration, System.Web.Caching.Cache.NoSlidingExpiration, System.Web.Caching.CacheItemPriority.Normal, new CacheItemRemovedCallback(ItemRemovedCallBack));
       }
}

Но этот элемент удаляется из кеша, как только он добавляется. Теперь, потратив много времени на устранение других возможных причин (установка ANSI NULLS ON и т. д. для базы данных), я столкнулся с проблемой. Из профилировщика SQL Server я вижу, что подписка запускается со следующими текстовыми данными

<qnev:QNEvent xmlns:qnev="http://schemas.microsoft.com/SQL/Notifications/QueryNotificationProfiler">
<qnev:EventText>subscription fired</qnev:EventText>
<qnev:SubscriptionID>0</qnev:SubscriptionID>
<qnev:NotificationMsg>&lt;qn:QueryNotification xmlns:qn="http://schemas.microsoft.com/SQL/Notifications/QueryNotification" id="0" type="subscribe" source="statement" info="invalid" database_id="0" sid="0x2EB2AC37F2E7FF468D5DE0B591029EE7"&gt;&lt;qn:Message&gt;26119019-fef7-47ee-ac82-3cb56313670d;9fbb5459-bde4-494b-9b7d-8347be2ee4cb&lt;/qn:Message&gt;&lt;/qn:QueryNotification&gt;</qnev:NotificationMsg><qnev:BrokerDlg>9B1E5573-A52F-E111-8152-005056C00008</qnev:BrokerDlg></qnev:QNEvent>

Вы заметите, что type=subscribe и info=invalid. Вот что меня удивляет. Согласно http://www.simple-talk.com/sql/t-sql-programming/using-and-monitoring-sql-2005-query-notification/ и http://msdn.microsoft.com/en-us/library/ms189308.aspx, что происходит, когда "Отправленная команда содержит оператор, который не поддерживает уведомления (например, INSERT или UPDATE)», хотя очевидно, что это простой оператор select, который соответствует условия, указанные для создания SqlDependency

Итак, что мне здесь не хватает? Это самый простой сценарий и он не работает!


person shashi    schedule 26.12.2011    source источник


Ответы (1)


Хорошо, я спрашивал об этом и на форумах msdn, и там мне ответили. Моя проблема заключалась в том, что я использовал квалификатор из трех частей mydb.dbo.tablename вместо квалификатора из двух частей dbo.tablename, который является требованием.

http://social.msdn.microsoft.com/Forums/en-US/sqlservicebroker/thread/bc9ca094-a989-4403-82c6-7f608ed462ce

person shashi    schedule 26.12.2011