2015-10-14 42 views
0

目前我正在製作一個程序來從多個dBase文件(.dbf)導入值。我已經有一個充滿字符串的列表,它具有dBase文件的名稱。該列表被命名爲FicheirosParaAnalisar。 dBase文件並不總是具有相同的行,但它們具有所有相同的列,並且我想從一個名爲sigla_parametro的特定列中獲得相同的值。與dBASE filse在path9我的代碼現在是這樣的:關於閱讀C#中的多個.dbf文件

private void button6_Click(object sender, EventArgs e) 
    { 
     ///* 

     //Console.WriteLine(sigla_parametro); 
     try 
     { 
      parametro = comboBox12.Text; //Console.WriteLine(parametro); 

      for (int FA = 0; FA < FicheirosParaAnalisar.Count; FA++) 
      { 
       //Console.WriteLine(FicheirosParaAnalisar[FA]+".dbf"); 

       if (importar == true) 
       { 
        //........................................................................ 
        string connectionStringTotal = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + path9 + ";Extended Properties=dBASE III;"; 

        OleDbConnection connectionsTotal = new OleDbConnection(connectionStringTotal); 
        connectionsTotal.Open(); 

        // Comando de aquisição dos dados da Base de Dados 
        string Comand_Strings_Total = "Select * From [" + FicheirosParaAnalisar[FA] + "]"; 

        OleDbDataAdapter DataAdaptersTotal = new OleDbDataAdapter(Comand_Strings_Total, connectionsTotal); 
        DataSet datasetsTotal = new DataSet(); 
        DataAdaptersTotal.Fill(datasetsTotal); 

        // Obter os valores dos parâmetros 
        int count = datasetsTotal.Tables[0].Rows.Count; 
        for (int i = 0; i < count; i++) 
        { 
         try 
         { 
          valores_parametro.Add(FicheirosParaAnalisar[FA] + "_" + datasetsTotal.Tables[0].Rows[i][sigla_parametro].ToString()); 
         } 
         catch (System.Data.OleDb.OleDbException exe) 
         { 
          string text = "[MPA5 - " + DateTime.Now.ToString() + "] Excepção encontrada: " + exe.Message + "\n"; 
          System.IO.File.AppendAllText(log, text); 
         } 
         catch (Exception lolex) 
         { 
          string text = "[MPA5 - " + DateTime.Now.ToString() + "] Excepção encontrada: " + lolex.Message + "\n"; 
          System.IO.File.AppendAllText(log, text); 
         } 
        } 
        count = 0; 
       } 
       Console.WriteLine("Ficheiro nº " + FA + " Importado!"); 
      } 
     } 
     catch (Exception ex) 
     { 
      string text = "[MPA5 - " + DateTime.Now.ToString() + "] Excepção encontrada: " + ex.Message + "\n"; 
      System.IO.File.AppendAllText(log, text); 
     } 

     //*/ 

     valores_parametro.ForEach(Console.WriteLine); 

     button1.Enabled = true; 
    } 

這上面的代碼只有當我發現所有的dBASE文件計算(如果是這樣的變量importar爲真)。從理論上講,我所做的一切都是正確的,因爲文件存在並且我已經正確地分配了每個變量,但是實際上我在代碼中遇到了問題,因爲當我讀取所有dBase文件時,某些文件無法讀取,異常出現,我可以在我的LogFile.txt中看到。出現的消息是:

A first chance exception of type 'System.Data.OleDb.OleDbException' occurred in System.Data.dll 

現在我想問問你在C#中的Stackoverflow的專家,我做錯了什麼?我怎樣才能從列sigla_parametro到列表字符串valores_parametro的所有數據?我如何解決我的異常?

注: 我也試着使用此連接字符串

string connectionStringTotal = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + path9 + ";Extended Properties=dBASE IV;"; 

字符串path9是路徑到包含我所有的dBase文件的文件夾。

string path9 = "C:\\ProgramData\\CK electronic\\MPA5\\Data"; 

字符串列表FicheirosParaAnalisar有這個字符串:

