0 / 0 / 0
Регистрация: 29.05.2016
Сообщений: 3
1

Экспортировать данные из DataGridView в БД dbf

03.06.2016, 07:52. Показов 6063. Ответов 7
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
КАК ЗАПИСАТЬ (СДЕЛАТЬ EXPORT) из грида в dbf? FoxPro
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
03.06.2016, 07:52
Ответы с готовыми решениями:

Как из Excel экспортировать данные в dbf
Можно в самом Excel сделать форму на ней кнопку "Экспорт"?

Помогите экспортировать данные объекты DataGrid в формат dbf
Получаю данные с SQL Servera, сохранил в DataSet, заполнмл объект DataGrid просмотрел содержимое на...

Экспортировать данные из DataGridView в Excel
Всем доброго времени суток! В статье http://www.sources.ru/vb.net/Export-DataGridView-to-Excel.html...

Какими средствами Oracle экспортировать данные из таблицы Oracle в dbf-файл?
Здравствуйте! Не подскажите чайнику какими средствами Oracle экспортировать данные из таблицы...

7
C# = ♫♪♫♪♪♫
57 / 56 / 18
Регистрация: 02.08.2014
Сообщений: 283
03.06.2016, 08:41 2
Через ODBC. Подключаем драйвер и указываем путь к DBF
C#
1
2
3
4
5
6
7
8
9
/// <summary>
        /// Подключение к файлу
        /// </summary>
        /// <param name="t">Путь к файлу (Директория расположения файла)</param>
        internal void Odbccon(string t)
        {
            Conn = new OdbcConnection();
            Conn.ConnectionString = @"Driver={Microsoft dBASE Driver (*.dbf)};DriverID=277;Dbq=" + t + "; encoding=ANSI";
        }
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
/// <summary>
        /// Подключение к источнику данных
        /// </summary>
        private OdbcConnection Conn = null;
 
        /// <summary>
        /// Выполнение команды SQL
        /// </summary>
        /// <param name="Command">SQL код</param>
        /// <returns></returns>
        public DataTable Execute(string Command)
        {
            DataTable dt = null;
            if (Conn != null)
            {
                try
                {
                    Conn.Open();
                    dt = new DataTable();
                    OdbcCommand oCmd = Conn.CreateCommand();
                    oCmd.CommandText = Command;
                    dt.Load(oCmd.ExecuteReader());
                    Conn.Close();
                }
                catch (Exception e)
                {
                    MessageBox.Show(e.Message);
                }
            }
 
            return dt;
        }
 
        /// <summary>
        /// Загрузка всех колонок
        /// </summary>
        /// <param name="DB_path">Путь</param>
        /// <returns></returns>
        public DataTable GetAll(string DB_path)
        {
            return Execute("SELECT * FROM " + DB_path);
        }
 
        /// <summary>
        /// Получает количество строк в базе
        /// </summary>
        /// <returns></returns>
        private long limitrows(string DB_path)
        {
            try
            {
                long lim = 0;
                DataTable tempTable = Execute("SELECT count(*) FROM " + DB_path);
                lim = Convert.ToInt64(tempTable.Rows[0]["count"].ToString());
                tempTable.Dispose();
                return lim;
            }
            catch (Exception)
            {
                throw;
            }
 
        }
