如何为此代码添加多sql依赖?

时间:2014-02-26 17:17:21

标签: c# sql-server mongodb-.net-driver

我在sql server 中有 person 表,其中包含字段ID和名称

和csharp语句运作良好。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Data.SqlClient;

namespace SQLNotifications
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }


        string connectionstring = @"Server=EEPERSIAN-PC\SQLEXPRESS;Database=Chatter;User ID=sa;pwd=1";

        delegate void GridDelegate(DataTable table);

        SqlDependency dep;

        private void Form1_Load(object sender, EventArgs e)
        {
            SqlDependency.Start(connectionstring);

            UpdateGrid();
        }

        private void UpdateGrid()
        {
            string sql = "select Name from dbo.person";

            DataTable dt = new DataTable();

            using (SqlConnection con = new SqlConnection(connectionstring))

            {
                using (SqlCommand cmd = new SqlCommand(sql, con))
                {
                    con.Open();
                    dep = new SqlDependency(cmd);

                    dep.OnChange += dep_OnChange;

                    using (SqlDataReader rdr = cmd.ExecuteReader())
                    {
                        dt.Load(rdr);
                    }
                }
            }

            dataGridView1.Invoke(
                (GridDelegate)delegate(DataTable table)
                {
                    dataGridView1.DataSource = table; 
                }
                , dt);
        }
        private void dep_OnChange(object sender, SqlNotificationEventArgs e)
        {
            MessageBox.Show("Insert Accourd");
            UpdateGrid();
        }

        private void Form1_FormClosed(object sender, FormClosedEventArgs e)
        {
            SqlDependency.Stop(connectionstring);
        }
    }
}

现在,我有2个问题:

1-我无法理解这部分代码

 dataGridView1.Invoke(
                (GridDelegate)delegate(DataTable table)
                {
                    dataGridView1.DataSource = table; 
                }
                , dt);

2-我想要监控多表而不是一个表。 我该怎么做?

请帮我解决这个问题。

1 个答案:

答案 0 :(得分:1)

  1. 委托只是一种不返回任何东西的方法。此代码只是对内联方法的调用。
  2. 这样想:

     MyDelegateFunction(dt);
    
     private void MyDelegateFunction(DataTable table)
     {
        dataGridView1.DataSource = table; 
     }
    

    dt是传递给方法的参数,它被设置为dataGridView

    的数据源

    以下是该方法的MSDN文章。

    2 - 如果通过监视许多表来表示您希望从中查看数据,那么您只需更改用于查询的sql。

    此:

    string sql = "select Name from dbo.person";
    

    可能会改为:

    string sql = "select 
                     name, other, data 
                  from 
                    dbo.person p 
                    inner join dbo.anothertable a on p.personid = a.personid"
    

    编辑:

    经过一番澄清后,您希望在表上设置insert triggers来监控它们。我建议这样的事情:

    1. 发生插入,并触发OnInsert触发器。
    2. 插入触发器将日志记录信息放入日志记录表中。
    3. 您的c#应用程序会轮询该表以获取新信息并执行相应的操作。
    4. Some data changes in the database. How can I trigger some C# code doing some work upon these changes?

      中讨论了类似的一些想法