CL-1831-150615-1 
CL-1831-150615-2 
CL-1831-150615-3 
CL-1831-150615-4 
CL-1831-150615-5 
CL-1832-150611-1 
CL-1832-150611-2 
CL-1832-150611-3 
CL-1832-150611-4 
CL-1832-150611-5 
CL-1833-150611-1 
CL-1833-150611-2 
CL-1833-150611-3 
CL-1833-150611-4 
CL-1833-150611-5 
CL-1834-150611-1 
CL-1834-150611-2 
CL-1834-150611-3 
CL-1834-150611-4 
CL-1834-150611-5 
CL-1835-150611-1 
CL-1835-150611-2 
CL-1835-150611-3 
CL-1835-150611-4 
CL-1835-150611-5 
CL-1836-150612-1 
CL-1836-150612-2 
CL-1836-150612-3 
CL-1836-150612-4 
CL-1836-150612-5 
CL-1837-150618-1 
CL-1837-150618-2 
CL-1837-150618-3 
CL-1837-150618-4 
CL-1837-150618-5 
CL-1838-150611-1 
CL-1838-150611-2 
CL-1838-150611-3 
CL-1838-150611-4 
CL-1838-150611-5 
CL-1839-150617-1 
CL-1839-150617-2 
CL-1839-150617-3 
CL-1839-150617-4 
CL-1839-150617-5 
CL-1840-150611-1 
CL-1840-150611-2 
CL-1840-150611-3 
CL-1840-150611-4 
CL-1840-150611-5 
CL-1841-150611-1 
CL-1841-150611-2 
CL-1841-150611-3 
CL-1841-150611-4 
CL-1841-150611-5 
CL-1842-150611-1 
CL-1842-150611-2 
CL-1842-150611-3 
CL-1842-150611-4 
CL-1842-150611-5 
CL-1843-150612-1 
CL-1843-150612-2 
CL-1843-150612-3 
CL-1843-150612-4 
CL-1843-150612-5 
CL-1844-150616-1 
CL-1844-150616-2 
CL-1844-150616-3 
CL-1844-150616-4 
CL-1844-150616-5 
CL-1844-150616-6 
CL-1845-150615-1 
CL-1845-150615-2 
CL-1845-150615-3 
CL-1845-150615-4 
CL-1845-150615-5 
CL-1846-150616-1 
CL-1846-150616-2 
CL-1846-150616-3 
CL-1846-150616-4 
CL-1847-150612-1 
CL-1847-150612-2 
CL-1847-150612-3 
CL-1847-150612-4 
CL-1847-150612-5 
CL-1848-150612-1 
CL-1848-150612-2 
CL-1848-150612-3 
CL-1848-150612-4 
CL-1848-150612-5 
CL-1850-150617-1 
CL-1850-150617-2 
CL-1850-150617-3 
CL-1850-150617-4 
CL-1850-150617-5 
CL-1851-150616-1 
CL-1851-150616-2 
CL-1851-150616-3 
CL-1851-150616-4 
CL-1851-150616-5 
CL-1852-150612-1 
CL-1852-150612-2 
CL-1852-150612-3 
CL-1852-150612-4 
CL-1852-150612-5 
CL-1853-150616-1 
CL-1853-150616-2 
CL-1853-150616-3 
CL-1853-150616-4 
CL-1853-150616-5 
CL-1854-150615-1 
CL-1854-150615-2 
CL-1854-150615-3 
CL-1854-150615-4 
CL-1854-150615-5 
CL-1855-150616-1 
CL-1855-150616-2 
CL-1855-150616-3 
CL-1855-150616-4 
CL-1855-150616-5 
CL-1856-150615-1 
CL-1856-150615-2 
CL-1856-150615-3 
CL-1856-150615-4 
CL-1856-150615-5 
CL-1857-150616-1 
CL-1857-150616-2 
CL-1857-150616-3 
CL-1857-150616-4 
CL-1857-150616-5 
CL-1858-150618-1 
CL-1858-150618-2 
CL-1858-150618-3 
CL-1858-150618-4 
CL-1858-150618-5 
CL-1860-150618-1 
CL-1860-150618-2 
CL-1860-150618-3 
CL-1860-150618-4 
CL-1860-150618-5 
CL-1861-150618-1 
CL-1861-150618-2 
CL-1861-150618-3 
CL-1861-150618-4 
CL-1861-150618-5 
CL-1862-150618-1 
CL-1862-150618-2 
CL-1862-150618-3 
CL-1862-150618-4 
CL-1862-150618-5 
CL-1863-150618-1 
CL-1863-150618-2 
CL-1863-150618-3 
CL-1863-150618-4 
CL-1863-150618-5 

這是要告訴你,我有管理員permition閱讀,文件夾中寫入數據的關鍵!

回答

0

沒有你的實際變量的樣本,我會提出這個問題,並認爲它可能是你的答案。

您的OleDb連接字符串應該指向PATH ONLY表所在的位置,而不是PATH + TABLE NAME。一旦連接到路徑,你可以在道路範圍內查詢任何表...

例如:

string connectionStringTotal = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\SomePathToYourData;Extended Properties=dBASE III;"; 

OleDbConnection connectionsTotal = new OleDbConnection(connectionStringTotal); 
connectionsTotal.Open(); 

然後,您可以

string Comand_Strings_Total = "Select * From Table1"; 
string Comand_Strings_Total = "Select * From Table2"; 
string Comand_Strings_Total = "Select * From Table3"; 

(或建成你擁有它你for循環)

因此,如果你曾經需要連接表,你可以如

select T1.*, T2.* 
    from Table1 T1 
     JOIN Table2 T2 
     on T1.Key = T2.MatchingKey 

兩個表都駐留在同一個文件夾中。

好吧,你的路徑變量只是路徑......過去有好幾次,其他人有誤連接到INCLUDE dbf。

至於你的表名,它們中都有「 - 」可能是什麼阻塞OleDb提供者。是的,你在桌子周圍有[方括號],但也許這可能不夠好。您可能需要將其更改爲報價,甚至可能添加「別名」您查詢......也許是這樣..

// This version uses double-quotes around the table name 
string Comand_Strings_Total = string.Format("Select * From \"{0}\" ", FicheirosParaAnalisar[FA]); 

或這增加了對查詢的別名「TMP」的參考。

string Comand_Strings_Total = string.Format("Select tmp.* From \"{0}\" tmp", FicheirosParaAnalisar[FA]); 

如果STILL錯誤,文件具體是dBASE,還是隻是.dbf。您可以通過下載Microsoft的Visual Foxpro OleDb數據提供程序來獲得它。連接,命令,數據適配器的其餘OleDb上下文是相同的。它可能會爲您提供更好的連接選項。只需要更改提供程序連接字符串。到

@"Provider=VFPOLEDB.1;Data Source=c:\\YourDataPath\\SomeSubFolder;"; 

VFP OleDb Provider Download

+0

請參閱我的回答下面你的問題,因爲它是太長了評論:) – user3664117

+0

@ user3664117,修訂後的我的答案...在未來,而不是發佈一個答案你自己的問題澄清,你可以隨時編輯您的原始帖子,並添加到你的答案的細節內容。下面。 – DRapp

+0

我很抱歉我的回答DRapp,我是這個社區的新手。我會嘗試你的解決方案。謝謝隊友:) – user3664117