0

我在导出 shapefile 数据时无法创建 dbf 文件。大多数情况下它可以工作,但有时它只会引发以下错误,即使该文件尚不存在:

Microsoft Jet 数据库引擎无法打开文件“C:\Test\258ba2f1-cc05-4a21-a047-ef060c46a3ca\data\tablename.DBF”。它已被其他用户独占打开,或者您需要权限才能查看其数据。

代码看起来像这样:

using (var dBaseConnection = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + databasePath + ";Extended Properties=dBASE IV;"))
        {
            var createTableString = "Create Table " + tableName + ".dbf (p_id char(10), answered char(20), mnote char(50), descr char(50), grade char(50))";

            var cmd = new OleDbCommand(createTableString, dBaseConnection);

            dBaseConnection.Open();
            cmd.ExecuteNonQuery();

这只发生在我使用 Microsoft Jet 数据库引擎时。使用 Visual FoxPro 会创建一个名为“_NullFlags”的附加列,并且 dbf 文件不适用于任何 GIS 软件。

有任何想法吗?

4

1 回答 1

1

您可能想要做的是让“模板”表结构始终可用且从未在生产中使用。然后,只需将该模板表复制到您需要的新表名即可。然后,您可以查询和连接并对该文件版本执行任何操作。此外,您可以将文件扩展名从 .DBF 重命名为任何名称,例如 YourTable.GISDBF,这样其他应用程序甚至不会意外打开它。

但是,如果这对您不起作用,您可能想查看我在很久以前回答的另一篇文章,它也是 Jet 引擎的问题。在这种情况下,我使用 VFP OleDb 驱动程序并使用 ExecScript()。您可以编写命令行语句,然后像执行程序一样执行它们。就创建表而言,您始终可以执行诸如创建 CURSOR 之类的操作,然后以“TYPE FOXPLUS”的形式复制到目标表中,这会将其转换为 GIS 也可以读取的旧支持文件格式。

string VFPScript  = "ExecScript( "
      + "[create cursor C_Tmp ( fld1 i, fld2 c(50), fld3 c(10) )] +chr(13)+chr(10)+ "
      + "[copy to '" + YourFileNameVariable + "' type FoxPlus] ";

// put this script into command object, then execute it...
using (OleDbCommand comm = new OleDbCommand( VFPScript, connection))
{
    comm.ExecuteNonQuery();
}
于 2013-10-09T12:39:56.877 回答