1

*.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);
        }
    }
4

1 に答える 1

1

適切な接続文字列があるようです...接続文字列は、.dbf ファイルが配置されているパスのみを指す必要があります。ただし、テストとしても、この .dbf ファイルを C:\ のルートに置くと問題が発生する可能性があります。C:\TEST\ などのルートから離れたサブフォルダーに移動するだけです。建物.dbf

次に、現在の「パス」への接続が開かれると、クエリはそのパス内の任意の .dbf テーブルを確認できます。あなただけが必要なはずです

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

「.dbf」はクエリ用に暗示されています。問題を引き起こしている可能性のある他の唯一の問題は、「NAME」が予約語であり、予約語でnameはなく実際の COLUMN NAME を認識できるように (ティック) で囲む必要があることです。

プロバイダーによっては目盛りに問題がある場合があるため、代わりに [name] 角かっこで囲む必要がある場合があります。

于 2013-10-04T13:55:33.910 に答える