Форум программистов, компьютерный форум, киберфорум
C#: Базы данных, ADO.NET
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/15: Рейтинг темы: голосов - 15, средняя оценка - 4.67
Заблокирован
1

Распарсить dbf и записать данные в postgres

10.04.2014, 13:23. Показов 3108. Ответов 4
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Необходимо распарсить dbf и загнать данные в postgres. Нашел такой код
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.Odbc;
namespace WorkDBF
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
 
        private void Form1_Load(object sender, EventArgs e)
        {
 
        }
        class WorkDBF
        {
            private OdbcConnection Conn = null;
            public DataTable Execute(string Command)
            {
                DataTable dt = null;
                if (Conn != null)
                {
                    try
                    {
                        Conn.Open();
                        dt = new DataTable();
                        System.Data.Odbc.OdbcCommand oCmd = Conn.CreateCommand();
                        oCmd.CommandText = Command;
                        dt.Load(oCmd.ExecuteReader());
                        Conn.Close();
                    }
                    catch (Exception e)
                    {
                        MessageBox.Show(e.Message);
                    }
                }
                return dt;
            }
            //string DB_path = "E:\\ANALIZ.DBF";
           
            public DataTable GetAll(string DB_path)
            {
                return Execute("SELECT * FROM " + DB_path);
            }
 
            public WorkDBF()
            {
                this.Conn = new System.Data.Odbc.OdbcConnection();
                Conn.ConnectionString = @"Driver={Microsoft dBase  Driver (*.dbf)};" +
                       "SourceType=DBF;Exclusive=No;" +
                       "Collate=Machine;NULL=NO;DELETED=NO;" +
                       "BACKGROUNDFETCH=NO;";
            }
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
            WorkDBF WDBF = new WorkDBF();
            dataGridView1.DataSource = WDBF.GetAll("E:\\ANALIZ.DBF");
            dataGridView2.DataSource = WDBF.Execute("SELECT id, name FROM E:\\ANALIZ.DBF");
        }
    }
}
Но вылазит ошибка. Подскажите как решить
Миниатюры
Распарсить dbf и записать данные в postgres  
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.04.2014, 13:23
Ответы с готовыми решениями:

Распарсить строку и записать данные в массив
Как строку {оваться,у{йся,йтесь},у{юсь,ешься,ется,емся,етесь,ются,ясь},ова{лся,лась,лось,лись}} ...

Как распарсить страницу и записать данные в ListView?
Добрый день , Киборги! Прошлая тема ,созданная мною в данном разделе , касалась вопроса WebView'a...

Распарсить json и записать полученные данные в массив
Прочитал статью где такой json { "firstName": "Иван", "lastName": "Иванов", ...

Распарсить текстовый файл и полученные данные записать в БД Access
Добрый день! Подскажите как организовать следующее: Есть текстовый файл. В нем содержаться...

4
Заблокирован
10.04.2014, 14:53  [ТС] 2
как ни странно dbf я создать могу .
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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();//закрываем соединение
        }
0
Администратор
83618 / 52196 / 244
Регистрация: 10.04.2006
Сообщений: 13,426
10.04.2014, 15:14 3
Лучший ответ Сообщение было отмечено mik-a-el как решение

Решение

