C# Открыть файл 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 - он содержит конфиденциальные данные.

2 ответа

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

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

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

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

"Provider=VFPOLEDB.1;Data Source=" + FullPathToDatabase

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

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

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;
}
Другие вопросы по тегам