是否可以对SQl依赖进行计数查询?

时间:2015-01-31 17:53:58

标签: asp.net-mvc-4 signalr sqldependency query-notifications

关于SignalR和SQL依赖关系,查询通知是否真的不能使用像count(*)这样的聚合函数?

对于包含聚合函数的创建查询,是否有其他方法或想法?

2 个答案:

答案 0 :(得分:0)

是的,如果你想使用像count(*)之类的聚合函数来查询sql依赖项,我有解决方案。首先在您的存储库中仍然使用select查询。但在阅读器中,您只需计算阅读器执行命令的数据。像这样的东西

int count = 0;
command = new SqlCommand(@"select Edolpuz_DB.dbo.TABEL_KONFIRMASI_PEMBAYARAN.ID_BUKTI_PEMBAYARAN from Edolpuz_DB.dbo.TABEL_KONFIRMASI_PEMBAYARAN where Edolpuz_DB.dbo.TABEL_KONFIRMASI_PEMBAYARAN.IS_NEW = @room", connect);
                command.Parameters.AddWithValue("room", true);
                try
                {
                    command.Notification = null;
                    SqlDependency dependency = new SqlDependency(command);
                    dependency.OnChange += new OnChangeEventHandler(dependency_OnChange);
                    if (connect.State == ConnectionState.Open)
                        connect.Close();
                    connect.Open();
                    reader = command.ExecuteReader();
                    while (reader.Read())
                    {
                        count++;
                    }
                    return count;
                }
                catch { return 0; }
                finally { connect.Close(); }

答案 1 :(得分:0)

小心使用SqlDependency类 - 它有problems内存泄漏。 Hovewer,您可以使用SqlDependency类的开源实现 - SqlDependencyEx。它使用数据库触发器和本机Service Broker通知来接收有关表更改的事件。这是一个用法示例:

int changesReceived = 0;
using (SqlDependencyEx sqlDependency = new SqlDependencyEx(
          TEST_CONNECTION_STRING, TEST_DATABASE_NAME, TEST_TABLE_NAME)) 
{
    sqlDependency.TableChanged += (o, e) => changesReceived++;
    sqlDependency.Start();

    // Make table changes.
    MakeTableInsertDeleteChanges(changesCount);

    // Wait a little bit to receive all changes.
    Thread.Sleep(1000);
}

Assert.AreEqual(changesCount, changesReceived);

使用SqlDependecyEx,您只能监视INSERT或DELETE,避免UPDATE,这会为您提供理想的结果:类似COUNT的行为。希望这会有所帮助。

相关问题