Класс для работы с ДБФ.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
    /// <summary>
    /// Наименование СУБД
    /// </summary>
    public enum DBMSName
    {
        /// <summary>
        /// dBase (*.dbf)
        /// </summary>
        dBase,
 
        /// <summary>
        /// Interbase и его клоны
        /// </summary>
        Interbase,
 
        /// <summary>
        /// Oracle
        /// </summary>
        Oracle
    }
 
 
    /// <summary>
    /// Драйверы ODBC
    /// </summary>
    public enum ODBCDriverName
    {
        /// <summary>
        /// Microsoft dBase Driver (*.dbf)
        /// </summary>
        Microsoft_dBase_Driver,
 
        /// <summary>
        /// Microsoft dBase VFP Driver (*.dbf)
        /// </summary>
        Microsoft_dBase_VFP_Driver,
 
        /// <summary>
        /// Microsoft FoxPro VFP Driver (*.dbf)
        /// </summary>
        Microsoft_FoxPro_VFP_Driver
    }
 
 
    /// <summary>
    /// Класс с функциями для доступа к данным формата DBF
    /// </summary>
    public class DBDataAccess : DisposableObject
    {
        #region Поля
 
        // Список для хранения созданных источников
        private ArrayList dsnList = new ArrayList();
 
        #endregion Поля
 
 
        #region Константы
 
        // Add a system DSN
        const int ODBC_ADD_SYS_DSN = 4;
        // Configure a system DSN
        const int ODBC_CONFIG_SYS_DSN = 5;
        // Remove a system DSN
        const int ODBC_REMOVE_SYS_DSN = 6;
        // Название драйвера, с помощью которого подключаемся к каталогу с файлами DBF
        const string DBF_DRIVER_NAME = "Microsoft dBase Driver (*.dbf)";
 
        #endregion Константы
 
 
        /// <summary>
        /// Освобождение ресурсов
        /// </summary>
        protected override void Dispose(bool disposing)
        {
            if (disposing)
            {
                ClearSYSDSN();
            }
 
            base.Dispose(disposing);
        }
 
        [DllImport("odbccp32.dll")]
        private static extern bool SQLConfigDataSource(int hwndParent, int fRequest, string Driver, string Attributes);
 
        /// <summary>
        /// Создает источник данных ODBС, настроенный на указанный каталог
        /// </summary>
        /// <param name="dbfDir">Каталог с файлами DBF</param>
        /// <param name="con">Соединение</param>
        /// <param name="sourceName">Имя созданного источника</param>
        /// <returns>Возвращает пустую строку, если все прошло успешно и расшифровку ошибки в противном случае</returns>
        private string CreateSYSDSN(string dbfDir, ref IDbConnection con, out string sourceName)
        {
            sourceName = string.Empty;
 
            try
            {
                // Генерим случайное имя для нового источника
                string tmpName = Guid.NewGuid().ToString();
                tmpName = tmpName.Replace("-", "");
 
                // Добавляем источник в DSN
                string connectionStr = string.Format(
                    "DSN={0};Description=Временный источник данных;Exclusive=1;ReadOnly=1;FIL=dBase 5.0;" +
                    "DefaultDir={1};CollatingSequence=ASCII;Deleted=01;PageTimeout=5;Statistics=0;UserCommitSync=Yes;",
                    tmpName, dbfDir);
                SQLConfigDataSource(0, ODBC_ADD_SYS_DSN, DBF_DRIVER_NAME, connectionStr);
 
                // Строка подключения
                connectionStr = connectionStr + "DriverId=533";
                OdbcConnection OdbcCon = new OdbcConnection(connectionStr);
                con = (IDbConnection)OdbcCon;
 
                // Запоминаем источник, чтобы потом замочить
                dsnList.Add(tmpName);
                sourceName = tmpName;
 
                return string.Empty;
            }
            catch (Exception ex)
            {
                return ex.Message;
            }
        }
 
        /// <summary>
        /// Удаляет указанный источник
        /// </summary>
        /// <param name="sourceName">Имя источника</param>
        /// <returns>Строка ошибки</returns>
        public string DeleteSYSDSN(string sourceName)
        {
            try
            {
                SQLConfigDataSource(0, ODBC_REMOVE_SYS_DSN, DBF_DRIVER_NAME, string.Format("DSN={0}", sourceName));
                return string.Empty;
            }
            catch (Exception ex)
            {
                return ex.Message;
            }
        }
 
        /// <summary>
        /// Удаляет все созданные временные источники ODBC
        /// </summary>
        /// <returns>Строка ошибки</returns>
        public string ClearSYSDSN()
        {
            try
            {
                for (int i = dsnList.Count - 1; i >= 0; i--)
                {
                    DeleteSYSDSN((string)dsnList[i]);
                    dsnList.RemoveAt(i);
                }
 
                return string.Empty;
            }
            catch (Exception ex)
            {
                return ex.Message;
            }
        }
 
        /// <summary>
        /// Создает подключение к источнику
        /// </summary>
        /// <param name="dir">Источник</param>
        /// <returns>Объект БД</returns>
        public Database ConnectToDataSource(string dir)
        {
            string sourceName = string.Empty;
            if (!Directory.Exists(dir)) return null;
 
            Database result = null;
            IDbConnection conn = null;
 
            CreateSYSDSN(dir, ref conn, out sourceName);
            if (conn == null) return null;
 
            result = new Database(conn, System.Data.Common.DbProviderFactories.GetFactory("System.Data.Odbc"), false);
 
            return result;
        }
 
        /// <summary>
        /// Создает подключение к файлу dbf через Microsoft FoxPro VFP Driver (*.dbf)
        /// </summary>
        /// <param name="file">Файл</param>
        /// <returns>Объект БД</returns>
        public void ConnectToDataSource(ref Database db, string dir, ODBCDriverName odbcDriverName)
        {
            if (db != null)
            {
                db.Close();
                db = null;
            }
 
            IDbConnection conn = null;
 
            switch (odbcDriverName)
            {
                case ODBCDriverName.Microsoft_dBase_Driver:
                    conn = (IDbConnection)new OdbcConnection(string.Format(
                        "DRIVER=Microsoft dBase Driver (*.dbf);DriverID=533;FIL=dBase 5.0;DefaultDir={0}", dir));
                    break;
 
                case ODBCDriverName.Microsoft_dBase_VFP_Driver:
                    conn = (IDbConnection)new OdbcConnection(string.Format(
                        "DRIVER=Microsoft dBase VFP Driver (*.dbf);Exclusive=No;SourceType=DBF;SourceDB={0}", dir));
                    break;
 
                case ODBCDriverName.Microsoft_FoxPro_VFP_Driver:
                    conn = (IDbConnection)new OdbcConnection(string.Format(
                        "DRIVER=Microsoft FoxPro VFP Driver (*.dbf);Exclusive=No;SourceType=DBF;SourceDB={0}", dir));
                    break;
            }
 
            if (conn == null)
            {
                throw new DataSourceIsCorruptException(string.Format(
                    "Ошибка при создании соединения с источником {0}.", dir));
            }
 
            db = new Database(conn, System.Data.Common.DbProviderFactories.GetFactory("System.Data.Odbc"), false);
        }
    }
