【问题标题】:How to create an automated column in SQL Server?如何在 SQL Server 中创建自动列?
【发布时间】:2014-07-29 10:13:32
【问题描述】:

IDE:Visual Studio、C# .net 4.0、Winforms 应用程序

SQL Server 中是否有任何方法可以实现表中的列,当它没有收到来自应用程序端的任何 ACK(确认)信号时,可以自动将其设置为 0?

要求是我想保留一个可以跟踪应用程序是打开还是关闭的列?

一种实现方法是使用OnClose() 事件,即在Close() 上,我可以将其值更改为0。但问题是假设应用程序由于某种原因被挂起或电源消失了,而不是数据库中的值不会更新为零。

所以我想创建一个自动列,它可以跟踪这种情况,并在应用程序未发送任何请求或空闲意味着关闭时将其设为零。

请建议如何处理。

【问题讨论】:

  • 不,这是不可能的 - SQL Server 中的列无法侦听和响应 Winforms 应用程序中的事件。您必须自己在 Winforms 代码中处理此问题,并根据需要更新 SQL Server 列

标签: c# sql sql-server winforms


【解决方案1】:

你不能那样做。您唯一能做的就是将GETDATE() 保存在表的列中作为应用程序的最后活动时间,例如每10 秒从高优先级线程调用存储过程。

当你想知道应用程序是否存活时,只需检查这个值,如果超过 10 秒,你的应用程序就消失了。

更新: 一种更精确但更复杂的方法是监听应用程序内的套接字,然后在您想知道应用程序是否处于活动状态时,从您的 sql 脚本向PING 应用程序发送请求。对于这种方法,您应该使用 CLR 编程,但我认为第一种方法实际上就足够了。

【讨论】:

    【解决方案2】:

    考虑到这将是一个多实例场景,其中应用程序的多个实例可以指向同一个数据库。您可以尝试以下方法:

    1. 创建一个单独的表来维护会话。此表将包含三列 1) 机器名称或 IP 2) 会话 ID (GUID) 和 3) 时间戳。
    2. 每当应用程序启动时,都会创建一个新的会话 ID 并在此表中创建条目,这意味着新的会话已启动。
    3. 继续根据会话 ID 更新每个请求的时间戳。
    4. 在 web.config 或数据库中的某处配置超时,稍后会派上用场。
    5. 现在,当应用程序正常退出时,从表中删除该行。
    6. 现在,如果应用程序崩溃,该行将不会被删除,因此下次应用程序启动时,您可以检查该行是否已存在。使用机器名或 IP 查询表。
    7. 使用上面 (3) 中配置的超时设置来确定应用程序空闲多长时间。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-02-08
      • 2012-05-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多