DBF + C#

DBF + C#

Убил день, казалось бы на пустяковую задачку. Взять данные из DBF составленной с помощью Visual Fox Pro. 

Огромное спасибо вот этому парню. В результате сделал как у него.
1. Как создать файл DBF из С#
По ходу копания в нете натолкнулся
namespace WorkDBF
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
 
        private void Form1_Load(object sender, EventArgs e)
        {
            OdbcConnection conn = new OdbcConnection();
 
            conn.ConnectionString = @"Driver={Microsoft dBASE Driver (*.dbf)}";
 
            //объявляем команду создания новой таблички dbf
            OdbcCommand cmd_create = new OdbcCommand(@"CREATE TABLE [{0}] " 
 + "(itemName Char(40), itemValue Numeric,  itemInfo Char(150))", conn);
 
            conn.Open(); //открываем соединение
            cmd_create.ExecuteNonQuery(); //выполняем команду
            conn.Close();//закрываем соединение
        }
2.Как открыть файл DBF
Для начала нужно установить себе драйвер Visual FoxPro.
Мой файл лежит : E\ANALIZ.DBF

В заголовке необходимо прописать 
using System.Data.OleDb;

Вот собственно класс
       public string StartLoad()
        {
            string result;
            OleDbConnection conn = new OleDbConnection();
            DataTable dt = new DataTable();
            DataRow row;
            DataColumn column = new DataColumn();
            try
            {

                conn.ConnectionString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=e:\\;Extended Properties=dBASE IV;User ID=;Password=;";
                conn.Open();
                OleDbCommand comm = conn.CreateCommand();
                comm.CommandText = @"SELECT * FROM ANALIZ";

                dt.Load(comm.ExecuteReader());
                column = dt.Columns[0];
                row = dt.Rows[0];
                result = row[column].ToString();
                dataGridView1.DataSource = dt;
            }

            catch (Exception e)
            {
                result = e.ToString();

            }
            finally
            {
                conn.Close();
            }
            return result;
        } 
Кидаем на форму кнопку и datagridview

        private void button1_Click(object sender, EventArgs e)
        {
            StartLoad();
        }

У меня получилось следующее:
Насчет кодировки. Dbf формат старый, вполне возможна кодировка dos (866). Но мне не повезло и у меня оказалась западноевропейская 1252. Вычислил с помощью Total Comander. в общем код перекодировки
               string o = dt.Rows[17][2].ToString(); //строка
              var fromEncodind = Encoding.GetEncoding(1252);//из какой кодировки
                var bytes = fromEncodind.GetBytes(o);
                var toEncoding = Encoding.GetEncoding(1251);//в какую кодировку
                string ans = toEncoding.GetString(bytes);
                MessageBox.Show(ans);
Функция для перекодировки данных в DataGridView
        public void ConvertMe() {
            try
            {
                for (int tt = 0; tt < this.dataGridView1.RowCount - 1; tt++)
                {
                    //  Convert(dataGridView1)  
                    string o = dt.Rows[tt][1].ToString();
                    var fromEncodind = Encoding.GetEncoding(1252);//из какой кодировки
                    var bytes = fromEncodind.GetBytes(o);
                    var toEncoding = Encoding.GetEncoding(1251);//в какую кодировку
                    string nom = toEncoding.GetString(bytes);
                    dt.Rows[tt][1]= nom;
                }
            }
            catch (Exception msg)
            {
                MessageBox.Show(msg.ToString());
            }
}

Популярные сообщения из этого блога

Пишем логи на C# (.NET). Легкий способ.

Авторизация yii 2 из базы

Средства для работы с базой данный PostgreSql