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

Я пытался реализовать простую 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));
       }
}

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

<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>

Вы заметите, что тип = подписка и информация = недействительно. Это то, что меня удивляет. В соответствии с http://www.simple -talk.com / sql / t-sql-программирование / использование-и-мониторинга-sql-2005-запрос-уведомление / и http://msdn.microsoft.com/en-us/library/ms189308.aspx, что происходит, когда "The отправленная команда содержала оператор, который не поддерживает уведомления (например, INSERT или UPDATE) ", где, как и просто, это простой оператор выбора, который соответствует условиям, указанным для создания SqlDependency

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

1 Ответ

0 голосов
/ 27 декабря 2011

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

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

...