C# 创建多个SqlDependencies
我想使用C# 创建多个SqlDependencies,c#,sqldependency,C#,Sqldependency,我想使用SqlDependency监视多个表的更改。它适用于单个对象,但在创建多个对象时,它仅适用于表单加载中调用的最后一个对象 我正在用这个 我还发现,AggregateCacheDependency可以对一个项目具有多个依赖项,但它用于ASP.net 我的Windows窗体代码 m_Data = new ChatterData.ChatData(); 在窗体上加载: // Hook up event m_Data.OnNewMessage += new ChatterData.ChatDa
SqlDependency
监视多个表的更改。它适用于单个对象,但在创建多个对象时,它仅适用于表单加载中调用的最后一个对象
我正在用这个
我还发现,AggregateCacheDependency
可以对一个项目具有多个依赖项,但它用于ASP.net
我的Windows窗体代码
m_Data = new ChatterData.ChatData();
在窗体上加载:
// Hook up event
m_Data.OnNewMessage += new ChatterData.ChatData.NewMessage(OnNewMessage);
// Load existing message
LoadMessages();
类数据
{
公共委托void NewMessage();
公共事件新消息和新消息;
公共Int32 intGroupID;
///
///建造师
///
公共数据()
{
//停止此连接字符串上的现有服务
//只是确定一下
SqlDependency.Stop(m_ConnectionString);
//启动依赖项
//用户必须具有“订阅查询通知”权限
//数据库还必须启用SSB
//ALTER DATABASE Chatter SET ENABLE_BROKER
Start(m_ConnectionString);
//创建连接
m_sqlConn=新的SqlConnection(m_ConnectionString);
}
///
///析构函数
///
~ChatData()
{
//退出之前停止依赖项
SqlDependency.Stop(m_ConnectionString);
}
///
///从数据库检索消息
///
///
公共数据表GetMessages()
{
DataTable dt=新的DataTable();
尝试
{
//创建命令
//命令必须为表使用两个部件名
//从dbo.Table中选择,而不是从
//从表中选择
//查询也不能使用*,必须指定字段
//SqlCommand cmd=newsqlcommand(“usp_GetMessages”,m_sqlConn);
SqlCommand cmd=newsqlcommand(“[usp_PendingKOTlist]”,m_sqlConn);
cmd.CommandType=CommandType.storedProcess;
cmd.Parameters.AddWithValue(“@IntKitChengGroupId”,intGroupID);
//清除任何现有通知
cmd.Notification=null;
//创建此命令的依赖项
SqlDependency=新的SqlDependency(cmd);
//添加事件处理程序
dependency.OnChange+=新的OnChangeEventHandler(OnChange);
//如有必要,打开连接
if(m_sqlConn.State==ConnectionState.Closed)
m_sqlConn.Open();
//获取消息
dt.Load(cmd.ExecuteReader(CommandBehavior.CloseConnection));
}
捕获(例外情况除外)
{
掷骰子;
}
返回dt;
}
///
///SqlDependency OnChange事件的处理程序
///
///
///
void OnChange(对象发送方,SqlNotificationEventArgs e)
{
SqlDependency=发送方作为SqlDependency;
//通知只是一次性交易
//因此,删除现有的一个,以创建新的
//可以添加一个
dependency.OnChange-=OnChange;
//解雇事件
如果(OnNewMessage!=null)
{
OnNewMessage();
}
}
}
为SQL依赖项创建多个类文件和对象有问题吗?我们都应该读一下codeproject的文章吗?请阅读并回答您的问题。请告诉我如何在C#windows应用程序中创建多个SQL依赖项对象。您是尝试为单个连接注册多个SqlDependency
,还是有多个连接?另外,您是否正在为具有多个连接字符串的单个数据库创建多个ChatData
对象
private void LoadMessages()
{
DataTable dt = m_Data.GetMessages();
dgvName.DataSource = dt ;
}
class ChatData
{
public delegate void NewMessage();
public event NewMessage OnNewMessage;
public Int32 intGroupID;
/// <summary>
/// Constructor
/// </summary>
public ChatData()
{
// Stop an existing services on this connection string
// just be sure
SqlDependency.Stop(m_ConnectionString);
// Start the dependency
// User must have SUBSCRIBE QUERY NOTIFICATIONS permission
// Database must also have SSB enabled
// ALTER DATABASE Chatter SET ENABLE_BROKER
SqlDependency.Start(m_ConnectionString);
// Create the connection
m_sqlConn = new SqlConnection(m_ConnectionString);
}
/// <summary>
/// Destructor
/// </summary>
~ChatData()
{
// Stop the dependency before exiting
SqlDependency.Stop(m_ConnectionString);
}
/// <summary>
/// Retreive messages from database
/// </summary>
/// <returns></returns>
public DataTable GetMessages()
{
DataTable dt = new DataTable();
try
{
// Create command
// Command must use two part names for tables
// SELECT <field> FROM dbo.Table rather than
// SELECT <field> FROM Table
// Query also can not use *, fields must be designated
//SqlCommand cmd = new SqlCommand("usp_GetMessages", m_sqlConn);
SqlCommand cmd = new SqlCommand("[usp_PendingKOTlist]", m_sqlConn);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("@intKitchenGroupId", intGroupID);
// Clear any existing notifications
cmd.Notification = null;
// Create the dependency for this command
SqlDependency dependency = new SqlDependency(cmd);
// Add the event handler
dependency.OnChange += new OnChangeEventHandler(OnChange);
// Open the connection if necessary
if(m_sqlConn.State == ConnectionState.Closed)
m_sqlConn.Open();
// Get the messages
dt.Load(cmd.ExecuteReader(CommandBehavior.CloseConnection));
}
catch (Exception ex)
{
throw ex;
}
return dt;
}
/// <summary>
/// Handler for the SqlDependency OnChange event
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
void OnChange(object sender, SqlNotificationEventArgs e)
{
SqlDependency dependency = sender as SqlDependency;
// Notices are only a one shot deal
// so remove the existing one so a new
// one can be added
dependency.OnChange -= OnChange;
// Fire the event
if (OnNewMessage != null)
{
OnNewMessage();
}
}
}