Ошибка файла C # DBF System.Data.OleDb.OleDbException

Я работаю над программой C #, которая будет читать файлы DBF и импортировать таблицы в базу данных MySQL. Я могу получить каталог, в котором находятся все файлы DBF, и прочитать большинство файлов DBF. Проблема в том, что 2 из 17 файлов DBF вызовут исключение с myDataAdapter.Fill (myDataSet);

Вот мой код:

private void button2_Click(object sender, EventArgs e)
{
    DirectoryInfo dir = new DirectoryInfo(Regex.Replace(textBox1.Text, @"\\", @"\\"));
    string strAccessConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + dir + ";Extended Properties=dBase III";
    DataSet myDataSet = new DataSet();
    OleDbConnection myAccessConn = null;

    try
    {
        myAccessConn = new OleDbConnection(strAccessConn);
    }
    catch (Exception ex)
    {
        Console.WriteLine("Error: Failed to create a database connection. \n{0}", ex.Message);
        return;
    }

    foreach (FileInfo file in dir.GetFiles())
    {
        MessageBox.Show(file.Name.Substring(0, file.Name.Length - 4));
        string strAccessSelect = "SELECT * FROM " + file.Name.Substring(0, file.Name.Length - 4);
        OleDbCommand myAccessCommand = new OleDbCommand(strAccessSelect, myAccessConn);
        OleDbDataAdapter myDataAdapter = new OleDbDataAdapter(myAccessCommand);

        myAccessConn.Open();
        myDataAdapter.Fill(myDataSet);

        myAccessConn.Close();

    }
    MessageBox.Show("End");
}

Это сообщение об ошибке:

Необработанное исключение типа System.Data.OleDb.OleDbException произошло в System.Data.dll

Дополнительная информация: ядру базы данных Microsoft Jet не удалось найти объект SomeFile. Убедитесь, что объект существует и вы правильно написали его имя и путь.

Чем это вызвано? Я распечатал dir, file.name и strAccessSelect, и все выглядит правильно.

Любая помощь будет принята с благодарностью, спасибо!

--ОБНОВИТЬ--

Я проверил права доступа к файлам, и у каждого пользователя есть полные права.

Не уверен, насколько это поможет, но иногда, когда я переименовываю файл (например, SomeFile1), он работает, и я не получаю сообщения об ошибке ... В большинстве случаев это не сработает.


person user908759    schedule 21.01.2014    source источник
comment
Было бы полезно посмотреть, как вы строите строку strAccessSelect   -  person Steve    schedule 22.01.2014
comment
@ Стив Вау, как я мог забыть, может быть, самую важную часть ... Обновлено.   -  person user908759    schedule 22.01.2014


Ответы (2)


Я бы попытался использовать Path.GetFileNameWithoutExtension, чтобы убедиться в правильности имени файла.

string strAccessSelect = "SELECT * FROM " + Path.GetFileNameWithoutExtension(file.Name);
OleDbCommand myAccessCommand = new OleDbCommand(strAccessSelect, myAccessConn);

И если это не сработает, единственная возможная причина - это файл, заблокированный другим процессом, или проблема с разрешением.

person Steve    schedule 21.01.2014

Проблема заключалась в strAccessConn. Мне пришлось использовать следующий код:

if ((file.Name.Substring(0, file.Name.Length - 4) == "SomeFile1") || (file.Name.Substring(0, file.Name.Length - 4) == "SomeFile2"))
{
    strAccessConn = @"Provider=vfpoledb;Data Source=" + dir + ";Collating Sequence=machine;";
}
else
{
    strAccessConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + dir + ";Extended Properties=dBase IV";
}

Для каждого файла требовалась отдельная строка подключения

person user908759    schedule 24.01.2014