2010-09-04 135 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;