1. 程式人生 > >2018/5/28~2018/6/1 周記

2018/5/28~2018/6/1 周記

事件 這樣的 read window wechat files 設定 new 一個

本周來泉州出差,所做的任務是在27上布一個定時器,定時每天早上六點下載微信支付寶的對賬單,並將數據以Json的格式傳到72上。

創建一個WindowsService,在上面寫一個定時器。具體代碼如下:

技術分享圖片
 public partial class MyService : ServiceBase
    {
        public static string i;
        public MyService()
        {
            InitializeComponent();
        }
        
        System.Timers.Timer timer1;
        
int iHour = 11; int iMinute =48; int iSecond = 00; protected override void OnStart(string[] args) { timer1 = new System.Timers.Timer(); timer1.Interval = 1000; //設計計時器間隔執行時間 timer1.Elapsed += new System.Timers.ElapsedEventHandler(timer1_Elapsed); timer1.Enabled
= true; //D:\WebSites\定時器 if (!EventLog.SourceExists("OnStart222")) { EventLog.CreateEventSource("OnStart222", "jason"); } EventLog.WriteEntry("OnStart222", "開始任務了"); } protected override void OnStop() {
this.timer1.Enabled = false; EventLog.WriteEntry("OnStop", "任務結束"); } private void timer1_Elapsed(object sender, System.Timers.ElapsedEventArgs e) { int intHour = e.SignalTime.Hour; int intMinute = e.SignalTime.Minute; int intSecond = e.SignalTime.Second; // write(intHour + ":" + intMinute + ":" + intSecond); StatementOfAccount ss = new StatementOfAccount(); if (intHour == iHour && intMinute == iMinute&&intSecond==iSecond) { // write(intHour + ":" + intMinute + ":" + intSecond + " 每天00:00:00!\n\r"); ss.WechatAccount(); i= ss.AlipayAccount(); ss.ReadExcel(i); } }
View Code

在設定的時間觸發定時器,在應用程序中執行定期事件。在早上11:48:00時執行ss.WechatAccount(); i= ss.AlipayAccount();ss.ReadExcel(i);這三個方法。

從支付寶下載對賬單,是通過阿裏給的一條URL去請求數據,底層代碼阿裏已經封裝好了,我們只是調用阿裏的底層代碼就行,返回的地址通過下載文件的方法可以下載對賬單的壓縮包到自己指定的文件夾裏面。因為要返回Json格式的數據給72代碼裏面,所以要把壓縮包裏面Excel文件的數據一條一條讀取出來,因此要解壓文件並讀取文件的內容。這時候問題就出來了,偶爾會報錯,提示Excel的文件正在被另一個進程占用,正常情況下打斷點一步一步查,但是斷點一步一步走卻發現不了問題,數據也能出來,而程序運行卻會報錯。因為提示的錯誤是Excel文件被另一個進程占用,導致在讀取Excel文件時候報錯,所以我猜測應該是Excel在解壓過程中就被讀取,所以才會報那個進程被占用的錯誤。但是有時候運行的時候又不會報錯。原因是下載的壓縮文件裏面有兩個Excel文件,如果剛好讀取的文件與正在解壓的文件是同一個文件時,就會報進程被占用的錯誤。因此報進程被占用的概率是50%,解決的方法就是將解壓文件和讀取文件從同一個方法裏面分離出來,寫成兩個方法,這樣可以保證在解壓完成後才會讀取文件的內容。

我之前一直以為,只有執行完上一行的代碼後才能執行下一行的代碼,但是通過這次報錯後發現,並不是上一行代碼執行完才執行下一行的代碼,也可能是同時執行,其實也可能是執行一行的代碼所需要的事件太短到可以忽略的程度,所以才會出現這次遇到的這樣的問題,上一行代碼文件剛在解壓,下一行代碼文件就被讀取。

取到Json,通過給定的URL地址,就可以把賬單數據傳到72去插庫了。

其實從阿裏和微信那邊取到的數據插到庫裏面的時候,相對對賬來說只是拿到數據而已,最重要的是將拿到的數據和本地數據庫裏面的數據進行對比,找到兩邊數據有異常的,即數據不一致(本地有,微信支付寶賬單上沒有或者微信支付寶賬單有,本地沒有)。完成這樣的對比有兩個方向,要麽把本地數據寫成Excel文件,和微信支付寶的數據通過Excel文件功能進行兩個Excel文件的對比,或者把微信支付寶賬單數據放到數據庫,通過兩個表進行對比。

寫文件流(將數據寫到一個txt文件裏面):

技術分享圖片
 FileStream fileStream = File.Open(@"D:\WebSites\定時器\AliPay.txt", FileMode.Append);//初始化文件流
                byte[] array = Encoding.Default.GetBytes(postData);//給字節數組賦值
                fileStream.Write(array, 0, array.Length);//將字節數組寫入文件流
                fileStream.Close();//關閉流
                fileStream.Dispose();
View Code

註:文件必須是已經存在的,否則會報錯!



2018/5/28~2018/6/1 周記