2016-06-30 25 views
9

Mamy aplikację, w której dane w pliku Excel (obecne w udostępnionej ścieżce) przenoszą się do bazy danych. W przypadku jakiegokolwiek błędu pliki przenoszą się do folderu błędów, zapisując błąd w pliku dziennika. Korzysta z usługi Windows dla tej operacji.Niektóre pliki Excel nie przenoszą się ze wspólnej ścieżki do SQL Server

Czasami plik nie ma żadnego błędu, ale nadal przesuwa się do folderu błędów, pisząc log External table is not in the expected format. Ale ten sam plik ładuje się ponownie raz lub kilka razy, przechodząc do bazy danych bez żadnych błędów.

Usługa Windows, DB i wspólna ścieżka są obecne w XP Server. Aplikacja działała dobrze przez wszystkie te lata. Ale w ostatnich dniach wyżej wspomniany problem występuje niemal w każdym pliku.

Zainstalowaliśmy również pakiet Microsoft 2003, 2007,2012 komponentów biurowych i silników dostępu. Ale nadal problem nadal występuje.

Wspominam poniższy kod usługi systemu Windows. Pls pomóż. Z góry dziękuję.

using System.IO; 
using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Diagnostics; 
using System.Linq; 
using System.ServiceProcess; 
using System.Text; 
using System.Data.SqlClient; 
using System.Data.OleDb; 
using System.Data.Common; 

namespace Impexp_Service 
{ 
    public partial class Service1 : ServiceBase 
    { 
     System.Timers.Timer T1 = new System.Timers.Timer(); 
     public Service1() 
     { 
      InitializeComponent(); 
     } 

