Как создавать и изменять dbf в C#

579
23 января 2018, 09:18

Здравствуйте, нужно открыть dbf файл, изменить его через SQL запросы и сохранить в другой файл. С dbf никогда не работал, поэтому искал код в инете. Нашел вот такой код для чтения, который работает нормально:

OdbcConnection Conn = null;
...
string str = @"SELECT * FROM D:\Work\rrk.dbf";
DataTable dt = new DataTable();
OdbcDataAdapter da = new OdbcDataAdapter(str, Conn);
da.Fill(dt);
dataGridView1.DataSource = dt;

Но есть еще код для создания таблицы:

string str0 = "Create Table Persons (name char(20))";
OdbcCommand cmd = new OdbcCommand(str0, Conn);
cmd.ExecuteNonQuery();

Который выдает ошибку :"Для ExecuteNonQuery нужно открытое и доступное подключение Connection. Подключение закрыто.". Если добавить Conn.Open(); в начало и Conn.Close(); в конец, код исполняется (таблица видимо создается), но при последующем запуске происходит ошибка "таблица уже создана с таким именем".

 Conn.Open();
 string str0 = "Create table ass (name char(20))";
 OdbcCommand cmd = new OdbcCommand(str0, Conn);
 cmd.ExecuteNonQuery();
 Conn.Close();

Возникает сразу несколько вопросов: как сохранить созданную таблицу в dbf файл? Как сохранить ее в DataTable (для вывода затем в DataGridView)?

Answer 1

вот нашел кусок кода для DotNetDBF :

using (Stream fos = File.Open(dbffile, FileMode.OpenOrCreate, FileAccess.ReadWrite))
                using (var writer = new DBFWriter())
                {         
                    writer.CharEncoding = Encoding.GetEncoding(866);
                    writer.Signature = DBFSigniture.DBase3;
                    writer.LanguageDriver = 0x26; // кодировка 866
                    var field1 = new DBFField("DOCDATE", NativeDbType.Date);
                    var field2 = new DBFField("DOCNUMBER", NativeDbType.Char, 50);
                    var field3 = new DBFField("POSNAME", NativeDbType.Char, 255);
                    var field4 = new DBFField("POSCODE", NativeDbType.Numeric, 10, 0);
                    var field5 = new DBFField("RETPRICE", NativeDbType.Numeric, 10, 2);
                    var field6 = new DBFField("QUANTITY", NativeDbType.Numeric, 3, 2);
                    var field7 = new DBFField("APCODE", NativeDbType.Numeric, 10, 0);
                    var field8 = new DBFField("CLNTNAME", NativeDbType.Char, 255);
                    var field9 = new DBFField("CLNTPHONE", NativeDbType.Char, 20);
                    writer.Fields = new[] { field1, field2, field3, field4, field5, field6, field7, field8, field9 };
                    foreach (var item in items)
                    {
                        writer.AddRecord(
                         // добавляем поля в набор
                            );
                    }
                    writer.Write(fos);
                }
READ ALSO
Как создать инсталлятор для настройки VSTO?

Как создать инсталлятор для настройки VSTO?

У меня стоит Visual Studio Enterprise 2017Необходимо создать инсталлятор для созданной настройки VSTO для PowerPoint 2013

302
Чтение базы Sqlite при открытом браузере

Чтение базы Sqlite при открытом браузере

Подскажите, можно ли достать данные ( прочитать базу ) при открытом браузере? Есть ли какие-нибудь средства обхода?

265
Как вызвать из события поток с параметрами, заданными через класс C#?

Как вызвать из события поток с параметрами, заданными через класс C#?

Доброе время сутокИмеются срабатывающие в таймере событие, 3 потока и класс, передающий в поток 2 параметра (объект из очереди и время "эмуляции"...

338
Вывод счетчика цикла ASP MVC

Вывод счетчика цикла ASP MVC

Хочется отображать а странице, счетчик итераций циклаНе знаю как это сделать

304