1
1496 / 1044 / 146
Регистрация: 01.10.2009
Сообщений: 3,510
Записей в блоге: 1
10.04.2014, 20:33 4
По мне лучше Vfpoledb 9.0 driver, попробуйте
0
Заблокирован
11.04.2014, 09:08  [ТС] 5
mik-a-el, кода много и это хорошо. А можно пример попроще. Тупо для моей ситуации. Мой файл лежит E:\ANALIZ.DBF Создан Visual FOX PRO

Добавлено через 28 минут
Не удалось найти имя типа или пространства имен "Database" (пропущена директива using или ссылка на сборку?) А какие директивы подлючать то надо еще? кроме
C#
1
using System.Collections; // для private ArrayList dsnList = new ArrayList();
Добавлено через 1 час 11 минут
Дошел до такого
C#
1
2
3
4
System.Data.OleDb.OleDbConnection conn = new System.Data.OleDb.OleDbConnection("Provider=VFPOLEDB.1;Data Source=e:\\");
System.Data.OleDb.OleDbDataAdapter da = new System.Data.OleDb.OleDbDataAdapter("SELECT * FROM ANALIZ.DBF", conn);
conn.Open();
da.Fill(ds);
честно не знаю что происходит как бы это вывести на экран (может через datagrid)

Добавлено через 34 минуты
Ой решил вопрос ответ
0
11.04.2014, 09:08
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.04.2014, 09:08
Помогаю со студенческими работами здесь

Распарсить строку и записать полученные данные в двумерный массив
необходимо разобрать строку в двумерный массив . строка вида ,]

Хранимые процедуры Postgres 9.3.3: распарсить строку
версия Postgres 9.3.3. Появилась необходимость распарсивать значение, передаваемое в базу...

Требуется данные из RecordSeta записать в таблицы формата dbf
Требуется данные из RecordSeta записать в таблицы формата dbf. Причем сделать это программно....

Добавить данные в связанные таблицы postgres
Здравствуйте. Столкнулся с проблемой, Есть таблица комплектующих с полями idgr, idedzim, name. Поля...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru