2013-10-09 65 views
0

我在導出shapefile數據時無法創建dbf文件。大多數時候它的工作原理,但有時它只會拋出以下錯誤,即使該文件還不存在:偶爾創建dBase文件拋出異常

Microsoft Jet數據庫引擎無法打開文件'C:\ Test \ 258ba2f1 -cc05-4a21-A047-ef060c46a3ca \數據\ 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

您可能想要做的是讓「模板」表格結構始終可用並且從未在生產中使用。然後,只需將該模板表複製到您的新表名稱所需的任何位置即可。然後,您可以查詢和連接,並使用該文件版本執行任何操作。另外,您可以將文件擴展名從.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(); 
}