Я пытался реализовать простой 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><qn:QueryNotification xmlns:qn="http://schemas.microsoft.com/SQL/Notifications/QueryNotification" id="0" type="subscribe" source="statement" info="invalid" database_id="0" sid="0x2EB2AC37F2E7FF468D5DE0B591029EE7"><qn:Message>26119019-fef7-47ee-ac82-3cb56313670d;9fbb5459-bde4-494b-9b7d-8347be2ee4cb</qn:Message></qn:QueryNotification></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
Итак, что мне здесь не хватает? Это самый простой сценарий и он не работает!