Странная ошибка с dBase IV, не удается получить *.dbf как табличный объект

Я пытаюсь использовать файл *.dbf (dBase IV), чтобы получить из него некоторые необходимые геоданные (шейп-файлы).

Странно то, что провайдер dBase JET OleDb 4.0 говорит мне, что такого объекта нет, но он существует!

Доказательство:

http://s21.postimg.org/eaj4h91uv/image.png

Исходный код:

    static void Test()
    {
        const string path = "C:\\buildings.dbf";
        string conStr = String.Format("Provider = Microsoft.Jet.Oledb.4.0; Data Source = {0}; Extended Properties = \"dBase IV\"", Path.GetDirectoryName(path));

        var connection = new OleDbConnection(conStr);
        connection.Open();

        var command = new OleDbCommand(string.Format("select NAME from {0}", Path.GetFileName(path)), connection);

        using (var reader = command.ExecuteReader())
        {
            while (reader.Read())
            {
                var str = (string)reader["NAME"];
            }
        }

        connection.Close();
    }

    static void Main()
    {
        try
        {
            Test();
        }
        catch (Exception exc)
        {
            Console.WriteLine(exc);
        }
    }

person Community    schedule 03.10.2013    source источник
comment
Звучит какой-то маленький путь, вы проверили сгенерированный путь, соответствующий вашему локальному пути?   -  person Sakthivel    schedule 03.10.2013
comment
Доказательство @codebrain показано на скриншоте, в строке подключения требуется точно использовать путь-папку, а не путь-файл провайдером JET/dBase, и использовать файл точно в теле SQL-запроса, он должен выглядеть как select SOMEFIELD from file.dbf   -  person    schedule 03.10.2013


Ответы (1)


ПОКАЗЫВАЕТСЯ, что у вас хорошая строка подключения... Строка подключения должна указывать ТОЛЬКО на ПУТЬ, где расположены файлы .dbf. Тем не менее, даже в качестве теста наличие этого файла .dbf в КОРНЕ C:\ МОЖЕТ представлять проблему, я бы для ухмылки просто переместил его в подпапку от корня, например C:\TEST\ здания.dbf

Затем запрос, когда соединение открыто для текущего «пути», может видеть любую таблицу .dbf на этом пути. Вам нужно только

var command = new OleDbCommand("select NAME from buildings", connection);

".dbf" подразумевается для запроса. Единственная другая проблема, которая МОЖЕТ вызвать проблему, заключается в том, что «ИМЯ» является зарезервированным словом и, вероятно, нуждается в name (тиках), обернутых вокруг него, чтобы он знал фактическое ИМЯ КОЛОНКИ, а не зарезервированное слово.

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

person DRapp    schedule 04.10.2013