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

DataSet и Firebird

23.12.2019, 13:45. Показов 2003. Ответов 23

Author24 — интернет-сервис помощи студентам
Добрый день!

У меня вопрос с программным добавлением DBF в базу firebird. Обязательное условие - это должна быть программа на С#.

Вообщем, я загружаю таблицу dbf в DataSet.

Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
string connStr = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + openfiledialogDBF.FileName.Substring(0, openfiledialogDBF.FileName.LastIndexOf("\\")) + ";Extended Properties=dBASE IV;";
 
                OleDbConnection conn = new OleDbConnection(connStr);
                conn.Open();
 
                string cmd_string = "select * from " + openfiledialogDBF.SafeFileName.Substring(0, openfiledialogDBF.SafeFileName.IndexOf("."));
             
                OleDbDataAdapter da = new OleDbDataAdapter(cmd_string, conn);
                DataSet ds = new DataSet();
                da.Fill(ds);


После я хочу из DataSet выгрузить эту таблицу в firebird. Есть ли легкий способ это сделать?

Я начал писать код на костылях и палках, типа:
Кликните здесь для просмотра всего текста
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
string conn1 = @"data source = localhost; port = 3050; initial catalog = D:\DB_TEST.FDB; user id = SYSDBA; password = *****; Dialect = 3";
// Это как я вызываю свой метод...
Firebird_CREATE_TABLE(ds, ofdDBF.SafeFileName.Substring(0, ofdDBF.SafeFileName.IndexOf(".")), conn1);
 
// Ну а это сам метод создания таблицы
void Firebird_CREATE_TABLE(DataSet ds, string table, string conn) // Принимаем dataset, Имя будущей таблицы и подключение
        {
            try
            {
                List<string> str1 = new List<string>();
 
                for (int i = 0; i < ds.Tables[0].Columns.Count; i++)
                {
                    string rty = null;
                    switch (ds.Tables[0].Columns[i].DataType.ToString())
                    {
                        case "System.String": rty = "VARCHAR (150)"; break;
                        case "System.Double": rty = "DOUBLE PRECISION"; break;
                        case "System.DateTime": rty = "DATE"; break;
                        default: rty = ds.Tables[0].Columns[i].DataType.Name; break;
                    }
 
                    str1.Add(ds.Tables[0].Columns[i].ColumnName + " " + rty);
                }
 
                string ss1 = null;
                for (int i = 0; i < str1.Count - 1; i++)
                {
                    ss1 += str1[i] + ",";
                }
                ss1 += str1[str1.Count - 1];
 
                FbCommand cmd = new FbCommand("create table " + table + " (" + ss1 + ");");
                cmd.CommandType = CommandType.Text;
                using (cmd.Connection = new FbConnection(conn))
                {
                    cmd.Connection.Open();
                    cmd.ExecuteNonQuery();
                    cmd.Connection.Close();
                }
            }
            catch (Exception ex)
            {
                Message_ERROR(ex);
            }
        }


Потом ещё извращения с insert into...
Но это как-то неправильно... Меня прям что-то останавливает... Кто-нибудь с таким сталкивался? Как можно реализовать перемещение таблицы из DataSet в firebird?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.12.2019, 13:45
Ответы с готовыми решениями:

Передача данных из таблицы одной dataSet в таблицу другой dataSet
Здравствуйте. У меня возникла ситуация когда необходимо передать данные из таблицы одной dataset в...

Отбор записей из одного DataSet в другой DataSet
Совсем недавно работаю под VS2008 C#. Имеется подключение к базе mdb. Примерная структура таблицы...

FireBird + Interbase&Firebird Development Studio
Установил FireBird 2.5 SuperClassic и Interbase&amp;Firebird Development Studio. Зашел в студию,...

Заполнение DataSet данными из другого DataSet
Здравствуйте. Есть DataSet (назовем его ds1) с 2 связанными таблицами( Table1 и Table2, связаны по...

23
800 / 583 / 207
Регистрация: 21.02.2019
Сообщений: 2,095
23.12.2019, 14:01 2
.. так а что вы тут придумаете, разве что написать Stored Procedure в Firebird, и потом вызывать, но меньше ли кода будет, если параметры всегда разные ...
0
4 / 4 / 3
Регистрация: 28.11.2017
Сообщений: 107
23.12.2019, 14:10  [ТС] 3
Эх... Как же я хотел писать код коротко и красиво... Теперь придется собирать метод с матами в коде...
0
1150 / 858 / 263
Регистрация: 30.04.2009
Сообщений: 3,598
24.12.2019, 00:43 4
Некоторые участки кода можно значительно упростить, но общая идея не изменится-так или иначе нужен генератор sql для создания таблиц.
Insert лучше сделать через DataAdapter.
0
Эксперт .NET
12309 / 8672 / 1310
Регистрация: 21.01.2016
Сообщений: 32,600
24.12.2019, 05:56 5
ndrnesterov, а всю эту кашу точно надо писать руками? Вы же полюбому знаете схему как DBF-базы, так и базы в Firebird, так ведь? И эту схему можно описать нормальными классами, а данные вытягивать\вставлять с помощью ORM типа Entity Framework или Linq2Db.
1
4 / 4 / 3
Регистрация: 28.11.2017
Сообщений: 107
24.12.2019, 09:23  [ТС] 6
И так.. Вот что у меня получилось... На форму добавил progressBar, чтобы не волноваться, что все зависло и можно было мышкой подгонять процесс работы... Скидываю весь код:
Кликните здесь для просмотра всего текста
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
using FirebirdSql.Data.FirebirdClient;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.OleDb;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Xml;
 
namespace WindowsFormsApp8
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
 
        string conn1 = @"data source = localhost; port = 3050; initial catalog = D:\DB_TEST.FDB; user id = SYSDBA; password = *****; Dialect = 3";
 
        void Firebird_CREATE_TABLE(DataSet ds, string table, string conn) // Принимаем dataset, Имя будущей таблицы и подключение
        {
            try
            {
                List<string> str1 = new List<string>();
 
                for (int i = 0; i < ds.Tables[0].Columns.Count; i++)
                {
                    string rty = null;
                    switch (ds.Tables[0].Columns[i].DataType.ToString())
                    {
                        case "System.String": rty = "VARCHAR (150)"; break;
                        case "System.Double": rty = "DOUBLE PRECISION"; break;
                        case "System.DateTime": rty = "DATE"; break;
                        default: rty = ds.Tables[0].Columns[i].DataType.Name; break;
                    }
 
                    str1.Add(ds.Tables[0].Columns[i].ColumnName + " " + rty);
                }
 
                string ss1 = null;
                for (int i = 0; i < str1.Count - 1; i++)
                {
                    ss1 += str1[i] + ",";
                }
                ss1 += str1[str1.Count - 1];
 
                FbCommand cmd = new FbCommand("create table " + table + " (" + ss1 + ");");
                cmd.CommandType = CommandType.Text;
                using (cmd.Connection = new FbConnection(conn))
                {
                    cmd.Connection.Open();
                    cmd.ExecuteNonQuery();
                    cmd.Connection.Close();
                }
            }
            catch (Exception ex)
            {
                Message_ERROR(ex);
            }
        }
 
        void Firebird_INSERT(List<string> str, string table) // str => 1,'text', datetime
        {
            //try
            //{
                string ss = null;
                for (int i = 0; i < str.Count - 1; i++)
                {
                    ss += str[i] + ",";
                }
                ss += str[str.Count - 1];
 
                FbCommand cmd = new FbCommand("insert into " + table + " values (" + ss + ");");
                cmd.CommandType = CommandType.Text;
                using (cmd.Connection = new FbConnection(conn1))
                {
                    cmd.Connection.Open();
                    cmd.ExecuteNonQuery();
                }
            //}
            //catch (Exception ex)
            //{
            //  Message_ERROR(ex);
            //}
        }
 
        void Message_ERROR(Exception ex)
        {
            MessageBox.Show(ex.ToString(), "Ошибка");
        }
 
        void start(List<string> filee, List<string> names)
        {
            for (int ii=0;ii<filee.Count;ii++)
            {
                this.Invoke(new MethodInvoker(() =>
                {
                    label1.Text = names[ii].Substring(0, names[ii].IndexOf("."));
                }));
                string connStr = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + filee[ii].Substring(0, filee[ii].LastIndexOf("\\")) + ";Extended Properties=dBASE IV;";
 
                OleDbConnection conn = new OleDbConnection(connStr);
                conn.Open();
 
                string cmd_string = "select * from " + names[ii].Substring(0, names[ii].IndexOf("."));
 
                OleDbDataAdapter da = new OleDbDataAdapter(cmd_string, conn);
                DataSet ds = new DataSet();
                da.Fill(ds);
 
 
                Firebird_CREATE_TABLE(ds, names[ii].Substring(0, names[ii].IndexOf(".")), conn1);
 
                List<string> ty = new List<string>();
 
                this.Invoke(new MethodInvoker(() =>
                {
                    progressBar1.Maximum = ds.Tables[0].Rows.Count;
                }));
                for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
                {
                    ty.Clear();
                    for (int j = 0; j < ds.Tables[0].Columns.Count; j++)
                    {
                        if (ds.Tables[0].Columns[j].DataType.ToString() == "System.String")
                        {
                            ty.Add("'" + ds.Tables[0].Rows[i][j].ToString() + "'");
                        }
                        else
                        {
                            if (ds.Tables[0].Columns[j].DataType.ToString() == "System.DateTime")
                            {
                                //  DateTime dt = DateTime.Parse("01.01.1900");
 
                                ty.Add("'01.01.1900'");
                            }
                            else
                                ty.Add(ds.Tables[0].Rows[i][j].ToString());
                        }
                    }
                    Firebird_INSERT(ty, names[ii].Substring(0, names[ii].IndexOf(".")));
                    this.Invoke(new MethodInvoker(() =>
                    {
                        progressBar1.Value = i + 1;
                    }));
                }
                this.Invoke(new MethodInvoker(() =>
                {
                    progressBar1.Value = 0;
                }));
            }
        }
 
        private void Form1_Load(object sender, EventArgs e)
        {
            List<string> path = new List<string>();
            List<string> name = new List<string>();
            if (ofdDBF.ShowDialog() == DialogResult.OK)
            {
                for (int i = 0; i < ofdDBF.FileNames.Length; i++)
                {
                    path.Add(ofdDBF.FileNames[i]);
                    name.Add(ofdDBF.SafeFileNames[i]);
                }
 
                Thread th = new Thread(delegate () { start(path, name); });
                th.Priority = ThreadPriority.Highest;
                th.Start();
            } else
            {
                Close();
            }
        }
    }
}


И это очень долго!! Базы имеют размеры (30Мб - 2Гб). Я оставил работать программу на всю ночь и в итоге оно даже половину не успело перенести...

Некоторые участки кода можно значительно упростить
А как упростить? Подскажи))

Добавлено через 1 минуту
а всю эту кашу точно надо писать руками?
Да) Нужно будет, чтобы ПО само переносило базы в firebird...
0
Эксперт .NET
12309 / 8672 / 1310
Регистрация: 21.01.2016
Сообщений: 32,600
24.12.2019, 10:49 7
Цитата Сообщение от ndrnesterov Посмотреть сообщение
Да) Нужно будет, чтобы ПО само переносило базы в firebird...
А схемы баз каждый раз разные и вы не знаете какие?
0
800 / 583 / 207
Регистрация: 21.02.2019
Сообщений: 2,095
24.12.2019, 10:57 8
.. хм .. а Формы-то тут зачем? .. ну, чисто консольная же задача .. вообще на скриптах можно было бы .. .. или задача не в том, чтобы сделать, а чтобы по методичке?
0
Usaga
24.12.2019, 10:59
  #9

Не по теме:

Цитата Сообщение от carrotik Посмотреть сообщение
а Формы-то тут зачем?
Потому, что консольки это DOS и не круто)

0
4 / 4 / 3
Регистрация: 28.11.2017
Сообщений: 107
24.12.2019, 11:06  [ТС] 10
Цитата Сообщение от Usaga Посмотреть сообщение
А схемы баз каждый раз разные
Верно) Они совершенно разные... Но радует, что типы данных только double, string и datetime...

