С# Открыть файл DBF

У меня проблема с открытием файла DBF - мне нужно его открыть, все прочитать и обработать. Я пробовал несколько решений (ODBC/OLEDB), несколько строк подключения, но пока ничего не помогло.

Проблема в том, что когда я выполняю команду SQL, чтобы получить все из файла, ничего не возвращается - нет строк. Что еще более странно, содержимое открываемого файла DBF удаляется.

Смотрите код, который у меня есть:

public override bool OpenFile(string fileName, string subFileName = "")
{
    OleDbConnection con = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + Path.GetDirectoryName(fileName) + ";Extended Properties=dBASE IV;User ID=;Password=;");
    try
    {
        if (con.State == ConnectionState.Closed) { con.Open(); }
        OleDbDataAdapter da = new OleDbDataAdapter("select * from " + Path.GetFileName(fileName), con);
        DataSet ds = new DataSet();
        da.Fill(ds);
        con.Close();
        int i = ds.Tables[0].Rows.Count;
        return true;
    }
    catch
    {
        return false;
    }             
}

Я отлаживал код и смотрел, как файл открывается в проводнике Windows. Когда он достиг этой строки:

da.Fill(ds);

размер файла сократился до нескольких байтов (с сотен килобайт).

Следующей моей мыслью было сделать файл DBF доступным только для чтения. Однако это вызывает «неожиданное исключение из внешнего драйвера».

Итак, мой вопрос - какого черта? Я уверен, что файл не поврежден, это прямой экспорт из какой-то БД. (Нет, у меня нет доступа к этой БД). Я также могу открыть этот файл в MS Office без проблем.

Я не могу поделиться файлом DBF — он содержит конфиденциальные данные.


person Tomáš Bezouška    schedule 03.11.2011    source источник
comment
Вы пытались выполнить DbCommand (SELECT * FROM) вместо использования адаптера данных? Просто проверить, работает ли он.   -  person Filip Popović    schedule 03.11.2011
comment
Глупый вопрос, а понимает ли драйвер Jet файлы DBF?   -  person arx    schedule 03.11.2011
comment
Освободите адаптер и упростите SQL. В настоящее время включает .DBF. Также вы можете получить свойства открытого соединения.   -  person Henk Holterman    schedule 03.11.2011
comment
Я попробовал версию DbCommand, тот же результат. Я также исключил расширение из имени файла, также тот же результат. Я думаю, я должен использовать неправильный драйвер ...   -  person Tomáš Bezouška    schedule 04.11.2011


Ответы (2)


Две вещи... только потому, что расширение файла .DBF может означать, что это файл Dbase IV. На самом деле это может быть Visual Foxpro. Тем не менее, я хотел бы загрузить и установить драйвер Visual Foxpro OleDB из загрузки Microsoft. . Затем OleDbConnection указывает на путь, по которому находятся фактические таблицы (у вас это уже есть).

Сам запрос не должен заботиться о расширении, поэтому я бы изменил ваш вызов, чтобы получить только имя через «Path.GetFileNameWithoutExtension».

Это может быть комбинация этих двух.

Строка подключения для провайдера VFP

"Provider=VFPOLEDB.1;Data Source=" + FullPathToDatabase
person DRapp    schedule 03.11.2011
comment
Я установил драйвер, на который вы ссылаетесь, но я получаю, что драйвер не зарегистрирован на вашем ПК... Что еще мне нужно сделать, кроме его установки? - person Tomáš Bezouška; 04.11.2011
comment
@TomášBezouška, тебе не нужно больше ничего делать. На каком типе машины вы работаете? Это 64 бит? Если 64 бита, то это ваши проблемы. Старые драйверы DBF никогда не обновлялись до 64-битной версии и, как известно, не работали. Вы устанавливали с правами администратора, чтобы он правильно зарегистрировался в реестре? - person DRapp; 04.11.2011
comment
Я работаю на Windows 7, 32 бит. Я также пробовал версию без .1, но безуспешно. Я даже пытался перезагрузить, ничего. Где в системе я могу увидеть, успешно ли он зарегистрирован? - person Tomáš Bezouška; 05.11.2011

Это не точный ответ, но он поможет вам найти проблему.

Попробуйте указать встроенную строку подключения и выберите запрос, чтобы убедиться, что проблема не в их создании. Перехватите исключение и проверьте его детали.

OleDbConnection con = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\folder;Extended Properties=dBASE IV;User ID=;Password=;"); // give your path directly 
try
{
    con.Open();
    OleDbDataAdapter da = new OleDbDataAdapter("select * from tblCustomers.DBF", con); // update this query with your table name 
    DataSet ds = new DataSet();
    da.Fill(ds);
    con.Close();
    int i = ds.Tables[0].Rows.Count;
    return true;
}
catch(Exception e)
{
    var error = e.ToString();
    // check error details 
    return false;
}
person Damith    schedule 03.11.2011
comment
Только если есть исключение, не указанное в вопросе. - person Henk Holterman; 04.11.2011
comment
он не выдает никаких исключений. Только когда я отмечаю файл только для чтения, как указано в моем исходном сообщении - person Tomáš Bezouška; 04.11.2011