定时执行某一个功能一(sqlite导出xml并压缩)

背景:

1、外网有新的数据,数据库是sqlite;需要经过网闸传到内网的数据库中以方便下一步的操作。

2、内网数据库是postgresql;

3、由于每天过网闸的数据有很多,同时为了区分是哪个部门的,减少数据的丢失,那么就需要把这些数据从sqllite中读到datatable中,然后每一条存放到一个xml文件中。对这些xml文件进行压缩,规范命名,然后传到内网的存储中,内网进行解压,读取xml文件,然后读取到postgresql中。

4、查询外网数据库,每天凌晨四点开始启动,查询内容:前一天24小时内容,以及当天零点到四点的内容;

两种方案:1、windows服务;2、控制台程序+windows定时计划

方案一:windows服务 

(一)vs新建项目-windows服务。具体步骤:http://blog.csdn.net/cai15191466621/article/details/7007604(网上随便搜的一个教程,大家参考一下就ok)

配置文件内容:1、连接sqlite数据库;2、写类型:用户可选择是定时执行还是间隔执行;3、定时执行的小时;4、定时执行的分钟;5、导出的xml文件,新建的压缩包的存储路径;

(二)代码思路:

1、服务在启动时新建一个timer、timer事件中判断用户的类型,如果是定时执行,就去判断当前事件是否与用户指的时间相同,若相同就执行,否则不执行;

2、执行内容

(1)查询内容到datatable中;

(2)若有内容,则先在压缩包存放路径新建一个文件夹,命名:“固定格式”-“时间戳”;

(3)xml需要从当前运行exe相对路径中复制到文件夹中,命名根据某两个字段命名

 

foreach (DataRow dr in dt.Rows)
                        {
                            string Xmlname = dr["orderid"].ToString() + "_" + dr["batchid"].ToString() + ".xml";
                            string path = Path.Combine(filePath, Xmlname);
                            File.Copy(oldXml, path);
                            XmlDocument xmldoc = new XmlDocument();
                            xmldoc.Load(path);
                            XmlNode root = xmldoc.DocumentElement;
                            XmlNode orderid = root.SelectSingleNode("/root/orderid");
                            orderid.InnerText = dr["orderid"].ToString();
                            XmlNode batchid = root.SelectSingleNode("/root/batchid");
                            batchid.InnerText = dr["batchid"].ToString();
                            XmlNode obsize = root.SelectSingleNode("/root/obsize");
                            obsize.InnerText = dr["obsize"].ToString();
                            XmlNode obfinish = root.SelectSingleNode("/root/obfinish");
                            obfinish.InnerText = dr["obfinish"].ToString();
                            XmlNode submittime = root.SelectSingleNode("/root/submittime");
                            submittime.InnerText = dr["submittime"].ToString();
                            m_log.Info(dr["submittime"]);
                            XmlNode createtime = root.SelectSingleNode("/root/createtime");
                            createtime.InnerText = dr["createtime"].ToString();
                            XmlNode synctime = root.SelectSingleNode("/root/synctime");
                            synctime.InnerText = dr["synctime"].ToString();
                            XmlNode readytime = root.SelectSingleNode("/root/readytime");
                            readytime.InnerText = dr["readytime"].ToString();
                            XmlNode notifytime = root.SelectSingleNode("/root/notifytime");
                            notifytime.InnerText = dr["notifytime"].ToString();
                            XmlNode task_status = root.SelectSingleNode("/root/task_status");
                            task_status.InnerText = dr["task_status"].ToString();
                            XmlNode address = root.SelectSingleNode("/root/address");
                            address.InnerText = dr["address"].ToString();           
                            xmldoc.Save(path);
                        }
                        m_log.Info("xml新建成功,准备压缩");


(4)进行压缩文件夹

 

(5)如果压缩成功,则删除原文件夹

 

//压缩
                        SevenZipTool zipTool = new SevenZipTool();
                        string message=zipTool.CompressDirectory(filePath, filePath+".zip");
                        if (message.Contains("成功"))
                        {
                            m_log.Info("压缩成功,准备删除");
                            DirectoryInfo di = new DirectoryInfo(filePath);
                            di.Delete(true);
                            m_log.Info("删除成功");
                        }


SevenZipTool是一个类:集成7z文件解压、压缩功能。这个类如果需要,请在博客下方留言~

 

 

 

方案二:控制台程序+windows定时计划

(一)配置文件内容:1、连接sqlite数据库;2、导出的xml文件,新建的压缩包的存储路径;

代码思路:

(1)查询内容到datatable中;
(2)若有内容,则先在压缩包存放路径新建一个文件夹,命名:“固定格式”-“时间戳”;
(3)xml需要从当前运行exe相对路径中复制到文件夹中,命名根据某两个字段命名

windows定时任务

Win7怎么设置定时自动执行任务

这个是导出xml并压缩功能,下一篇,解压并读取xml到postgresql

 

 

 

很抱歉,由于sqlite的shell.c是一个比较复杂的程序,要实现其功能需要涉及到SQLite的内部实现和一些底层的操作,而且还需要对C++和SQLite都有一定的熟悉度。因此,这个任务可能比较困难,需要一定的时间和精力去完成。 不过,如果你只是希望在C++中使用SQLite,可以通过调用SQLite的API来实现。SQLite提供了一系列的C语言API,可以方便地在C++中使用。以下是一个简单的C++程序,演示了如何打开一个SQLite数据库、执行SQL语句并关闭数据库: ```cpp #include <iostream> #include <sqlite3.h> int main() { sqlite3 *db; char *errMsg = nullptr; int rc = sqlite3_open("test.db", &db); if (rc != SQLITE_OK) { std::cerr << "Failed to open database: " << sqlite3_errmsg(db) << std::endl; sqlite3_close(db); return 1; } rc = sqlite3_exec(db, "CREATE TABLE IF NOT EXISTS test_table (id INTEGER PRIMARY KEY, name TEXT);", nullptr, nullptr, &errMsg); if (rc != SQLITE_OK) { std::cerr << "Failed to create table: " << errMsg << std::endl; sqlite3_free(errMsg); sqlite3_close(db); return 1; } rc = sqlite3_exec(db, "INSERT INTO test_table (name) VALUES ('Alice');", nullptr, nullptr, &errMsg); if (rc != SQLITE_OK) { std::cerr << "Failed to insert data: " << errMsg << std::endl; sqlite3_free(errMsg); sqlite3_close(db); return 1; } sqlite3_close(db); return 0; } ``` 这个程序首先打开一个名为test.db的数据库,如果打开失败则输出错误信息并退出程序。然后创建一个名为test_table的表,如果创建失败则输出错误信息并退出程序。最后向表中插入一条数据。这个程序使用了sqlite3_open、sqlite3_exec、sqlite3_errmsg、sqlite3_free和sqlite3_close等SQLite API。这些API的使用方法可以参考SQLite的官方文档。
评论 66
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阳光下是个孩子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值