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();
        }
    }
}