     protected override void OnStart(string[] args) 
      { 
      ///start 
      /// 

      { 
       SqlConnection strconnection = new SqlConnection(); 
       strconnection.ConnectionString = @"Data Source=XXXXXX;Initial Catalog=XXXX;User ID=XX;Password=XXXXXX;"; 
       strconnection.Open(); 
       // To get the all files placed at the shared path 
       DirectoryInfo directory = new DirectoryInfo(@"D:\Impexp\Data\"); 
       FileInfo[] files = directory.GetFiles("*.xlsx"); 



       foreach (var f in files) 
       { 
        string path = f.FullName; 

        // TO establish connection to the excel sheet 
        string excelConnectionString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + path + ";Extended Properties=\"Excel 12.0;HDR=Yes;IMEX=1\";"; 
        //Create Connection to Excel work book 
        OleDbConnection excelConnection = new OleDbConnection(excelConnectionString); 



        excelConnection.Open(); 
        //Create OleDbCommand to fetch data from Excel 
        OleDbCommand cmd = new OleDbCommand("Select * from [Report$]", excelConnection); 

        DbDataReader dr = cmd.ExecuteReader(); 
        // OleDbDataReader dReader; 
        // dReader = cmd.ExecuteReader(); 
        SqlBulkCopy sqlBulk = new SqlBulkCopy(strconnection); 
        //Give your Destination table name 
        sqlBulk.DestinationTableName = "imp_master_test"; 
        sqlBulk.WriteToServer(dr); 

        excelConnection.Close(); 

        File.Delete(path); 




        // To move error files to the error folder 



        /// end 


        T1.Interval = 20000; 
        T1.Enabled = true; 
        T1.Start(); 

        T1.Elapsed += new System.Timers.ElapsedEventHandler(T1_Elapsed); 
       } 
      } 
    } 


     void T1_Elapsed(object sender, System.Timers.ElapsedEventArgs e) 
     { 
      T1.Enabled = false; 
      try 
      { 
       SqlConnection strconnection = new SqlConnection(); 
       strconnection.ConnectionString = @"Data Source=10.91.XXXXXX;Initial Catalog=XXXXX;User ID=XXXXX;Password=XXXXX;"; 
       strconnection.Open(); 
       // To get the all files placed at the shared path 
       DirectoryInfo directory = new DirectoryInfo(@"D:\Impexp\Data\"); 
       FileInfo[] files = directory.GetFiles("*.xlsx"); 



       foreach (var f in files) 
       { 
        string path = f.FullName; 

        // TO establish connection to the excel sheet 
        string excelConnectionString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + path + ";Extended Properties=\"Excel 12.0;HDR=Yes;IMEX=1\";"; 
        //Create Connection to Excel work book 
        OleDbConnection excelConnection = new OleDbConnection(excelConnectionString); 

       try 
       { 
        excelConnection.Open(); 
        //Create OleDbCommand to fetch data from Excel 
        OleDbCommand cmd = new OleDbCommand("Select * from [Report$]", excelConnection); 

        DbDataReader dr = cmd.ExecuteReader(); 
        // OleDbDataReader dReader; 
        // dReader = cmd.ExecuteReader(); 
        SqlBulkCopy sqlBulk = new SqlBulkCopy(strconnection); 
        //Give your Destination table name 
        sqlBulk.DestinationTableName = "imp_master_prod"; 
        sqlBulk.WriteToServer(dr); 

        excelConnection.Close(); 

        File.Delete(path); 



       } 
       // To move error files to the error folder 
       catch (Exception exp) 
       { 

        excelConnection.Close(); 
        File.Move(path, Path.Combine(@"D:\Impexp\error\", f.Name)); 
        string path1 = @"D:\Impexp\error\error.txt"; 
        if (File.Exists(path1)) 
        { 
         // Create a file to write to. 
         using (StreamWriter sw = File.AppendText(path1)) 
         { 
          sw.WriteLine("File : " + path + " : " + exp.Message); 
          sw.Flush(); 

         } 
        } 


         T1.Enabled = true; 
         T1.Start(); 

        } 
       } 
       strconnection.Close(); 

      // End of TRY 1 

      } 
      catch (UnauthorizedAccessException UAEx) 
      { 
       string path1 = @"D:\Impexp\error\error.txt"; 
       if (File.Exists(path1)) 
       { 
        // Create a file to write to. 
        using (StreamWriter sw = File.AppendText(path1)) 
        { 
         sw.WriteLine(UAEx.Message); 
         sw.Flush(); 

        } 
       } 
       T1.Enabled = true; 
       T1.Start(); 
      } 
      catch (PathTooLongException PathEx) 
      { 
       string path1 = @"D:\Impexp\error\error.txt"; 
       if (File.Exists(path1)) 
       { 
        // Create a file to write to. 
        using (StreamWriter sw = File.AppendText(path1)) 
        { 
         sw.WriteLine(PathEx.Message); 
         sw.Flush(); 

        } 
       } 
       T1.Enabled = true; 
       T1.Start(); 
      } 
      T1.Enabled = true; 
      T1.Start(); 


     } 

     protected override void OnStop() 
     { 
     } 
    } 
} 
+2

Zakładając, że nie powiedzie się "wiele plików", czy jest coś "innego" na temat tych, które przekazują DO? (np. liczba arkuszy, liczba rekordów w arkuszu [Raporty] ...). Najgorszy przypadek, bliżej przyjrzyj się uszkodzonemu i OK: rozpakuj je i porównaj wszystkie (odpowiednie) pliki. PS: W moim (ograniczonym) doświadczeniu, ładowanie danych z programu Excel przez może się nie udać z powodu pewnych ustawień regionalnych (na serwerze I/LUB na komputerach klienckich). PS: Nie sądzę, aby miało to znaczenie, ponieważ działało w przeszłości; ale czy połączenie nie powinno "Excel 12.0 Xml"? https://www.connectionstrings.com/ace-oledb-12-0/ – deroby

+0

@deroby Dzięki za komentarz sir. Czy możesz rzucić nieco światła na regionalne ustawienia, które powodują ten problem? – METALHEAD

+1

Również moje stany ciągów połączeń: 'string excelConnectionString = @" Dostawca = Microsoft.ACE.OLEDB.12.0; Źródło danych = "+ ścieżka +", Właściwości rozszerzone = \ "Excel 12.0; HDR = Tak; IMEX = 1 \" ; ";' Istnieje \ przed i po 'Excel 12.0; HDR = Tak; IMEX = 1'. Czy to powoduje kłopot ... ?? – METALHEAD

Odpowiedz

0

Patrząc na this question, to wydaje się być problem z odczytu pliku Excel nie tabeli SQL. Spróbuj zmienić ciąg połączenia programu Excel.

string excelConnectionString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + path + ";Extended Properties=\"Excel 12.0;HDR=Yes;IMEX=1\";"; 

do

string excelConnectionString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + path + ";Extended Properties=Excel 12.0;HDR=Yes;IMEX=1\"; 

Ponadto, patrząc na another answer, przyczyną może być przesłaniem nowszych wersjach programu Excel.

Powiązane problemy