0
0 / 0 / 0
Регистрация: 29.05.2016
Сообщений: 3
03.06.2016, 09:07  [ТС] 3
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
private void button6_Click(object sender, EventArgs e)
        {
            SaveFileDialog saveFileDialog = new SaveFileDialog();
            saveFileDialog.Filter = "Dbf files (*.dbf)|*.dbf";
            saveFileDialog.FileName = "MVAL_" + this.dateTimePicker1.Value.ToString("yyyy-MM-dd") + "_" + this.dateTimePicker2.Value.ToString("yyyy-MM-dd") + ".dbf";
            int num1 = (int)saveFileDialog.ShowDialog();//saveFileDialog. true;
            OleDbConnection conn = new OleDbConnection();
            conn.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0; Data Source=" + saveFileDialog.FileName;
 
            conn.Open();
            OleDbCommand comm = conn.CreateCommand();
            comm.CommandText = "CREATE TABLE mytable(SerialNo int(4),CCode varchar(9),UID2 varchar(20),UID1 varchar(20),Name varchar(20),GroupName varchar(20),date(8),DevTypeId int(4),DeviceId int(4),import Decimal(11),total Decimal(11))";
            comm.ExecuteNonQuery();
            for (int index = 0; index < this.dataGridView1.RowCount; ++index)
            {
                int counter = Convert.ToInt32(this.dataGridView1.Rows[index].Cells[1].Value);
                string ccodee = Convert.ToString(this.dataGridView1.Rows[index].Cells[2].Value);
                string uid2 = Convert.ToString(this.dataGridView1.Rows[index].Cells[3].Value);
                string uid1 = Convert.ToString(this.dataGridView1.Rows[index].Cells[4].Value);
                string name = Convert.ToString(this.dataGridView1.Rows[index].Cells[5].Value);
                string groupn = Convert.ToString(this.dataGridView1.Rows[index].Cells[6].Value);
                DateTime datee = Convert.ToDateTime(this.dataGridView1.Rows[index].Cells[7].Value);
                int devtype = Convert.ToInt32(this.dataGridView1.Rows[index].Cells[8].Value);
                int devid = Convert.ToInt32(this.dataGridView1.Rows[index].Cells[9].Value);
                decimal imp = Convert.ToDecimal(this.dataGridView1.Rows[index].Cells[10].Value);
                decimal tot = Convert.ToDecimal(this.dataGridView1.Rows[index].Cells[11].Value);
                comm.CommandText = "insert into mytable(SerialNo, CCode, UID2, UID1, Name,  GroupName, Time, DevTypeId, DeviceId,import,total) values    ('" + counter + "'," + ccodee + ",'" + uid2 + "','" + uid1 + "','" + name + "','" + groupn + "','" + datee + "','" + devtype + "','" + devid + "','" + imp + "','" + tot + "')";
                comm.ExecuteNonQuery();
            }
        }
Выдает ошибку
0
C# = ♫♪♫♪♪♫
57 / 56 / 18
Регистрация: 02.08.2014
Сообщений: 283
03.06.2016, 09:48 4
Data Source должна получать только путь без указания имени C:\Test\
C#
1
conn.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0; Data Source=" + saveFileDialog.FileName;
Добавлено через 7 минут
Да и мне кажется CREATE TABLE работать не будет. Сам фаил надо создавать бинарно

