创建dBase文件偶尔抛出异常

时间:2013-10-09 09:36:36

标签: c# oledb shapefile dbase

我在导出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软件。

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

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

但是,如果这对您不起作用,您可能需要查看another post我回答了很长一段时间也是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();
}