这是我第一次需要使用SqlDependency,所以我希望它是我犯的一个愚蠢的错误。
我遇到的问题是,当SQL表更改时,不会触发OnChanged事件。没有错误或其他任何东西不会触发。
这是代码
public class SqlWatcher
{
private const string SqlConnectionString = "Data Source = CN-PC08\\DEV; Initial Catalog=DEP; User = sa; Password=******";
public SqlWatcher()
{
SqlClientPermission perm = new SqlClientPermission(System.Security.Permissions.PermissionState.Unrestricted);
perm.Demand();
SqlCommand cmd = new SqlCommand("SELECT [DataAvaliable], [RowNumber] FROM [dbo].[Trigger]", new SqlConnection(SqlConnectionString));
SqlDependency sqlDependency = new SqlDependency(cmd);
sqlDependency.OnChange += On_SqlBitChanged;
}
private void On_SqlBitChanged(object sender, SqlNotificationEventArgs sqlNotificationEventArgs)
{
SqlDependency dependency = (SqlDependency)sender;
dependency.OnChange -= On_SqlBitChanged;
// Fire the event
if (NewMessage != null)
{
NewMessage(this, new EventArgs());
}
}
public void Start()
{
SqlDependency.Start(SqlConnectionString);
}
public void Stop()
{
SqlDependency.Stop(SqlConnectionString);
}
public event EventHandler NewMessage;
在我的主窗口中
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
try
{
SqlWatcher sqlWatcher = new SqlWatcher();
sqlWatcher.Start();
sqlWatcher.NewMessage += On_NewMessage;
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
}
private void On_NewMessage(object sender, EventArgs eventArgs)
{
MessageBox.Show("Message Received");
}
}
因此,预期的行为是,如果我运行以下sqlQuery,将显示一个messageBox,显示“收到消息”
INSERT INTO [DEP].[dbo].[Trigger] Values(0,3)
谁能给我提示要检查/更改的内容吗?
我知道在依赖项中只能使用Sql功能的一个子集,但是我不认为我想在这里做任何事情。
我希望这是我犯的一个愚蠢的错误。
不幸的是(或者幸运的是?)您犯了几个错误。
首先,您需要了解查询通知将使 一个查询 无效。因此,您最多只会收到 一次 通知,如果您想接收更多通知,则必须重新订阅(重新提交查询)。
接下来,您需要了解,由于 任何 原因,您不仅会收到更改通知,还会收到通知。在回调中,您 必须 检查通过传入的通知原因SqlNotificationEventArgs
。
接下来,您需要了解异步编程的基本原理:如果订阅事件,请确保在事件第一次发生 之前* 就进行订阅。恰当的例子: 您提交查询后,便会立即On_SqlBitChanged
触发。这 应该 在构造函数中发生,但是您可以 在 构造函数运行 后 订阅。在挂接事件回调之前,可以在构造函数完成之间调用它,在这种情况下,该通知将被静默忽略。 * SqlWatcher.SqlWatcher``sqlWatcher.NewMessage
On_SqlBitChanged``NewMessage
如果要使用服务,请确保 在 使用 前 将其启动。您在中使用SqlDependency,SqlWatcher.SqlWatcher
但 随后 在调用时启动它SqlWatcher.Start()
。
最后,如果您希望收到有关查询更改的通知, 则必须提交查询 。您正在构造SqlCommand
对象,设置通知,然后…丢弃对象。除非您实际提交查询,否则您还没有预订 任何东西 。
修复建议:
Start
和Stop
statics,调用Start
应用程序启动。NewMessage
在 提交查询 之前, 请确保已订阅SqlComamnd.ExecuteQuery()
)Info
,Type
然后Source
在On_SqlBitChanged
回调中,如果您的提交包含错误,则这是学习的唯一方法(即使通知请求无效,SqlComamnd.ExecuteQuery()也会成功)还有一件事:不要在后台回调中调用UI代码。您不能MessageBox.Show("Message Received");
从回调中调用,必须通过路由通过表单主线程Form.Invoke
。是的,我知道严格来说,MessageBox.Show
它确实 适用于非UI线程,但是您很快就会离开警报框而真正形成交互作用,然后一切都会中断。
我想用quartz scheduler使用jdbc数据存储立即执行作业~。然而,即使我使用now()或调用triggerjob进行调度,在调度和触发器fire之间也有20-30秒的延迟。 我尝试用一个简单的触发器执行作业: 并且我还尝试用调度程序触发: 下面是显示延迟的侦听器日志。
正如标题所说,我根本无法让Quartz.net工作。我从NuGet获得了最新版本的Quartz.net(2.2.1)、Common.Logging(2.1.2)、Common.Logging.NLog(2.0.0)和NLog(2.1.0)。触发器没有被触发,而且石英绝对没有记录任何东西。我猜我搞砸了配置。 我的应用程序配置: 有一个作业和一个触发器与之相关: 调度程序将启动,作业和触发器将正确添加
问题内容: 我建立了一个新的react项目,由于某种原因,该方法没有被调用。 我已经通过调用in 验证了此行为,但是在控制台中看不到它的输出。 此外,无法正常工作。 关于为什么不调用,我感到很困惑。我尝试同时使用React“ v0.14.0”和“ v0.14.3”。 为什么不调用“ componentDidMount”? 码: 问题答案: 所以…瞧瞧......我终于开始工作了(在后端专家的帮助下
问题内容: 我试图设置一个监听器来确定何时按下输入按钮,但是根本没有触发。我在装有Android 4.2.2的LG Nexus 4上进行了测试。可以在具有Android 2.3的Amazon Kindle Fire上使用,并且无处可用!我也无法为按钮设置文本。这是代码: 我究竟做错了什么?我怎样才能解决这个问题? 问题答案: 您可以使用TextWatcher。
我有这个脚本: HTML中的用法: 由于某些原因,它的工作,如果页面重新加载一半,但不,它没有开火,在它工作之前,所以我不知道发生了什么。我在wordpress网站上使用这个。
当我的函数方法签名如下时,我有一个成功触发的v3 WebJob: 然而,当我添加一个输出blob时,BlobTrigger永远不会触发。 下面的文档如下:https://docs.microsoft.com/en-us/azure/azure-functions/functions-bindings-storage-blob#output