О чтении нескольких файлов .dbf на C #

В настоящее время я делаю программу для импорта значений из нескольких файлов dBase (.dbf). У меня уже есть список, полный строк с именами файлов dBase. Этот список называется FicheirosParaAnalisar. Файлы dBase не всегда имеют одинаковые строки, но все они имеют одинаковые столбцы, заполненные значениями, которые я хочу получить из одного конкретного столбца с именем sigla_parametro. Файлы dBase находятся в path9 Мой код сейчас выглядит примерно так:

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

Теперь я хочу спросить вас, экспертов из Stackoverflow в C #, что я делаю не так? Как мне перенести все данные из столбца 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

Очень важно сообщить вам, что у меня есть разрешение администратора на чтение и запись данных в папке!


person user3664117    schedule 14.10.2015    source источник


Ответы (1)


Не имея образца ваших реальных переменных, я бы поставил этот вопрос и подумал, что это МОЖЕТ быть вашим ответом.

Строка подключения OleDb должна указывать ТОЛЬКО на ПУТЬ, где расположены таблицы, а НЕ ПУТЬ + ИМЯ ТАБЛИЦЫ. После подключения к PATH вы можете запросить ЛЮБУЮ таблицу по этому пути ...

ex:

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

Обе таблицы находятся в одной папке.

Хорошо, что ваша переменная пути - это просто путь ... несколько раз в прошлом другие по ошибке подключались к ВКЛЮЧЕНИЮ dbf.

Что касается имен ваших таблиц, все они со знаком «-», вероятно, мешают поставщику OleDb. Да, у вас есть [квадратные скобки] вокруг стола, но, возможно, этого недостаточно. Возможно, вам придется изменить его на QUOTES и, возможно, даже добавить к вашему запросу "псевдоним" ... Может быть, что-то вроде ..

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

или это, которое добавляет ссылку ALIAS "tmp" для запроса.

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

Если ошибка ВСЕ ЕЩЕ, это файлы конкретно dBASE или просто .dbf. Вы МОЖЕТЕ заставить его работать, загрузив Microsoft Visual Foxpro OleDb Data Provider. В остальном контекст подключения OleDb, команды, адаптер данных такие же. Это просто может предоставить вам лучшие варианты подключения. Просто нужно изменить строку подключения к провайдеру. к

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

Загрузка поставщика VFP OleDb

person DRapp    schedule 14.10.2015
comment
Пожалуйста, посмотрите мой ответ на ваш вопрос ниже, так как комментировать было слишком долго :) - person user3664117; 14.10.2015
comment
@ user3664117, пересмотрел мой ответ ... и в будущем, вместо того, чтобы публиковать ответ на свой собственный вопрос для уточнения, вы всегда можете ИЗМЕНИТЬ свой исходный пост и добавить в него подробный контент, как вы разместили в своем ответе. ниже. - person DRapp; 14.10.2015
comment
Прошу прощения за свой ответ DRapp, я новичок в этом сообществе. Я попробую ваше решение. Спасибо друг :) - person user3664117; 14.10.2015
comment
Использовали ваши строки подключения и получили то же исключение, что и раньше. Не вижу, в чем проблема :( - person user3664117; 14.10.2015
comment
@ user3664117, см. окончательное редактирование моего сообщения об изменении поставщика данных / строки подключения. - person DRapp; 14.10.2015