步驟一:
sql數據庫必須開啟ServiceBroker服務,首先檢測是否已經啟用ServiceBroker,檢測方法:
Select DATABASEpRoPERTYEX('數據庫名稱','IsBrokerEnabled')
--1表示已經啟用0表示沒有啟用
步驟二:
如果ServiceBroker沒有啟用,使用下面語句啟用:
ALTER DATABASE <數據庫名稱> SET ENABLE_BROKER;
步驟三:
在實現基於服務的SQL數據緩存依賴程序中,需要顯式調用SqlDependency.Start來啟動接受依賴項更改通知的偵聽器。
SqlDependency.Start(connectionString);//程序開始時調用一次
SqlDependency.Stop(connectionString);//程序退出是調用一次
步驟四:
private void buttonCache_Click(object sender, EventArgs e)
{
ObjectCache cache = MemoryCache.Default;
Server s = (Server)cache["OneServer"];
if (s == null)
{
string sql = string.Format("select [ID],[IP],[Port],[Name] from [dbo].[Server] where [ID]={0}", int.Parse(textBoxID.Text));
CacheItemPolicy policy = new CacheItemPolicy();
SqlDependency.Start(conStr);
using (SqlConnection dbc = new SqlConnection(conStr))
{
using (SqlCommand cmd = new SqlCommand(sql, dbc))
{
cmd.Notification = null;
SqlDependency dep = new SqlDependency();
dep.AddCommandDependency(cmd);
dbc.Open();
SqlDataReader reader = cmd.ExecuteReader();
if (reader.Read())
{
s = new Server()
{
ID = Convert.ToInt32(reader["ID"]),
IP = (string)reader["IP"],
Port = Convert.ToInt32(reader["Port"]),
Name = (string)reader["Name"]
};
reader.Close();
}
SqlChangeMonitor monitor = new SqlChangeMonitor(dep);
policy.ChangeMonitors.Add(monitor);
}
}
cache.Add("OneServer", s, policy);
s = (Server)cache["OneServer"];
}
s = (Server)cache["OneServer"];
}
{
ObjectCache cache = MemoryCache.Default;
Server s = (Server)cache["OneServer"];
if (s == null)
{
string sql = string.Format("select [ID],[IP],[Port],[Name] from [dbo].[Server] where [ID]={0}", int.Parse(textBoxID.Text));
CacheItemPolicy policy = new CacheItemPolicy();
SqlDependency.Start(conStr);
using (SqlConnection dbc = new SqlConnection(conStr))
{
using (SqlCommand cmd = new SqlCommand(sql, dbc))
{
cmd.Notification = null;
SqlDependency dep = new SqlDependency();
dep.AddCommandDependency(cmd);
dbc.Open();
SqlDataReader reader = cmd.ExecuteReader();
if (reader.Read())
{
s = new Server()
{
ID = Convert.ToInt32(reader["ID"]),
IP = (string)reader["IP"],
Port = Convert.ToInt32(reader["Port"]),
Name = (string)reader["Name"]
};
reader.Close();
}
SqlChangeMonitor monitor = new SqlChangeMonitor(dep);
policy.ChangeMonitors.Add(monitor);
}
}
cache.Add("OneServer", s, policy);
s = (Server)cache["OneServer"];
}
s = (Server)cache["OneServer"];
}
注意:
使用 SqlDependency 訂閱查詢通知必須向SQL Server Service Broker提供制定規則的查詢語句,一般來講,必須是簡單的sql查詢語句(不能用*,不能用top,不能用函數,包括聚合函數,不能用子查詢,包括where后的子查詢,不能用外連接,自連接,不能用臨時表,不能用變量,不能用視圖,不能垮庫,表名之前必須加類似dbo數據庫所有者這樣的前綴)例如:select * from table1,select column1 from table1,select count(*) from table1 都是錯誤的sql查詢語句,select column1 from dbo.table1 則是正確的語句。