SqlCacheDependency не работает при использовании SqlCommand для ключа кеша

Этот код работает нормально, он делает недействительными данные всякий раз, когда они изменяются в базе данных:

    AggregateCacheDependency aggDep = new AggregateCacheDependency();

                System.Data.SqlClient.SqlCommand ocom = new System.Data.SqlClient.SqlCommand();
                SqlCacheDependency SqlDep = new SqlCacheDependency("DBNAMEINCONFIG", "Products");    
                aggDep.Add(SqlDep);

У меня не может быть прямой аннулирования всей таблицы "Продукты", но мне нужно иметь возможность сделать недействительной выборку в таблице. Проблема, с которой я столкнулся, заключается в том, что следующий код не делает кэш-память недействительной при изменении данных:

AggregateCacheDependency aggDep = new AggregateCacheDependency();

            System.Data.SqlClient.SqlCommand ocom = new System.Data.SqlClient.SqlCommand();
            ocom.CommandText = "SELECT ID,ClinicID,Price,Enabled FROM dbo.Products WHERE ClinicID = 1";
            ocom.Connection = new System.Data.SqlClient.SqlConnection(ConfigurationManager.ConnectionStrings["DBSTRING"].ToString());
            SqlCacheDependency SqlDep = new SqlCacheDependency(ocom);

            aggDep.Add(SqlDep);

Я пытался включить всю информацию, необходимую для анализа этого, но, пожалуйста, дайте мне знать, если я должен включить больше!

2 ответа

Проблема, согласно правилам, изложенным здесь, что вы не можете использовать SELECT * для запроса.

Следующее изменение должно решить вашу проблему:

ocom.CommandText = "SELECT ClinicID FROM Products WHERE ClinicID = 1";

Как указывает компетентный_технологий, существует довольно много правил для запросов, используемых для построения SqlCacheDependency, Согласно этой статье MSDN наиболее важными являются:

  1. Не используйте SELECT * или table_name.* В своих запросах.
  2. Вы должны использовать полные имена таблиц (например, dbo.Products).

Помимо этих правил важно выполнить SqlCommand используется для создания SqlCacheDependency чтобы включить уведомление о запросе:

using (SqlDataReader reader = ocom.ExecuteReader())
{
  while (reader.Read())
  {           
  }
} 

SqlCacheDependency SqlDep = new SqlCacheDependency(ocom);

aggDep.Add(SqlDep);

Надеюсь это поможет.

Другие вопросы по тегам