2011-12-29 94 views
3

一個我的問題是,我不認爲表中有一個名字......它只是一個.dbf文件如何將列添加到.DBF文件?

所以我一直想這樣的:

public void SQLAlter(string dbffile, string ColumnName) 
{ 
    //dbffile is "C:\MAPS\WASHINGTON\TLG_ROADS_L.DBF" 
    //ColumnName is "State" 
    if (File.Exists(dbffile)) 
    { 
     System.Data.Odbc.OdbcConnection conn = new System.Data.Odbc.OdbcConnection(); 
     conn.ConnectionString = @"DSN=dBase Files"; 
     conn.Open(); 
     System.Data.Odbc.OdbcCommand comm = new System.Data.Odbc.OdbcCommand(); 
     comm.CommandText = "ALTER TABLE " + dbffile + " ADD COLUMN " + ColumnName + " VARCHAR(1024)"; 
     comm.ExecuteNonQuery(); 
    } 
} 

的錯誤是:

基地{System.Data.Common.DbException} = { 「ERROR [42S02] [微軟] [ODBC dBase驅動程序]找不到表或約束。」}

+0

什麼dbffile的價值,它存在嗎? – 2011-12-29 16:19:24

+0

@Rob A我更新了我的問題,簡短回答是的。 – 0x4f3759df 2011-12-29 16:27:04

+0

@marc_s - ODBC根據連接字符串中的'DSN'的值將命令轉換爲函數調用或供應商特定的SQL。 – 2011-12-29 17:05:34

回答

1

這實際上是正確的語法

comm.CommandText = "ALTER TABLE " + dbffile + " ADD COLUMN " + ColumnName + " VARCHAR(1024)"; 

但是,如果你的文件名是超過8個字符也不會發現它。即使我嘗試了一個合適的長度文件名,「在包含數據的表上不支持」Operation [is]。「

各種互聯網鏈接似乎表明,必須創建一個新表,並複製所有字段。

2

我相信表名應該是文件名,並且連接字符串應該指向包含dbf文件的文件夾。

var path = Path.GetDirectoryName(dbffile); 
var tableName = Path.GetFileName(dbffile); 
// ... 
conn.ConnectionSTring = @"Driver={Microsoft dBASE Driver (*.dbf)};DriverID=277;Dbq=" + path; 
comm.CommandText = "ALTER TABLE " + tableName + //... 

檢查connectionstrings.com:http://connectionstrings.com/dbf-foxpro

+0

更正連接...連接字符串應該指向文件所在的PATH,而不是特定的DBF文件。此外,對於@iterationx,如果連接沒有「EXCLUSIVE」使用,則會失敗。 – DRapp 2012-01-03 17:50:57

0

嘗試另一個提供程序。

它用Visual Foxpro提供程序 爲我工作conn.ConnectionString = @「Provider = VFPOLEDB.1; Data Source = Themes.dbf」+ @「\; Extended Properties = dBase IV」;

如果驅動程序是不是你的機器上安裝,你在這裏: http://www.microsoft.com/en-us/download/details.aspx?id=14839