如何使用C#创建.dbf文件?

4

我正在尝试制作一个下拉选择框,它运行得很好。

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();

错误 [42000] [Microsoft][ODBC dBase 驱动程序] 字段定义中的语法错误。

2个回答

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();
}
一个问题: 你确定要把Zip列创建为十进制数吗?我不是美国居民,对这个信息不是100%有信心,但是根据维基百科的说法,邮政编码可以以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
我只是为了测试而进行了 zip decimal(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
@jane,抱歉,我不明白你在评论中的意思。你创建表的SQL对我来说非常有效,无论是通过OleDb还是Odbc都可以。它可以完整地通过OleDb工作,并且对于Odbc而言应将 Zip decimal(5) 移除。增加你在问题中展示的代码示例的大小可能是个好主意!=) - Rob
@jane,那就有些不同了。我已经将我用ODBC创建表的代码复制到我的答案中 - 你可以尝试一下,看看它是否适用于你(显然要更改路径!=),然后再调整到你的代码中? - Rob

0
使用 vfpoledb 提供程序和字段类型 NUMERIC 代替 DECIMAL
string ConnStr1 = @"Provider =vfpoledb; Data Source = C:\MyDataSource; Collating Sequence =machine;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接