Добавлено через 7 минут
Откопал вот это
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
// Бинарное создание DBF
private void DataTableSaveToDBF(DataTable DT, string Folder)
{
// Создаю таблицу
System.IO.File.Delete(Folder+""+DT.TableName+".DBF");
System.IO.FileStream FS = new System.IO.FileStream(Folder+""+DT.TableName+".DBF", System.IO.FileMode.Create);
// Формат dBASE III 2.0
byte[] buffer = new byte[]{0x03, 0x63, 0x04, 0x04}; // Заголовок 4 байта
FS.Write(buffer, 0, buffer.Length);
buffer = new byte[]{
(byte)(((DT.Rows.Count % 0x1000000) % 0x10000) % 0x100),
(byte)(((DT.Rows.Count % 0x1000000) % 0x10000) / 0x100),
(byte)(( DT.Rows.Count % 0x1000000) / 0x10000),
(byte)( DT.Rows.Count / 0x1000000)
}; // Word32 -> кол-во строк 5-8 байты
FS.Write(buffer, 0, buffer.Length);
int i = (DT.Columns.Count+1)*32+1; // Изврат
buffer = new byte[]{
(byte)( i % 0x100),
(byte)( i / 0x100)
}; // Word16 -> кол-во колонок с извратом 9-10 байты
FS.Write(buffer, 0, buffer.Length);
string[] FieldName = new string[DT.Columns.Count]; // Массив названий полей
string[] FieldType = new string[DT.Columns.Count]; // Массив типов полей
byte[] FieldSize = new byte[DT.Columns.Count]; // Массив размеров полей
byte[] FieldDigs = new byte[DT.Columns.Count]; // Массив размеров дробной части
int s = 1; // Считаю длину заголовка
foreach (DataColumn C in DT.Columns)
{
string l = C.ColumnName.ToUpper(); // Имя колонки
while (l.Length < 10) {l = l + (char)0;} // Подгоняю по размеру (10 байт)
FieldName[C.Ordinal] = l.Substring(0, 10) + (char)0; // Результат
FieldType[C.Ordinal] = "C"; 
FieldSize[C.Ordinal] = 50;
FieldDigs[C.Ordinal] = 0;
switch (C.DataType.ToString())
{
case "System.String" : 
{
DataRow[] DR = DT.Select("", C.ColumnName+" DESC");
if (DR.Length > 0) 
{
if (DR[0][C].ToString().Trim().Length > 255)
FieldSize[C.Ordinal] = 255;
else
FieldSize[C.Ordinal] = (byte)DR[0][C].ToString().Trim().Length;
}
break;
}
case "System.Boolean" : {FieldType[C.Ordinal] = "L"; FieldSize[C.Ordinal] = 1; break;}
case "System.Byte"   : {FieldType[C.Ordinal] = "N"; FieldSize[C.Ordinal] = 1; break;}
case "System.DateTime" : {FieldType[C.Ordinal] = "D"; FieldSize[C.Ordinal] = 8; break;}
case "System.Decimal" : {FieldType[C.Ordinal] = "N"; FieldSize[C.Ordinal] = 38; FieldDigs[C.Ordinal] = 5; break;}
case "System.Double" : {FieldType[C.Ordinal] = "F"; FieldSize[C.Ordinal] = 38; FieldDigs[C.Ordinal] = 5; break;}
case "System.Int16" : {FieldType[C.Ordinal] = "N"; FieldSize[C.Ordinal] = 6; break;}
case "System.Int32" : {FieldType[C.Ordinal] = "N"; FieldSize[C.Ordinal] = 11; break;}
case "System.Int64" : {FieldType[C.Ordinal] = "N"; FieldSize[C.Ordinal] = 21; break;}
case "System.SByte" : {FieldType[C.Ordinal] = "N"; FieldSize[C.Ordinal] = 6; break;}
case "System.Single" : {FieldType[C.Ordinal] = "F"; FieldSize[C.Ordinal] = 38; FieldDigs[C.Ordinal] = 5; break;}
case "System.UInt16" : {FieldType[C.Ordinal] = "N"; FieldSize[C.Ordinal] = 6; break;}
case "System.UInt32" : {FieldType[C.Ordinal] = "N"; FieldSize[C.Ordinal] = 11; break;}
case "System.UInt64" : {FieldType[C.Ordinal] = "N"; FieldSize[C.Ordinal] = 21; break;}
}
s = s + FieldSize[C.Ordinal];
}
buffer = new byte[]{
(byte)(s % 0x100), 
(byte)(s / 0x100)
}; // Пишу длину заголовка 11-12 байты
FS.Write(buffer, 0, buffer.Length);
for (int j = 0; j < 17; j++) {FS.WriteByte(0x00);} // Пишу всякий хлам — 17 байт
buffer = new byte[]{0x26, 0x00, 0x00}; // И ещё 3 байта
FS.Write(buffer, 0, buffer.Length); // Итого: 32 байта — базовый заголовок DBF
// Заполняю заголовок
foreach (DataColumn C in DT.Columns)
{
buffer = System.Text.Encoding.Default.GetBytes(FieldName[C.Ordinal]); // Название поля
FS.Write(buffer, 0, buffer.Length);
buffer = new byte[]{
System.Text.Encoding.ASCII.GetBytes(FieldType[C.Ordinal])[0],
0x00, 
0x00,
0x00, 
0x00
}; // Размер
FS.Write(buffer, 0, buffer.Length);
buffer = new byte[]{
FieldSize[C.Ordinal],
FieldDigs[C.Ordinal]
}; // Размерность
FS.Write(buffer, 0, buffer.Length);
buffer = new byte[]{0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00}; // 14 нулей
FS.Write(buffer, 0, buffer.Length);
}
FS.WriteByte(0x0D); // Конец описания таблицы
System.Globalization.NumberFormatInfo nfi = new System.Globalization.CultureInfo("en-US", false).NumberFormat;
string Spaces = ""; 
while (Spaces.Length < 255) Spaces = Spaces + " ";
foreach (DataRow R in DT.Rows)
{
FS.WriteByte(0x20); // Пишу данные
foreach (DataColumn C in DT.Columns)
{
string l = R[C].ToString();
if (l != "") // Проверка на NULL
{
switch (FieldType[C.Ordinal])
{
case "L" : 
{
l = bool.Parse(l).ToString();
break;
}
case "N" :
{
l = decimal.Parse(l).ToString(nfi);
break; 
}
case "F" :
{
l = float.Parse(l).ToString(nfi);
break; 
}
case "D" :
{
l = DateTime.Parse(l).ToString("yyyyMMdd");
break;
}
default : l = l.Trim() + Spaces; break;
}
}
else 
{
if (FieldType[C.Ordinal] == "C"
|| FieldType[C.Ordinal] == "D")
l = Spaces;
}
while (l.Length < FieldSize[C.Ordinal]){l = l + (char)0x00;} 
l = l.Substring(0, FieldSize[C.Ordinal]); // Корректирую размер
buffer = System.Text.Encoding.GetEncoding(866).GetBytes(l); // Записываю в кодировке (MS-DOS Russian)
FS.Write(buffer, 0, buffer.Length);
}
}
FS.WriteByte(0x1A); // Конец данных
FS.Close();
}
0
5 / 1 / 1
Регистрация: 15.05.2016
Сообщений: 10
04.06.2016, 11:06 5
Есть такая библиотека - DotNetDBF, https://www.nuget.org/packages/dotnetdbf/
Кардинально упрощает работу с DBF.
1
0 / 0 / 1
Регистрация: 04.11.2014
Сообщений: 13
19.09.2016, 12:29 6
Цитата Сообщение от MasterKolka Посмотреть сообщение
Есть такая библиотека - DotNetDBF, https://www.nuget.org/packages/dotnetdbf/
Кардинально упрощает работу с DBF.
Извините за тупой вопрос,но как им пользоваться? \ подключила в референс, дефинировала.и приехали в инете нигде не нашла примеров, а т.н. "подсказки " не понимаю..
цель- прочитать в датагридвью,внести изменения, сохранить из таблицы в дбф обратно...
0
5 / 1 / 1
Регистрация: 15.05.2016
Сообщений: 10
19.09.2016, 12:48 7
Пример вычитывания из файла в DataTable (myTable).
Тут конечно сделан небольшой костыль, если в dbf поля могут быть в разном порядке. Если формат точно определён, то это можно убрать.
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
private void ImportDBF_Click(object sender, RoutedEventArgs e)
        {
            OpenFileDialog dialog = new OpenFileDialog()
            {
                AddExtension = true,
                DefaultExt = ".dbf",
                Filter = "DBF(*.dbf)|*.dbf"
            };
            bool? result = dialog.ShowDialog();
            if (result == true)
            {
                using (Stream fs = dialog.OpenFile())
                {
                    DBFReader aDbf = new DBFReader(fs)
                    {
                        CharEncoding = Encoding.GetEncoding(1251)
                    };
                    int SKN = -1, TNVED_CODE = -1, NAME = -1, CERTFLAG = -1;
                    for (int i = 0; i < aDbf.Fields.Length; i++)
                    {
                        switch (aDbf.Fields[i].Name)
                        {
                            case "SKN":
                                SKN = i;
                                break;
                            case "TNVED_CODE":
                                TNVED_CODE = i;
                                break;
                            case "NAME":
                                NAME = i;
                                break;
                            case "CERTFLAG":
                                CERTFLAG = i;
                                break;                            
                        }
                    }
 
                    for (int i = 0; i < aDbf.RecordCount; i++)
                    {
                        object[] data = aDbf.NextRecord();
 
                        var tnvedcode = data[TNVED_CODE] as string;
                        var skn = data[SKN] as string;
                        var name = data[NAME] as string;
                        var certflag = data[CERTFLAG] is DBNull ? 0 : Convert.ToInt32(data[CERTFLAG]);
 
                        if (myTable.Select(String.Format("TNVED_CODE='{0}' AND SKN='{1}'", tnvedcode, skn)).Length == 0)
                        {
                            var row = myTable.NewRow();
                            row["ARTICULUS"] = Database.GetNextArticulusFromDataTable(myTable, tnvedcode);
                            row["TNVED_CODE"] = tnvedcode;
                            row["SKN"] = skn;
                            row["NAME"] = name;
                            row["CERT_FLAG"] = certflag;                            
 
                            myTable.Rows.Add(row);
                        }
                    }
                }
                SKNList.ItemsSource = myTable.DefaultView;
            }
        }
Пример сохранения в файл из DataTable (myTable)
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
private void Export_TnvedSknArt_Click(object sender, RoutedEventArgs e)
        {
            SaveFileDialog dialog = new SaveFileDialog()
            {
                AddExtension = true,
                DefaultExt = ".dbf",
                Filter = "DBF(*.dbf)|*.dbf"
            };
            bool? result = dialog.ShowDialog();
            if (result == true)
            {
                using (Stream fs = dialog.OpenFile())
                {
                    var Data = myTable.Select("ARTICULUS IS NOT NULL", "TNVED_CODE ASC")
                                      .Select(itm => new Tuple<string, string, string>(itm["TNVED_CODE"] as string, itm["SKN"] as string, itm["ARTICULUS"] as string))
                                      .Distinct();
 
                    using (var BaseWriter = new DotNetDBF.DBFWriter(fs)
                    {
                        CharEncoding = Encoding.ASCII,
                        Fields = new DBFField[] { new DBFField("TNVED_CODE", NativeDbType.Char, 10), new DBFField("SKN", NativeDbType.Char, 10), new DBFField("ARTICULUS", NativeDbType.Char, 10) }
                    })
                    {
                        foreach (var item in Data)
                        {
                            BaseWriter.WriteRecord(item.Item1, item.Item2, item.Item3);
                        }
                    }
                }
            }
        }

