OleDB: отображение типа DBF - PullRequest
       3

OleDB: отображение типа DBF

3 голосов
/ 06 октября 2011

Я пытаюсь прочитать файл DBF. Прежде чем читать данные в нем, я анализирую таблицу его схем, чтобы не прочитать неправильный файл. Когда я анализирую его, я проверяю имена его столбцов и их типы. Моя проблема заключается в том, что в некоторых системах определенное поле отображается на System.Double, а в других - на System.Int16. Фактически, фактический тип этого поля (как видно из DBFNavigator) является числовым (4,0). Я написал тестовое приложение для проверки этих dbf-файлов на стороне клиента. Это класс, который выводит схему dbf:

public class DBFAnalyzerCore:IDisposable
{
    private OleDbConnection _connection;
    private bool _keyInfo;
    private string _fileName;
    bool _bDisposed;

    public DBFAnalyzerCore(string path, bool keyInfo)
    {
        _connection = new OleDbConnection(
            String.Format(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};Extended Properties=dBASE IV;User ID=Admin;Password=",
            System.IO.Path.GetDirectoryName(path)));

        _connection.Open();
        _keyInfo = keyInfo;
        _fileName = System.IO.Path.GetFileName(path);
    }

    public void Analyze(StringBuilder result)
    {
        OleDbCommand command = null;
        IDataReader reader = null;

        try
        {
            command = new OleDbCommand(String.Format("SELECT * FROM [{0}]", _fileName), _connection);

            if (_keyInfo)
                reader = command.ExecuteReader(CommandBehavior.KeyInfo);
            else
                reader = command.ExecuteReader();

            DataTable schema = reader.GetSchemaTable();
            OutputShema(schema, result);

        }
        finally
        {
            if (reader != null) reader.Close();

            if (command != null) command.Dispose();
        }
    }

    private void OutputShema(DataTable schema, StringBuilder sb)
    {
        foreach (DataRow row in schema.Rows)
        {
            sb.AppendLine(String.Format("{0} - {1}", row["ColumnName"], row["DataType"]));
        }
    }

    protected virtual void Dispose(bool bDisposing)
    {
        if (bDisposing)
        {
            _connection.Dispose();
            _bDisposed = true;
        }
    }

    public void Dispose()
    {
        Dispose(true);

        GC.SuppressFinalize(this);
    }
}

В результате на клиентской системе показывался System.Int16. Система Win7 x64. HKEY_LOCAL_MACHINE \ Software \ Microsoft \ DataAccess \ Версия "6.1.7601.17514". То же самое мое, но я получаю System.Double! В то же время на «новой» системе клиентов показывался System.Double. Какие настройки / настройки могли быть причиной этого? Я понимаю, что теперь я должен удалить проверку типов столбцов, но из-за нашей политики управления версиями я не могу сделать это прямо сейчас.

...