Добавлено через 1 минуту
Цитата Сообщение от carrotik Посмотреть сообщение
а Формы-то тут зачем?
Согласен, но форма нужна будет для дальнейшей работы... На форму в компоненты будут выгружаться некоторые данные, при взаимодействии с которыми, будут выполняться определенные работы)
0
1150 / 858 / 263
Регистрация: 30.04.2009
Сообщений: 3,598
24.12.2019, 11:29 11
А как упростить? Подскажи))
Для конкатенации строк использовать string.Join, сравнение типов через typeof вместо сравнения строк.
Insert делать через DataAdapter, подключение создавать не на каждый чих, а единоразово или на batch. Создание отдельного подключения для каждой строки это то что больше всего бьет по производительности.
1
4 / 4 / 3
Регистрация: 28.11.2017
Сообщений: 107
24.12.2019, 13:19  [ТС] 12
Цитата Сообщение от nicolas2008 Посмотреть сообщение
Для конкатенации строк использовать string.Join, сравнение типов через typeof вместо сравнения строк.
Insert делать через DataAdapter, подключение создавать не на каждый чих, а единоразово или на batch. Создание отдельного подключения для каждой строки это то что больше всего бьет по производительности.
Ты волшебник

Сейчас упростил код по твоим советам и работа программы очень сильно ускорилась! Скорее всего в 2 и более раза быстрее!
Посмотри, может ещё что-нибудь можно упростить?

Кликните здесь для просмотра всего текста
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
using FirebirdSql.Data.FirebirdClient;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.OleDb;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Xml;
 
namespace WindowsFormsApp8
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
 
        string stringCon_FB = @"data source = localhost; port = 3050; initial catalog = D:\DB_TEST.FDB; user id = SYSDBA; password = *****; Dialect = 3";
        FbConnection conn_FB;
 
        void Firebird_CREATE_TABLE(DataSet ds, string table) // Принимаем dataset и имя будущей таблицы
        {
            try
            {
                List<string> str = new List<string>(); // Сюда мы записывем имя и тип данных через пробел
 
                for (int i = 0; i < ds.Tables[0].Columns.Count; i++)
                {
                    string temp = null; // Сюда мы вписываем тип данных для SQL
                    switch (ds.Tables[0].Columns[i].DataType.ToString())
                    {
                        case "System.String": temp = "VARCHAR (150)"; break;
                        case "System.Double": temp = "DOUBLE PRECISION"; break;
                        case "System.DateTime": temp = "DATE"; break;
                        default: temp = ds.Tables[0].Columns[i].DataType.Name; break;
                    }
 
                    str.Add(ds.Tables[0].Columns[i].ColumnName + " " + temp);
                }
 
                string ss = String.Join(",", str);
 
                FbCommand cmd = new FbCommand("create table " + table + " (" + ss + ");", conn_FB);
                cmd.ExecuteNonQuery();
            }
            catch (Exception ex)
            {
                Message_ERROR(ex);
            }
        }
 
        void Firebird_INSERT(List<string> str, string table) // str => 1,'text', datetime
        {
            try
            {
                string ss = String.Join(",", str);
 
                FbDataAdapter fda = new FbDataAdapter();
                FbCommand cmd = new FbCommand("insert into " + table + " values (" + ss + ");", conn_FB);
                //cmd.CommandType = CommandType.Text;
                //cmd.Connection = conn_FB;
                fda.InsertCommand = cmd;
                //cmd.ExecuteNonQuery();
            }
            catch (Exception ex)
            {
                Message_ERROR(ex);
            }
        }
 
        void Message_ERROR(Exception ex)
        {
            MessageBox.Show(ex.ToString(), "Ошибка");
        }
 
        void start(List<string> filee, List<string> names)
        {
            conn_FB = new FbConnection(stringCon_FB);
            conn_FB.Open();
 
            /*--Т.к. мы выбрали несколько DBF файлов, бегаем по каждому--*/
            for (int ii = 0; ii < filee.Count; ii++)
            {
                this.Invoke(new MethodInvoker(() =>
                {
                    label1.Text = names[ii].Substring(0, names[ii].IndexOf(".")); // На форме выводим названия DBF файла
                }));
 
                /*--Работа с файлом DBF--*/
                string stringCon_DBF = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + filee[ii].Substring(0, filee[ii].LastIndexOf("\\")) + ";Extended Properties=dBASE IV;";
                OleDbConnection conn = new OleDbConnection(stringCon_DBF);
                conn.Open();
 
                string cmd_string = "select * from " + names[ii].Substring(0, names[ii].IndexOf("."));
 
                OleDbDataAdapter da = new OleDbDataAdapter(cmd_string, conn);
                DataSet ds = new DataSet();
                da.Fill(ds);
                /*--Наш файл считан в ds--*/
 
                Firebird_CREATE_TABLE(ds, names[ii].Substring(0, names[ii].IndexOf(".")));
 
                List<string> ty = new List<string>(); // Сюда запишем все значения из строки
 
                this.Invoke(new MethodInvoker(() => { progressBar1.Maximum = ds.Tables[0].Rows.Count; }));
                for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
                {
                    ty.Clear();
                    /*--Тут мы ко всем String и DateTime добавляем кавычки--*/
                    for (int j = 0; j < ds.Tables[0].Columns.Count; j++)
                    {
                        string ss = (ds.Tables[0].Columns[j].DataType == typeof(System.String)) ? "'" + ds.Tables[0].Rows[i][j].ToString() + "'" :
                            (ds.Tables[0].Columns[j].DataType == typeof(System.DateTime)) ? "'01.01.1900'" :
                            ds.Tables[0].Rows[i][j].ToString();
                        ty.Add(ss);
                    }
                    /*--Получаем лист со значениями из строки--*/
 
                    Firebird_INSERT(ty, names[ii].Substring(0, names[ii].IndexOf("."))); // Посылаем на добавление
 
                    this.Invoke(new MethodInvoker(() => { progressBar1.Value = i + 1; }));
                }
                this.Invoke(new MethodInvoker(() => { progressBar1.Value = 0; }));
            }
            conn_FB.Close();
            this.Invoke(new MethodInvoker(() => { label1.Text = "Ok!"; }));
        }
 
        private void Form1_Load(object sender, EventArgs e)
        {
            List<string> path = new List<string>(); // Путь + имя файла
            List<string> name = new List<string>(); // Имя файла
            if (ofdDBF.ShowDialog() == DialogResult.OK)
            {
                for (int i = 0; i < ofdDBF.FileNames.Length; i++)
                {
                    path.Add(ofdDBF.FileNames[i]);
                    name.Add(ofdDBF.SafeFileNames[i]);
                }
 
                Thread th = new Thread(delegate () { start(path, name); });
                th.Priority = ThreadPriority.Highest;
                th.Start();
            } else
            {
                Close();
            }
        }
    }
}


Добавлено через 13 минут
Ааа... Магия в том, что программа не записывает ничего))) Ищу, почему)
0
Эксперт .NET
12309 / 8672 / 1310
Регистрация: 21.01.2016
Сообщений: 32,600
24.12.2019, 13:25 13
Цитата Сообщение от ndrnesterov Посмотреть сообщение
Магия в том, что программа не записывает ничего))) Ищу, почему)
Начните с поиска команды на выполнение запроса с INSERT. Я вот её в упор не вижу.
1
4 / 4 / 3
Регистрация: 28.11.2017
Сообщений: 107
24.12.2019, 13:30  [ТС] 14
Да... В insert я забыл прописать
C#
1
 fda.InsertCommand.ExecuteNonQuery();
Теперь программа опять начала долго грузить в базу данных
0
Эксперт .NET
12309 / 8672 / 1310
Регистрация: 21.01.2016
Сообщений: 32,600
24.12.2019, 13:42 15
ndrnesterov, запросы вставки оберните в одну транзакцию. Тогда скорость вставки увеличится существенно. Но журнал транзакций начнёт разбарабанивать. Если данных много, то такими транзакциями данные нужно разбивать на порции по 500-1000.

Ну и выполнять в отдельном потоке, чтобы окно не зависало. Или вообще выкинуть весь UI к чертям и оставить простое консольное приложение.

Добавлено через 1 минуту
Цитата Сообщение от ndrnesterov Посмотреть сообщение
fda.InsertCommand.ExecuteNonQuery();
В таком случае DataAdapter чуть более, чем бесполезен и его можно не создавать.

Добавлено через 2 минуты
И ещё: я что-то не увидал, как ваше приложение анализирует и воссоздаёт первичные и внешние ключи, а так же индексы. Это всё на фиг не нужно в вашей целевой базе? И почему строки в сто пятьдесят символов?
1
1150 / 858 / 263
Регистрация: 30.04.2009
Сообщений: 3,598
24.12.2019, 14:01 16
ndrnesterov, DataAdapter неправильно используете
Гляньте эту статью https://docs.microsoft.com/en-... taadapters

Там и batch команды поддерживаются и все что хочешь)
1
4 / 4 / 3
Регистрация: 28.11.2017
Сообщений: 107
24.12.2019, 14:02  [ТС] 17
Подскажите, а как запросы вставки обернуть в одну транзакцию?

На счет ключей - я добавлю) Мне сначала нужно ускорить процесс добавления)
0
Эксперт .NET
12309 / 8672 / 1310
Регистрация: 21.01.2016
Сообщений: 32,600
24.12.2019, 14:05 18
Цитата Сообщение от ndrnesterov Посмотреть сообщение
На счет ключей - я добавлю) Мне сначала нужно ускорить процесс добавления)
Так потом всё равно ручная работа последует? Такая себе автоматизация.

Цитата Сообщение от ndrnesterov Посмотреть сообщение
Подскажите, а как запросы вставки обернуть в одну транзакцию?
Пример или TransactionScope()
1
4 / 4 / 3
Регистрация: 28.11.2017
Сообщений: 107
24.12.2019, 14:31  [ТС] 19
Цитата Сообщение от nicolas2008 Посмотреть сообщение
DataAdapter неправильно используете
Увидел) Только я не понимаю, что в моем случае прописывать в adapter.Update();

Добавлено через 2 минуты
Спасибо за пример! Разобрался) Сейчас буду реализовывать insert пакетами по 1000 строк)) И после буду думать, что можно сделать с первичными и вторичными ключами...

Вот код на данный момент:
Кликните здесь для просмотра всего текста
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
using FirebirdSql.Data.FirebirdClient;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.OleDb;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Xml;
 
namespace WindowsFormsApp8
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
 
        string stringCon_FB = @"data source = localhost; port = 3050; initial catalog = D:\DB_TEST.FDB; user id = SYSDBA; password = ******; Dialect = 3";
        FbConnection conn_FB;
 
        void Firebird_CREATE_TABLE(DataSet ds, string table) // Принимаем dataset и имя будущей таблицы
        {
            try
            {
                List<string> str = new List<string>(); // Сюда мы записывем имя и тип данных через пробел
 
                for (int i = 0; i < ds.Tables[0].Columns.Count; i++)
                {
                    string temp = null; // Сюда мы вписываем тип данных для SQL
                    switch (ds.Tables[0].Columns[i].DataType.ToString())
                    {
                        case "System.String": temp = "VARCHAR (150)"; break;
                        case "System.Double": temp = "DOUBLE PRECISION"; break;
                        case "System.DateTime": temp = "DATE"; break;
                        default: temp = ds.Tables[0].Columns[i].DataType.Name; break;
                    }
 
                    str.Add(ds.Tables[0].Columns[i].ColumnName + " " + temp);
                }
 
                string ss = String.Join(",", str);
 
                FbCommand cmd = new FbCommand("create table " + table + " (" + ss + ");", conn_FB);
                cmd.ExecuteNonQuery();
            }
            catch (Exception ex)
            {
                Message_ERROR(ex);
            }
        }
 
        void Firebird_INSERT(DataSet ds, string names)
        {
            List<string> ty = new List<string>(); // Сюда запишем все значения из строки
            this.Invoke(new MethodInvoker(() => { progressBar1.Maximum = ds.Tables[0].Rows.Count; }));
 
            FbTransaction transaction = conn_FB.BeginTransaction();
            FbCommand cmd = conn_FB.CreateCommand();
            cmd.Transaction = transaction;
 
            try
            {
                for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
                {
                    ty.Clear();
                    /*--Тут мы ко всем String и DateTime добавляем кавычки--*/
                    for (int j = 0; j < ds.Tables[0].Columns.Count; j++)
                    {
                        string ss1 = (ds.Tables[0].Columns[j].DataType == typeof(System.String)) ? "'" + ds.Tables[0].Rows[i][j].ToString() + "'" :
                            (ds.Tables[0].Columns[j].DataType == typeof(System.DateTime)) ? "'01.01.1900'" :
                            ds.Tables[0].Rows[i][j].ToString();
                        ty.Add(ss1);
                    }
                    /*--Получаем лист со значениями из строки--*/
                    string ss = String.Join(",", ty);
                    cmd.CommandText = "insert into " + names + " values (" + ss + ");";
                    cmd.ExecuteNonQuery();
 
                    this.Invoke(new MethodInvoker(() => { progressBar1.Value = i + 1; }));
                }
                transaction.Commit();
                this.Invoke(new MethodInvoker(() => { progressBar1.Value = 0; }));
            }
            catch (Exception ex)
            {
                Message_ERROR(ex);
                transaction.Rollback();
            }
        }
 
        void Message_ERROR(Exception ex)
        {
            MessageBox.Show(ex.ToString(), "Ошибка");
        }
 
        void start(List<string> filee, List<string> names)
        {
            conn_FB = new FbConnection(stringCon_FB);
            conn_FB.Open();
 
            /*--Т.к. мы выбрали несколько DBF файлов, бегаем по каждому--*/
            for (int ii = 0; ii < filee.Count; ii++)
            {
                this.Invoke(new MethodInvoker(() =>
                {
                    label1.Text = names[ii].Substring(0, names[ii].IndexOf(".")); // На форме выводим названия DBF файла
                }));
 
                /*--Работа с файлом DBF--*/
                string stringCon_DBF = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + filee[ii].Substring(0, filee[ii].LastIndexOf("\\")) + ";Extended Properties=dBASE IV;";
                OleDbConnection conn = new OleDbConnection(stringCon_DBF);
                conn.Open();
 
                string cmd_string = "select * from " + names[ii].Substring(0, names[ii].IndexOf("."));
 
                OleDbDataAdapter da = new OleDbDataAdapter(cmd_string, conn);
                DataSet ds = new DataSet();
                da.Fill(ds);
                /*--Наш файл считан в ds--*/
 
                Firebird_CREATE_TABLE(ds, names[ii].Substring(0, names[ii].IndexOf(".")));
 
                Firebird_INSERT(ds, names[ii].Substring(0, names[ii].IndexOf(".")));
            }
            conn_FB.Close();
            this.Invoke(new MethodInvoker(() => { label1.Text = "Ok!"; }));
        }
 
        private void Form1_Load(object sender, EventArgs e)
        {
            List<string> path = new List<string>(); // Путь + имя файла
            List<string> name = new List<string>(); // Имя файла
            if (ofdDBF.ShowDialog() == DialogResult.OK)
            {
                for (int i = 0; i < ofdDBF.FileNames.Length; i++)
                {
                    path.Add(ofdDBF.FileNames[i]);
                    name.Add(ofdDBF.SafeFileNames[i]);
                }
 
                Thread th = new Thread(delegate () { start(path, name); });
                th.Priority = ThreadPriority.Highest;
                th.Start();
            } else
            {
                Close();
            }
        }
    }
}
0
1150 / 858 / 263
Регистрация: 30.04.2009
Сообщений: 3,598
24.12.2019, 14:40 20
ndrnesterov, это все не то
Попробуйте разобраться с DataAdapter-ом разобраться.
Намного проще будет
0
24.12.2019, 14:40
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.12.2019, 14:40
Помогаю со студенческими работами здесь

Разбиение строки в FireBird - Firebird/InterBase
Продолжая тему отсюда: https://www.cyberforum.ru/firebird/thread309236.html :wall: Есть поле типа...

Как разделить Dataset на 3 Dataset?
Есть Dataset ds; В нём первая таблица содержит 30 строк. Надо раскидать строки из его первой...

Копирование данных из DataSet в DataSet
Люди, подскажите, как мне скопировать данные из одного DataSet(Access) в другой(Наборы данных...

Fast Report: "Cannot use the same dataset for Report.DataSet and Band.DataSet"
Здравствуйте! Подскажите, пожалуйста, в чём ошибка. Я добавила на форму два компонента: frxReport1...

Как или чем конвертировать таблицы из Firebird в MySQL или наоборот из MySQL в Firebird ?!
Предлагайте все возможные варианты! Заранее при много благодарен!

Конвертирование Firebird 2.0 на Firebird 2.5
Приветствую всех!!! Мне дали задачу на работе поменять версию Firebird 2.0 на Firebird 2.5. Ну...


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

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