欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
C#中讀取文本文件導入SQL數據庫解決方法
概述:
   文本文件是一種非常常用的文件格式,因其通用的閱讀方式而經(jīng)常被用做不同單位的數據交換文件格式。
   文本文件需要能夠正確導入數據庫,
        必須要滿(mǎn)足以下兩個(gè)條件其中之一:
            1:文本文件的結構格式固定,長(cháng)度固定.
            2:文本文件每行長(cháng)度不固定,但每個(gè)字段之間有特殊符號分開(kāi).
        本文給出的是滿(mǎn)足條件1的文本文件導入到數據庫的解決方法,對于滿(mǎn)足條件2的文本文件,道理類(lèi)似,
        有興趣的朋友可以自行測試,如有問(wèn)題,歡迎交流和溝通!
 
一:?jiǎn)?wèn)題描述:
這是老婆大人單位的一個(gè)項目,需求其實(shí)還是比較清晰的:要求編寫(xiě)Asp.Net程序,自動(dòng)讀取每天生成的文本文件,
根據業(yè)務(wù)邏輯處理后,保存到SQLSERVER數據庫。
文本格式定義:
1:每一行具有相同固定格式,一行就對應于數據庫中的一條記錄,記錄的每個(gè)字段都有明確的長(cháng)度定義。
2:每一行文本都是連續的,中間沒(méi)有任何的特殊的符號來(lái)區分不同的字段。
3:文本中有英文字母和數字,也可能有中文漢字。
4:格式規定,一個(gè)英文字母或數字對應的長(cháng)度為1,中文漢字對應的長(cháng)度為2.
        根據項目需求分析,整個(gè)需求并不復雜,一般來(lái)說(shuō),文本文件需要能夠正確導入數據庫,
        必須要滿(mǎn)足以下兩個(gè)條件其中之一:
            1:文本文件的結構格式固定,長(cháng)度固定.
            2:文本文件每行長(cháng)度不固定,但每個(gè)字段之間有特殊符號分開(kāi).
        上述需求滿(mǎn)足條件1,肯定可以能正確導入到數據庫。
 
二:初步的解決思路和步驟
         1:讀取文本文件內容到數據流StreamReader 
         2:開(kāi)始事務(wù) 
         3:循環(huán)從數據流中讀取每一行到字符串,按表結構定義通過(guò)SubString函數對字符串進(jìn)行截取到每一個(gè)字段變量。 
         4:定義SQL存儲過(guò)程,傳入步驟3中的每個(gè)字段值,在存儲過(guò)程中完成每條記錄的插入! 
         5:執行事務(wù) 
         6:事務(wù)回滾 
         7:錯誤消息捕捉,返回友好信息提示 
         8:釋放相關(guān)資源
 
三:實(shí)際開(kāi)發(fā)中出現的問(wèn)題與解決方法
       問(wèn)題:
           實(shí)際的程序中,按照文本文件定義的字段長(cháng)度進(jìn)行字符串截取,取出來(lái)的字符串長(cháng)度與實(shí)際長(cháng)度不一致,不論是使用bg2312編碼還是默認編碼。 具體現象通過(guò)調試跟蹤,在C#中,不論是英文字母還是漢字,取出來(lái)的長(cháng)度也是1,而不是如文本文件中規定的那樣,漢字長(cháng)度為2.導致整個(gè)字符串與實(shí)際定義的長(cháng)度不一致,所以在用SubString()函數截取字符串時(shí),無(wú)法根據數據結構定義中的長(cháng)度正確取得每個(gè)字段值。
      原因分析:
           問(wèn)題原因很明顯是編碼格式出現問(wèn)題,漢字保存在磁盤(pán)中的編碼有多種,常見(jiàn)的有:GB、BIG5 、Unicode、UTF-7、UTF-8等。在文本文件讀取過(guò)程中,  文件的編碼(Encoding)和StreamReader/Writer指定的Encoding不對應,就會(huì )出現亂碼問(wèn)題。雖然StreamReader可以根據文本文件格式自動(dòng)識別編碼格 式,正確讀取不同編碼格式的文本文件。但對于字符串來(lái)說(shuō),是無(wú)法識別字符串中的中文字符與英文,數字的區別,統一都作用長(cháng)度為1處理。正確的處 理方法是使用將字符串轉換為字節數組,對字節數組按文本文件定義的字段長(cháng)度讀取每個(gè)字段值。
 
四:修正的解決思路
         1:讀取文本文件內容到數據流StreamReader 
         2:開(kāi)始事務(wù) 
         3:循環(huán)從數據流中讀取每一行到字符串,并轉換為字節數組。按表結構定義對字節數組進(jìn)行截取到每一個(gè)字段變量。 
         4:定義SQL存儲過(guò)程,傳入步驟3中的每個(gè)字段值,在存儲過(guò)程中完成每條記錄的插入! 
         5:執行事務(wù) 
         6:事務(wù)回滾 
         7:錯誤消息捕捉,返回友好信息提示 
         8:釋放相關(guān)資源
 
 
五:相關(guān)的文本文件處理函數參考,完整的源碼見(jiàn)附件
 

    /// <summary>
    /// 通用函數,讀文本文件
    /// </summary>
    /// <param name="fileName">讀入的文本文件名稱(chēng)</param>
    public static void ReadTextFromFileName(string fileName)    
    {
      string strRecord = "";

      //讀入文本文件時(shí),一定要指定文件的編碼格式.其中:default為文本文件本來(lái)的編碼格式
      //如果是簡(jiǎn)體中文的文本文件,也可以這樣設置編碼格式: System.Text.Encoding.GetEncode("gb2312")
      //Encoding.GetEncode("gb2312")為簡(jiǎn)體中文編碼格式,Encoding.GetEncode("big5")為繁體中文編碼格式.
      StreamReader reader = new StreamReader(fileName,System.Text.Encoding.Default);
                        
      da = new DataAccess();
      da.OpenConnection();

      //指定本次數據操作進(jìn)行事務(wù)處理
      da.StartTrans = true;

      //開(kāi)始事務(wù)處理
      da.BeginTrans();

      //i is the really row
      //j is the row of writed to database
      int i ,j;
      i=0;
      j=0;
      try
      {        
        while (reader.Peek() >= 0)
        {            
          strRecord = reader.ReadLine();
          if (StringConvertByteArray(strRecord))
          {
            j++;
          }
          i++;
        }    
        
        //執行事務(wù)
        da.Commit();

        TotalLine = i;
        RealLine = j;
      }
      catch (Exception ex)
      {
        //事務(wù)回滾
        da.Rollback();


        SystemError.SystemLog("文件:" + fileName +"導入失敗,錯誤行是第"+ i.ToString()+ "行,原因是: " + ex.Message);
        throw new Exception(ex.Message);
      }

            //相關(guān)資源的消除
      finally
      {                
        reader.Close();
        da.CloseConnection();        
      }
    }


    /// <summary>
    /// 處理定長(cháng)文本文件的函數,將字符串轉換成byte[]數組
    /// </summary>
    /// <param name="aRecord"></param>
    private static bool StringConvertByteArray(string aRecord)
    {
      //解決文本文件一行中可能存在中文的情況,將string類(lèi)型轉換為byte[]來(lái)達到
      //正確處理文本文件的目的
      byte[] repRecord = System.Text.Encoding.Default.GetBytes(aRecord);
        
      //判斷取得的文本文件長(cháng)度是否等于定義的文本文件長(cháng)度
      if (repRecord.Length    != iLineLength)
      {
        SystemError.SystemLog("文件:" + fileName +"導入出錯,出錯原因是文件長(cháng)度不符合");
        throw new Exception("文件文本長(cháng)度不對,導入失敗,請檢查文件文件格式");
      }

      bool isInsert=false;
      isInsert = AddRecord(
        GetString(repRecord,0,8),    
        GetString(repRecord,8,8),
        GetString(repRecord,16,6),
        GetString(repRecord,22,6),
        GetString(repRecord,28,8),
        GetString(repRecord,36,6),
        GetString(repRecord,42,10),
        GetString(repRecord,52,4),
        GetString(repRecord,56,6),
        GetString(repRecord,62,8),
        GetString(repRecord,70,7),
        GetString(repRecord,77,32),
        GetString(repRecord,109,72),
        GetString(repRecord,181,8),
        GetString(repRecord,189,30),
        GetString(repRecord,219,45),
        GetString(repRecord,264,10),
        GetString(repRecord,274,25),
        GetString(repRecord,299,2),
        GetString(repRecord,301,25),
        GetString(repRecord,326,3),
        GetString(repRecord,329,15),
        GetString(repRecord,344,1),
        GetString(repRecord,345,8),
        GetString(repRecord,353,6),
        GetString(repRecord,359,8),
        GetString(repRecord,367,1),
        GetString(repRecord,368,1),
        GetString(repRecord,369,32),
        GetString(repRecord,401,7),
        GetString(repRecord,408,60),
        GetString(repRecord,468,20),
        GetString(repRecord,488,20),        
        GetString(repRecord,508,20),
        GetString(repRecord,528,36),
        GetString(repRecord,564,15),
        GetString(repRecord,579,15),
        GetString(repRecord,594,15)
        );
      return isInsert;
                            
    }
    
                
    //private static void    
                /// <summary>
                /// 處理長(cháng)度固定的文本文,讀取到每個(gè)字段的值
                /// </summary>
                /// <param name="aStr">文本文件的每行文本轉換的Byte數組</param>
                /// <param name="iStart">讀取的起始位置</param>
                /// <param name="iLength">讀取的長(cháng)度</param>
                /// <returns>返回的字符串,對應于具體的字段值</returns>
    private static string GetString(byte[] aStr,int iStart,int iLength)
    {

      byte[] tempStr = new byte[iLength];
      for ( int i = 0; i < iLength; i ++)
      {
        tempStr[i] = (byte)aStr.GetValue(iStart + i);        
      }

      return System.Text.Encoding.Default.GetString(tempStr);
    }
    
本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
c#在文本文件中搜索指定的字符串
C# 如何將一個(gè)字符串轉換成字節數組”與“如何將一個(gè)字節數組轉換成一個(gè)字符串
Oracle8 數據類(lèi)型
第9章_C#文件流
C#讀取和寫(xiě)入文本文件
C# 對文本文件的讀寫(xiě)
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久