1

我正在尝试使用 *.dbf (dBase IV) 文件从中获取一些所需的地理数据(shapefile)。

奇怪的是 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);
        }
    }
4

1 回答 1

1

看来您有一个良好的连接字符串...连接字符串应仅指向 .dbf 文件所在的路径。但是,即使作为测试,在 C:\建筑物.dbf

接下来,一旦连接打开到当前“路径”的查询,它可以看到该路径中的任何 .dbf 表。你应该只需要

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

“.dbf”隐含用于查询。可能导致问题的唯一其他问题是“NAME”是保留字,可能需要name(抽动)包裹它,因此它知道实际的列名而不是保留字。

不同的提供商可能对 tic 标记有疑问,因此您可能需要用 [name] 方括号括起来。

于 2013-10-04T13:55:33.910 回答