P.S. Исправленная библиотека (исправляет работу с числами с плавающей точкой) - https://1drv.ms/u/s!AqXf1PuM3By4g51Qv26dr_wkcU1oHQ
На GitHub этой библиотеки даже request сделали, но автор, похоже, больше не поддерживает эту библиотеку.
0
0 / 0 / 1
Регистрация: 04.11.2014
Сообщений: 13
21.09.2016, 12:55 8
Цитата Сообщение от MasterKolka Посмотреть сообщение
Тут конечно сделан небольшой костыль
Добрый день , как видимо было понятно я об Ваши костыли поломалась )) я забыла предупредить ,что я чайник...
пошла каким то другим путем,и запнулась...(просто метод дотнетдбф,мне показался каким то сложным и не обычным)

у меня выдает ошибку синтаксиса(вставки записей в дбф), мне кажется там проблема в типе данных,но я не знаю как задать их,изза обилия разных примеров.

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
 private void button1_Click(object sender, EventArgs e)
        {
            string connectionString = @"Provider=VFPOLEDB.1;Data Source=C:\test";
            using (OleDbConnection connection = new OleDbConnection(connectionString))
            using (OleDbCommand command = connection.CreateCommand())
            {
                connection.Open();
                for (int i = 0; i < dataGrid.Rows.Count; i++)
                {
                   OleDbParameter script = new OleDbParameter("script", @"INSERT INTO mzag2 (nakl ,data  ,tiptov ,kol ,sum0  ,pvn ,sum2  )+ VALUES("
                                + dataGrid.Rows[i].Cells["Nakl"].Value+ ", "
                                + dataGrid.Rows[i].Cells["Data"].Value + ", "
                                + dataGrid.Rows[i].Cells["tiptov"].Value.ToString() + ", "
                                + dataGrid.Rows[i].Cells["kol"].Value.ToString() + ", "
                                + dataGrid.Rows[i].Cells["sum0"].Value + ", "
                                 + dataGrid.Rows[i].Cells["pvn"].Value + ", "
                                + dataGrid.Rows[i].Cells["sum2"].Value + ");");
                command.CommandType = CommandType.StoredProcedure;
                command.CommandText = "ExecScript";
                command.Parameters.Add(script);
                command.ExecuteNonQuery();
                connection.Close();
                connection.Dispose();
                }
            }
 
            MessageBox.Show("Table Updated", "Update", MessageBoxButtons.OK, MessageBoxIcon.Information);
            this.Close();
        }
тип данных мне известен,и меняться не будет )
там еще немножно была проблема с кодировками,я ее решила
C#
1
2
3
4
5
foreach (DataRow dr in dataSet.Tables[0].Rows)
                {
                    dr[2] = Encoding.UTF8.GetString((Encoding.Convert(Encoding.GetEncoding("Windows-1257"),
                                          Encoding.UTF8, Encoding.Default.GetBytes(dr["TIPTOV"].ToString()))));
                }
а типы данных
char
date
char (хотя тут должна быть кодировка)
float -4
Миниатюры
Экспортировать данные из DataGridView в БД  dbf  
0
21.09.2016, 12:55
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
21.09.2016, 12:55
Помогаю со студенческими работами здесь

Экспортировать DBF таблицу в SQL server
Добрый день.Есть дбфка.Как ее экспортировать в sql server при помощи SQL server management studio???

Работа с dbf в C# - вывести содержимое dbf в dataGridView
Необходимо вывести содержимое dbf в dataGridView, подскажите как сделать.... Заранее...

Экспортировать весь список из DataGridView в Excel
Всем привет! Необходимо экспортировать весь список из datagridview в эксель (.xlsx). Через...

Экспортировать данные в Word
Добрый день, не могу разобраться с правильным импортом в word. Существует таблица со списком...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

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