4

マイクロソフトの公式ソースhttp://msdn.microsoft.com/en-us/library/a52dhwx7(v=vs.80).aspxから例をコピーしたところ、困惑しています。アプリケーションを実行すると、そのテーブルを使用しているものがない場合でも、データベースが常にヒットしますか?そのテーブルが実際に変わると、イベントが発生すると思いましたか?私はそれが毎秒一定のDB呼び出しをすることを望まない、それはひどい。

私は何か間違ったことをした?でもわからないと思います。誰もが良い例へのリンクを持っていますが、MSDNではないことが望ましいです。

よろしくお願いします、オナム。

これはSQLです:

return "SELECT [ID],[FromMachine],[FromStore],[FromUser] FROM dbo.Store_Message";

要求に応じて、すべてのコード:

    public partial class Form1 : Form
{
    string connectionString = "server=localhost;database=usicoal;uid=admin;password=";

    public Form1()
    {
        InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        GetNames();
    }

    private bool DoesUserHavePermission()
    {
        try
        {
            SqlClientPermission clientPermission = new SqlClientPermission(PermissionState.Unrestricted);
            clientPermission.Demand();
            return true;
        }
        catch
        {
            return false;
        }
    }

    void dep_OnChange(object sender, SqlNotificationEventArgs e)
    {
        if (this.InvokeRequired)
        {
            this.BeginInvoke(new MethodInvoker(GetNames));
        }
        else
        {
            GetNames();
        }
        SqlDependency dep = sender as SqlDependency;
        dep.OnChange -= new OnChangeEventHandler(dep_OnChange);
    }

    private void GetNames()
    {
        if (!DoesUserHavePermission())
            return;

        SqlDependency.Stop(connectionString);
        SqlDependency.Start(connectionString);

        using (SqlConnection cn = new SqlConnection(connectionString))
        {
            using (SqlCommand cmd = cn.CreateCommand())
            {
                cmd.CommandType = CommandType.Text;
                cmd.CommandText = "SELECT ID FROM dbo.[BTE_SIMPLE_STORE_MESSAGE]";
                cmd.Notification = null;

                SqlDependency dep = new SqlDependency(cmd);
                dep.OnChange += new OnChangeEventHandler(dep_OnChange);

                cn.Open();

                using (SqlDataReader dr = cmd.ExecuteReader())
                {
                    while (dr.Read())
                    {
                    }
                }
            }
        }
    }
}
4

2 に答える 2

1

通常、SqlDependencyは期待どおりに機能します。データベースで何かが変更された場合にイベントを発生させます。クエリに何か問題がある場合、一定の呼び出しが発生します。完全な 2 部構成のテーブル名 (dbo.TableName など) を使用することが重要です。

MSDN のドキュメントはそれほど悪くありません。この最新の記事またはこの1 つのバージョンをご覧ください。

于 2013-01-15T13:58:09.443 に答える
1

上記のコードは、次の場合に問題ないことがわかりました。

  • データベースを右クリックしてプロパティを選択
  • オプションを選択
  • 互換性レベルを SQL Server 2008(100) に設定します
  • わかった

Bang the code は正しく動作します。

于 2013-01-15T15:37:15.473 に答える