在C#控制台应用程序中使用时间小时执行查询。

4
我想使用控制台应用程序并带有小时参数来截断表格。例如,我想在系统时间为12:00 AM时运行截断查询。
以下是我在C#控制台应用程序中的代码:
namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {            
            string getHour = DateTime.Now.ToString("h:mm:ss tt");

            if (getHour == "12:00:00 AM")
            {
                Console.WriteLine("Do action to run query truncate");
                //in this line i will execute query truncate.
            }        

            // Keep the console window open in debug mode.
            Console.WriteLine("Press any key to exit.");
            Console.ReadKey();
        } 
    }
}

这不起作用,请给我解决方案或示例代码来解决我的问题。谢谢…

你尝试在凌晨12点(服务器时间)运行你的应用程序了吗? - Shyju
仅在服务器上午12点时,将运行命令以截断表。 - developer satu
1
你确定你没有错过一秒钟吗?也许你应该改变你的if条件来检查一个范围(12.00.01到12.00.05)? - Shyju
好的,如果这是您的建议,那么代码的应用如何? - developer satu
4个回答

1
当您运行程序时,它会快速查看时钟,如果不是准确的午夜,立即退出。(更准确地说,它会打印一些消息并等待按键)。我相信您希望等到午夜。如果精确时间不是很重要(我的意思是提前或延迟几秒都可以接受),最简单的解决方案是:
static void Main(string[] args)
{
    Thread.Sleep(DateTime.Today.AddDays(1) - DateTime.Now);
    Console.WriteLine("It's about midnight, I go to sleep");
}

1
我建议你在代码中做出以下几点改进:
  1. 不要使用字符串比较,而是直接使用DateTime(查看TimeOfDay.TotalSeconds)。这样可以使比较更加容易。
  2. 使用重复调用而不是仅一次调用(除非你确信你在12点准时运行程序)。这样可以让你的程序更好地为你工作。
  3. 为了使其更加健壮,提供一些方法给你的系统提供一定的容错能力。这就是良好自动化应该具备的特征。

例如:

namespace ConsoleApplication1 {
    class Program {
        static void Main(string[] args) {

            while (true) { //read 2. assuming this is to be run forever in this example, but gives also some way to break the loop whenever necessary in your app
                if (DateTime.Now.TimeOfDay.TotalSeconds <= 1) { //read 1. and 3. this way, you give tolerance of 1 second. Your action will be run on 12:00:00 - 12:00:01
                    Console.WriteLine("Do action to run query truncate");
                    //  //in this line i will execute query truncate.
                    break; //break after saving once, for instance, and run again when the time close... This is to prevent possible multiple executions...
                }
                System.Threading.Thread.Sleep(500); //read 2. and 3. check every 500 millisecond, at least to give chance to check the time twice per second
            }

            // Keep the console window open in debug mode.
            Console.WriteLine("Press any key to exit.");
            Console.ReadKey();
        }
    }
}

嘿,Lan,根据你的示例代码,“DateTime.Now.TimeOfDay.TotalSeconds”是一天中的总秒数。如果我想设置为上午8点15分怎么办?谢谢Lan。 - developer satu
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Ian
你还可以使用DateTime.Now.TimeOfDay.Hours。如果你知道时间是8点15分,那么你就知道DateTime.Now.TimeOfDay.Hours >= 8.25(注意,.25表示15分钟的一部分),再加上DateTime.Now.Second <= 1,关键是要使用DateTime类。当你探索它时,你会发现它的好处。;) 只是一个旁问:"Satu"是马来语/印尼语中的"一",对吗?你是马来西亚人还是印度尼西亚人? - Ian
谢谢 Ian……它好用。是的,我来自印度尼西亚Ian。很高兴认识你Ian :) - developer satu
太好了!很高兴你发现它可以工作。 😉 我懂了...难怪...在这种情况下,Selamat Hari Natal!= 圣诞快乐! - Ian

1
我觉得问题出在您的代码执行流程上。 您只调用一次代码,然后它就停止了。 它现在会检查一次并获取当前时间。 如果时间是凌晨12:00:00,则可以进入if语句,但您需要精确地在系统时间12:00:00运行此代码,这几乎是不可能的。
您应该考虑使用Windows服务或使用Windows任务管理器:C#控制台应用程序-保持运行

1
如其他答案所述,您不应该使用应用程序来安排任务。看起来您正在执行数据库维护任务,因此我首先要查看的是...
1) 查看您的数据库是否可以安排任务。例如,SQL Server Agent可以安排存储过程(或adhoc SQL)在设定的时间运行,并且如果您正在使用该数据库,则可以完成您的任务。更多信息请参见此处
如果您的数据库无法执行此操作或者您想要执行除截断表之外的其他操作,则...
2) 尝试使用Windows任务计划程序
这可以在设定的时间启动应用程序,易于设置,然后您的应用程序只需执行其本身的工作(例如截断表),而不必担心调度。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接