定时执行某一个功能二(解压并读取xml到postgresql)

继上一篇: 定时执行某一个功能一(sqlite导出xml并压缩)
下面我要来讲一下:如何对这些xml解压,读取到postgresql数据库中

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

1、读取config中的扫描时间间隔
服务在启动时新建 一个timer、timer事件中判断用户的类型,如果是定时执行,就去判断当前事件是否与用户指的时间相同,若相同就执行,否则不执行;
2、寻找符合条件的压缩包,解压;

		try
            {
                //先找到符合要求的压缩包
                string[] strFiles = Directory.GetFiles(SystemSettings.DecompressonRoot, "outnet-orderinfo-*.zip", SearchOption.AllDirectories);
                m_log.Info(strFiles.Length);
                foreach (string strSF in strFiles)
                {
                    m_log.Info("准备解压");
                    //解压
                    string outputDirectory = strSF.Substring(0, strSF.Length - 4);
                    SevenZipTool zipTool = new SevenZipTool();
                    string message = zipTool.ExtractFile(strSF, outputDirectory);
                    if (message.Contains("成功"))
                    {
                        m_log.Info("解压成功");
                        //读取xml
                        string[] strXmls = Directory.GetFiles(outputDirectory, "*.xml", SearchOption.AllDirectories);
                        m_log.Info("xml全部读到strXmls中");

                        bool flag = ToPostgreSql(strXmls);
                        if (flag == true)
                        {
                            DirectoryInfo di = new DirectoryInfo(outputDirectory);
                            di.Delete(true);
                            m_log.Info("删除解压后文件成功");
                            File.Delete(strSF);
                            m_log.Info("删除压缩包成功");
                        }
                    }
                }

            }
            catch (Exception ex)
            {
                m_log.Error(ex);
            }

3、读取xml中数据到datatable中,并插入到postgresql数据库中

public bool ToPostgreSql(string[] strXmls)
        {
            try
            {
                List<string> sqllist = new List<string>();
                foreach (string strXml in strXmls)
                {
                    XmlDocument xmlDoc = new XmlDocument();
                    string orderid = "";
                    string batchid = "";
                    long obsize = 0;
                    long obfinish = 0;
                    DateTime submittime;
                    DateTime createtime;
                    DateTime synctime;
                    DateTime readytime;
                    DateTime notifytime;
                    string task_status = "";
                    string address = "";
                    string taskid = "";
                    xmlDoc.Load(strXml);
                    XmlNode xnorderid = xmlDoc.SelectSingleNode("root/orderid");
                    orderid = xnorderid.InnerText;
                    XmlNode xnbatchid = xmlDoc.SelectSingleNode("root/batchid");
                    batchid = xnbatchid.InnerText;
                    taskid = orderid + "_" + batchid;
                    XmlNode xnobsize = xmlDoc.SelectSingleNode("root/obsize");
                    obsize = Convert.ToInt64(xnobsize.InnerText);
                    XmlNode xnobfinish = xmlDoc.SelectSingleNode("root/obfinish");
                    obfinish = Convert.ToInt64(xnobfinish.InnerText);
                    XmlNode xnsubmittime = xmlDoc.SelectSingleNode("root/submittime");
                    submittime = Convert.ToDateTime(xnsubmittime.InnerText);
                    XmlNode xncreatetime = xmlDoc.SelectSingleNode("root/createtime");
                    createtime = Convert.ToDateTime(xncreatetime.InnerText);
                    XmlNode xnsynctime = xmlDoc.SelectSingleNode("root/synctime");
                    synctime = Convert.ToDateTime(xnsynctime.InnerText);
                    XmlNode xnreadytime = xmlDoc.SelectSingleNode("root/readytime");
                    readytime = Convert.ToDateTime(xnreadytime.InnerText);
                    XmlNode xnnotifytime = xmlDoc.SelectSingleNode("root/notifytime");
                    notifytime = Convert.ToDateTime(xnnotifytime.InnerText);
                    XmlNode xntask_status = xmlDoc.SelectSingleNode("root/task_status");
                    task_status = xntask_status.InnerText;
                    XmlNode xnaddress = xmlDoc.SelectSingleNode("root/address");
                    address = xnaddress.InnerText;
                    string selectsql = "select taskid from bpds_task_test where taskid='" + taskid + "' ";
                    DataTable tmpDt = pgHelper.Query(selectsql);
                    string sql = "";
                    if (tmpDt.Rows.Count != 0)
                    {
                        sql = string.Format("update bpds_task_test set orderid='{0}',batchid='{1}', obsize='{2}',obfinish='{3}',submittime='{4}', createtime='{5}', synctime='{6}',readytime='{7}', notifytime='{8}',task_status='{9}', address='{10}'where taskid='{11}'", orderid, batchid,obsize,obfinish,submittime,createtime,synctime,readytime,notifytime,task_status,address,taskid);
                    }
                    else
                    {
                        sql = "insert into bpds_task_test (taskid,orderid,batchid,obsize,obfinish,submittime,createtime,synctime,readytime,notifytime,task_status,address) values ('" + taskid + "','" + orderid + "','" + batchid + "','" + obsize + "','" + obfinish + "','" + submittime + "', '" + createtime + "', '" + synctime + "', '" + readytime + "', '" + notifytime + "', '" + task_status + "', '" + address + "') ";
                    }
                    sqllist.Add(sql);
                }
                m_log.Info("xml读取完毕,准备写入数据库");
                bool flag = pgHelper.ExecuteTransSQL(sqllist);
                return flag;
            }
            catch (Exception ex)
            {
                m_log.Error(ex);
                return false;
            }
        }

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

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

控制台程序与上面的相同,都是1、查找压缩包,进行解压;2、读取xml到postgresql中;
windows定时任务:在上一篇博客进行了介绍了。

评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

阳光下是个孩子

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

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

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

打赏作者

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

抵扣说明:

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

余额充值