2010-09-04 74 views
4

我想這個做一個選擇,它工作得很好如何使用c#創建.dbf文件?

string str = 
    "SELECT * FROM FREE RIGHT JOIN TestTest ON FREE.DOCNO = TestTest.DOCNO"; 
DataTable dt = new DataTable(); 
OdbcDataAdapter da = new OdbcDataAdapter(str, odbconn); 
da.Fill(dt); 

我想它來創建一個.dbf和我得到這個OdbcException:

string str0 = "Create Table Persons (Name char(50), City char(50), Phone char(20), Zip decimal(5))"; 
OdbcCommand cmd = new OdbcCommand(str0, odbconn); 
cmd.ExecuteNonQuery(); 

ERROR [42000] [Microsoft] [ODBC dBase Driver]字段定義中的語法錯誤。

回答

3

您的問題由Zip decimal(5)引起,因爲ODBC dBase驅動程序不喜歡它。關閉我的頭頂,並在一個快速谷歌後,我不能拿出一個語法容忍。它接受它很愉快,如果你使用OLEDB提供程序,而不是,如下所示:雖然

using (var dBaseConnection = new OleDbConnection(
    @"Provider=Microsoft.Jet.OLEDB.4.0; " + 
    @" Data Source=C:\Users\RobertWray\Documents\dBase; " + 
    @"Extended Properties=dBase IV")) 
{ 
    dBaseConnection.Open(); 

    string createTableSyntax = 
     "Create Table Person " + 
     "(Name char(50), City char(50), Phone char(20), Zip decimal(5))"; 
    var cmd = new OleDbCommand(createTableSyntax, dBaseConnection); 
    cmd.ExecuteNonQuery(); 
} 

一個問題:要創建郵編列作爲一個小數肯定?不是美國居民,我對此信息不是100%信心滿滿,但according to Wikipedia郵政編碼可以以0開頭。將它們作爲數字數據類型存儲不會讓您準確表示。

我對通過ODBC創建表的代碼:

using (var dBaseConnection = new OdbcConnection(@"Driver={Microsoft dBASE Driver (*.dbf)};DriverID=277;Dbq=C:\Users\RobertWray\Documents\dBase;")) 
{ 
    dBaseConnection.Open(); 

    string str0 = "Create Table Person2 (Name char(50), City char(50), Phone char(20))"; 
    var cmd = new OdbcCommand(str0, dBaseConnection); 
    cmd.ExecuteNonQuery(); 
} 
+1

我做了那個拉鍊十進制(5)只是爲了測試。我仍然遇到了OleDbConnection的問題,它爲我工作的方式是 string pathFiles = Path.Combine(Application.StartupPath,「DB」); string strconn =「Driver = {Microsoft dBASE Driver(* .dbf)}; DriverID = 277;」 +「Dbq =」+ pathFiles +「;」; OdbcConnection odbconn = new OdbcConnection(strconn); – jane 2010-09-04 09:34:18

+0

@jane,對不起,我不明白你的評論是什麼意思。通過OleDb和Odbc,您的表創建SQL對我來說都是一種享受。它通過OleDb完全工作,並且爲Odbc刪除了「Zip decimal(5)」。增加您在問題中顯示的代碼示例的大小可能是一個好主意! =) – Rob 2010-09-04 09:45:53

+0

問題修復:你說得對。非常感謝 – jane 2010-09-04 09:52:12

0

使用vfpoledb提供商和字段類型NUMERIC代替DECIMAL

string ConnStr1 = @"Provider =vfpoledb; Data Source = C:\MyDataSource; Collating Sequence =machine;