2013-06-04 16 views
7

Ten wyjątekSystem.Runtime.InteropServices.COMException (0x800706BA): Serwer RPC jest niedostępny. (Wyjątek od HRESULT: 0x800706BA)

System.Runtime.InteropServices.COMException (0x800706BA): 
The RPC server is unavailable. (Exception from HRESULT: 0x800706BA) 

jest odbierany w moim usługa systemu Windows, gdy go uruchomić na dowolnym komputerze, ale kiedy go przetestować w aplikacji testowej nie jest wyjątek. W moim kodzie, co robię, konwertuję dwa pliki .DAT do plików .xls. Kiedy uruchamiam usługę przez services.msc i uruchamiam usługę, działa ona przez jakiś czas, ale po aktualizacji niektórych wierszy generuje wyjątek, a potem nic się nie dzieje. Mam dwie oddzielne funkcje, które wykonują pracę oddzielnie. Przykładowy kod to:

 public void SaveData_component(string filename) 
    { 
     try 
     { 
      string filepath = System.Configuration.ConfigurationSettings.AppSettings["filepath"].ToString() + filename; 
      filepath_first = filepath; 

      object missing = Missing.Value; 
      //string getExtension = Path.GetExtension(filepath); 
      string getFilename = Path.GetFileNameWithoutExtension(filepath) + "New"; 
      string filepathNew = System.Configuration.ConfigurationSettings.AppSettings["filepath"].ToString() + getFilename + ".xls"; 

      try 
      { 
       xlAppNew1 = new Application(); 
       xlAppNew1.DisplayAlerts = true; 
       workbooks1 = xlAppNew1.Workbooks; 
       workbook1 = workbooks1.Open(@filepath, 0, true, 1, "", "", true, Microsoft.Office.Interop.Excel.XlPlatform.xlWindows, "\t", false, false, 0, true, 1, 0); 
       // xlWorkSheet1 = (Microsoft.Office.Interop.Excel.Worksheet)workbook1.Worksheets.get_Item(1); 

       xlAppNew1.ActiveWorkbook.SaveAs(@filepathNew, -4143, "", "", false, false, Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlNoChange, 
       missing, missing, missing, missing, missing); 


       string getExtension = ".xls";//Path.GetExtension(filepathnew); 
       //string getFilename = Path.GetFileNameWithoutExtension(filepathnew); 
       string connString = ""; 

       if (getExtension.ToLower() == ".xls") 
        connString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + filepathNew + ";Extended Properties=\"Excel 8.0;HDR=YES;IMEX=1;\""; 

       else 
        connString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + filepathNew + ";Extended Properties=Excel 12.0 Xml;HDR=Yes;IMEX=1;"; 

       OleDbConnection con = new OleDbConnection(connString); 

       con.Open(); 
       System.Data.DataTable dtSheet = con.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null); 
       string tname = dtSheet.Rows[0]["TABLE_NAME"].ToString(); 
       OleDbDataAdapter ad = new OleDbDataAdapter(@"Select * FROM [" + tname + "];", con); 
       DataSet dset = new DataSet(); 
       ad.Fill(dset, "ProductOrderBOM"); 
       System.Data.DataTable dt = new System.Data.DataTable(); 
       System.Data.DataTable dttocopy = new System.Data.DataTable(); 
       dt = dset.Tables["ProductOrderBOM"]; 
       if (dt != null || dt.Rows.Count > 0) 
       { 
        dttocopy.Columns.Add("Column1", typeof(string)); 
        dttocopy.Columns.Add("Column2", typeof(string)); 
        dttocopy.Columns.Add("Column3", typeof(string)); 
        dttocopy.Columns.Add("Column4", typeof(string)); 
        dttocopy.Columns.Add("Column5", typeof(string)); 
        dttocopy.Columns.Add("Column6", typeof(string)); 
        dttocopy.Columns.Add("Column7", typeof(string)); 
        dttocopy.Columns.Add("Column8", typeof(string)); 
        dttocopy.Columns.Add("Column9", typeof(string)); 

        for (int iRow = 0; iRow < dt.Rows.Count; iRow++) 
        { 

         dttocopy.Rows.Add(dt.Rows[iRow][0].ToString().Substring(3, 9), dt.Rows[iRow][0].ToString().Substring(12, 4), dt.Rows[iRow][0].ToString().Substring(16, 18), dt.Rows[iRow][0].ToString().Substring(34, 8), dt.Rows[iRow][0].ToString().Substring(42, 4), dt.Rows[iRow][0].ToString().Substring(46, 18), dt.Rows[iRow][0].ToString().Substring(64, 40), dt.Rows[iRow][0].ToString().Substring(104, 3), dt.Rows[iRow][0].ToString().Substring(107, 5)); 

        } 

        foreach (DataRow item in dttocopy.Rows) 
        { 
         if (item.ItemArray[0].ToString() != "" && item.ItemArray[5].ToString() != "" && item.ItemArray[8].ToString() != "") 
         { 
          string prdorderno = item.ItemArray[0].ToString().Trim(); 
          string materialcode = item.ItemArray[5].ToString().Trim(); 
          double qty = Convert.ToDouble(item.ItemArray[8].ToString().Trim()); 

          d1 = callprocedure(prdorderno, materialcode, Math.Round(qty, 2)); 
          if (d1 != null) 
          { 
           if (d1.Tables[0].Rows[0]["Column1"] != null) 
           { 
            WriteStuff(d1.Tables[0].Rows[0]["Column1"].ToString()); 
           } 
          } 
         } 
        } 
       } 
       d1.Clear(); 
       d1.Dispose(); 
       dset.Clear(); 
       dset.Dispose(); 
       dtSheet.Clear(); 
       dtSheet.Dispose(); 
       dt.Clear(); 
       dt.Dispose(); 
       dttocopy.Clear(); 
       dttocopy.Dispose(); 
       ad.Dispose(); 
       con.Close(); 
       con.Dispose(); 

      } 
      catch (Exception Ex) 
      { 
        WriteStuff(Convert.ToString(Ex) + "save_datacomponent function before finally"); 
      } 
      finally 
      { 
       GC.Collect(); 
       GC.WaitForPendingFinalizers(); 
       if (workbooks1 != null) System.Runtime.InteropServices.Marshal.ReleaseComObject(workbooks1); 
       if (workbook1 != null) 
       { 
        workbook1.Close(Type.Missing, Type.Missing, Type.Missing); 
        System.Runtime.InteropServices.Marshal.ReleaseComObject(workbook1); 
       } 
       if (xlAppNew1 != null) 
       { 
        xlAppNew1.Quit(); 
        System.Runtime.InteropServices.Marshal.ReleaseComObject(xlAppNew1); 
       } 


      } 

Jest to funkcja, w której praca jest wykonywana. Każda pomoc byłaby bardzo znacząca. My Writestuff() Metoda jest łowienie następujący wyjątek:

System.Runtime.InteropServices.COMException (0x800706BA): The RPC server is unavailable. (Exception from HRESULT: 0x800706BA) at Microsoft.Office.Interop.Excel.WorkbookClass.Close(Object SaveChanges, Object Filename, Object RouteWorkbook)at MyNewService.MyNewService.SaveData_component(String filename)savedata_component functionSystem.IO.FileNotFoundException: Could not find file 'C:\SUMIT\COMPONENT_TAI_PT1_RMKH_3799_20130603_030504New_03-06-2013-18-07-09-537_04-06-2013-16-42-20-194.DAT'. 

Także jeśli mogę pozbyć się jasnych metod w moim kodu i

System.Runtime.InteropServices.Marshal.FinalReleaseComObject(); 

Innym wyjątkiem jest w drodze:

System.Runtime.InteropServices.InvalidComObjectException: COM object that has been separated from its underlying RCW cannot be used.at Microsoft.Office.Interop.Excel.WorkbookClass.Close(Object SaveChanges, Object Filename, Object RouteWorkbook)at MyNewService.MyNewService.SaveData_component(String filename) 

Naprawdę nie jestem pewien, co się u diabła dzieje.

+0

Linia zaczynająca się od 'dttocopy.Rows.Add (...' jest podejrzana, ponieważ zakłada, że ​​długość znalezionego napisu jest zawsze> = 4 (używa 3 indeksu w 'SubString()'). jeśli to nie jest prawda? Dostaniesz wyjątek.Należy najpierw przetestować 'dt.Rows [iRow] [0]' długość łańcucha przed kontynuowaniem operacji 'SubString()'. – DonBoitnott

+0

Czy wychwytywania wyjątków? Czy twój 'WriteStuff() 'metoda chwytająca użyteczne informacje? – DonBoitnott

+3

Wzdychanie, te pytania nigdy się nie kończą Łatwo jest zdiagnozować problem, wystarczy Menedżer zadań. Zobaczysz dziesiątki wystąpień Excel.exe, których twój kod nie zdążył wydać. Pozbądź się globalnych zmiennych "xl" i ustaw je jako zmienne lokalne Pozbądź się wszystkich tych nieefektywnych wywołań Clear() i ReleaseComObject(). Sprawdź kod, aby upewnić się, że Excel.exe przestaje działać po wywołaniu GC.Collect + WaitForPendingFinalizers s. Wykonaj * nie * testuj kompilację debugowania, a jedynie wersję Release bez dołączonego debuggera. –

Odpowiedz

0

http://support.microsoft.com/kb/257757

Chociaż artykuł stwierdza, że ​​wsparcie dla pakietu Office 2003 została zakończona, zawartość są nadal aktualne: Microsoft nie wsparcie automatyzacji Office po stronie serwera. Nawet w automatyce po stronie klienta interfejs Office jest dość dziwaczny.

Najlepiej z biblioteką, np. Aspose lub NPOI.

Powiązane problemy