Как создать файл .dbf, используя c #? - PullRequest
4 голосов
/ 04 сентября 2010

Я пытаюсь сделать выбор, и он работает просто отлично

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 голосов
/ 04 сентября 2010

Ваша проблема вызвана 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();
}
0 голосов
/ 14 сентября 2011

Используйте провайдера vfpoledb и тип поля NUMERIC вместо DECIMAL.

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